注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

mylotustips的博客

IBM Lotus协作产品家族经验分享

 
 
 

日志

 
 
关于我

欢迎大家使用SR向IBM800提交问题http://www.ibm.com/support/servicerequest 可以随时查看问题状态,上传文件

网易考拉推荐

【引用】对Domino Router的粗浅理解  

2011-12-29 11:18:57|  分类: 默认分类 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
     Router是Domino体系架构中重要的一个基础组件,是Domino体系中数据交换的二种方式之一(另一种数据交换方式是Replication,将另文描述个人对之之理解)。
        在Domino中,router实现将Notes文档从一台服务器传输到另一台服务器,或将文档投递到用户的邮箱数据库。它是以独立文件形式存在,存放在 NotesProgram INI参数指定的目录下(如下图所示)。在Windows平台中,文件名为 nRouter.exe,在UNIX或Linux平台中,文件名为 router。
我理解的Domino之一:Router - 苦行僧 - Alex Chens Blog
 
       Router是个协议无关性的任务,同时支持NRPC协议和SMTP协议,可以传输 Notes Rich Text (RTF)格式消息,也可以传输 MultiPurpose Internet Message Extensions (MIME)格式消息,取决于通信对等方服务器支持的消息格式决定的。
       本文无意于与其相关的配置操作的描述,将重点描述其涉及的组件、工作原理。本文中的大部分内容截取自Domino Adminstrator帮助文档,只是将其归纳总结,以及附加个人的理解。观点正确与否,请自行判断,本人概不负责。

1、Router任务涉及组件
        与router工作相关的组件见下表
组件 描述
Router程序 实现Domino系统邮件传输或投递具体功能的程序
MAIL.BOX数据库 文档的临时存储数据库
Domino Directory数据库 Router任务使用到的配置信息存储位置,如收件人寻址等
用户邮箱数据库文件 文档的目的存储空间
Notes.INI文件 控制Router任务行为的配置参数的存储空间
DNS服务器/本机Hosts文件 用以解析目的服务器的地址
SMTP Listener任务 Domino服务器上的SMTP服务器功能的实现
Domino Custer组件 用以实现Router任务功能的失效转移和负载均衡功能
共享邮箱数据库文件 在新版本中已经去除,不做描述。

2、Router的基本工作过程
        当MAIL.BOX中新增一个文档或者编辑某个文档之后,便会出发邮件路由过程的发生。一个邮件路由过程,大致可以经历下面的基本步骤:
        Step1: Router任务初始化。通常发生在Domino服务器启动过程中,或者签发命令 Restart Task Router之后。在此一步骤中,Router任务将Domino Directory数据库和Notes.INI文件中的配置信息,加载到内存,并据此创建路由表、确定最大的Transfer/Delivery传输线程、检查MAIL.BOX数据库的可用性。
       STEP2:当MAIL.BOX数据库中检测到新文档时,Router进程的Main Thread依据文档的信息,确定将此文档放置到Transfer队列还是Local Delivery队列。
       Step3:Transfer或Delivery线程监测其对应处理队列,若队列中存在待处理的信息,则对其进行处理,并对队列中的文档按照处理结果进行文档状态更新。
        Step4:Router进程的Main线程监测传输队列和本地投递队列中的文档状态,并据此状态决定文档是否需要重新传输、或将其从MAIL.BOX数据库中删除,等等。

2.1 Router任务初始化
         加载Router任务程序时,Router进程首先读取Domino Directory目录中的Domino服务器文档信息、Domain文档信息、Connection文档信息、Server Configuration文档信息,并将这些信息加载到内存,据此形成Routing Table、Server Cache、Domain cache、Symbol Table、Rules Cache、MAIL.BOX队列等等。这些数据表中的信息是定期更新的,据帮助文档描述,更新间隔为5分钟。此意味着,任何相关的配置信息的更改,无需重启加载Router任务程序,只需稍等5分钟即可生效(注:在实际的生产环境中,经常会遇到配置更改需要经历较长的时间才能生效的问题,这个问题与Router任务本身无关,通常系Domino服务器本身任务繁忙,使得Domino Directory数据库中相关views的索引更新操作延时执行而导致的)。
       同时,根据Server Configuraion文档或Notes.INI文件中的配置信息,确定Router进程可派生的最大线程数、最大传输线程数、以及最大本地投递线程数。可派生的线程数目,与NSF_Buffer_Pool_Size_MB配置值密切相关的。派生每个新的线程,大约需要32MB的NSFBufferPoolSize内存空间。因而,在调整Router任务最大线程数参数时,需要考虑NSFBuffPoolSize参数的联动更改,特别在分区Domino服务器环境中,更是需要戒慎恐惧。

       接着,Router的主线程使用 DatabaseOpen方法打开本地服务器上的每一个MAIL.BOX数据库,扫描数据库中的新文档,将其加载到Router任务主线程的数据队列中,并依据文档中的信息,分发到 Transfer Queue和Local Delivery Queue。

Note:在Domino Server Console签发Router任务相关的命令时,Console屏幕出现类似 Queue Buffer is Full信息,而命令无法得到执行。出现这种情景的原因,系在于Domino系统可使用的内存空间紧张而无法扩展Main Thread Queue致使的。缺省情况下,MAIL.BOX数据库每来一个新文档,都会加载到 Main Thread Queue中,然后顺序处理。仅当处理完毕,这个文档才会从Main Queue中移除。而Router任务相关的命令,也是放置到这个队列中等待顺序执行的。应对这个情况的应急措施,或是等待,或是重启Router Task。任何其他的操作行为,除了加剧问题严重程度之外,无其他任何效果。如果你负责维护的系统经常出现这样的情况,则需要考虑限制Main Thread Queue长度,亦即控制该队列使用的内存空间的大小,可以通过设置INI参数实现。在物理内存足够的情况下,可以设置较大的NSFBufferPoolSize参数值与加大最大传输与投递线程数。

2.2 邮件路由过程
         Router进程主线程首先检查邮件文档的收件人地址信息,检测其中是否包含 @Domain信息,据此判断文档的目的队列是 Tranfer Queue还是Delivery Queue。
        情况1:收件人地址信息中未包含@Domain    视为收件人与发件人处于同一个Domino Domain中,执行一次收件人名称查询,倘若收件人与发件人位于同一台Domino服务器,则新建一个文档拷贝,将其放置到 Local Delivery Queue中,清除BCC信息,指派一个空闲的 Local Delivery Thread,或是重新派生一个新的线程,对其进行处理。否则,新建一个文档拷贝,放置其到Tranfer Queue。
        情况2:收件人地址信息中包含Notes格式的@Domain    提取@Domain信息,与Domain Cache中的Domian信息进行匹配。若为本地Domain信息匹配,则执行与情况1相同的操作,并从地址信息中去除 @Domain信息;若与任何Adjacent Domain信息匹配,则新建一个文档拷贝,除去BCC信息,修改文档中路由服务器信息域,修改文档的hop域值,放置到 transfer thread queue中,指派一个空闲的transfer Thread,或派生一个新的线程,对其进行处理。
        情况3:收件人地址信息中包含RFC821格式的@Domain    检查local Internet Domain Cache, 若与其中某个值匹配,则认定收件人与发件人处于相同的Domino Domain,则执行与情况1相同的操作,额外的将收件人地址格式转换为 Notes的层次名称;不匹配的话,则新建一个文档拷贝,除去BCC信息,修改文档中路由服务器信息域,修改文档的hop域值,放置到 transfer thread queue中,指派一个空闲的transfer Thread,或派生一个新的线程,对其进行处理。

       在这一步骤中,涉及到是否进行Group Expansion问题。缺省行为是,在新邮件文档加载到 Main Thread Queue之前,将执行组扩展操作,将群组的名称转换为单独的每一个群组成员的地址信息,这是个递归过程。同时,依据收件人地址信息,将其中重复的地址信息移除(这个操作避免了同一个用户位于多个群组时,收到多封相同邮件的问题)。同样的,这个行为时可控制的。

本地邮件文档投递
        当收件人与发件人的邮箱数据库位于同一个Domino服务器时,Router任务的Dispatcher线程对主线程数据队列中的文档新建一个拷贝,将其放置到 local delivery queue 队列中。 当此主线程检测到此一队列存在数据,则指派一个处于空闲状态的 Local Delivery Thread,或是派生一个新的Local Delivery Thread对其进行处理。Local Delivery thread可并发执行,每一个收件人地址分配一个线程,但最大线程数量受Server Configuration文档中Maximum Delivery Thread域的配置值限制,其缺省值为12. 
        接着,Local Delivery Thread打开Domino Directory数据库的 ($Users)视图,执行收件人地址地址查询,建立邮件收件人与其对应的邮箱数据库的对应矩阵,以快速定位每一个收件人的邮箱数据库所在的位置。关于名称查询行为的控制,可在Server Configuration文档中进行配置。
我理解的Domino之一:Router - 苦行僧 - Alex Chens Blog
 
然后打开收件人的邮箱数据库并锁住,检测该数据库是否设置了 “new mail arrived before" 类型的代理程序。若存在,则调用 Agent Manager执行代理。这个行为,可以通过Server Configuration文档中配置项进行控制(见下图图示)。
我理解的Domino之一:Router - 苦行僧 - Alex Chens Blog
 
接下来,将Rules Cache中规则配置信息,传递给 NSF引擎组件执行规则应用。如果本地邮箱数据库中设置了邮件处理规则,则在此时触发执行,对邮件文档执行特定的操作,例如:将其移动到指定的Folder。否则,将文档存放在 Inbox 目录中,并立即对此视图进行视图索引更新。

最后,Delivery Thread修改队列中为文档状态更新为 Complete。同时,Router进程主线程将标识为Complete状态的文档从Delivery Queue中移除,并更新其数据队列中的对应文档,将该收件人从收件人列表中去除。

NRPC邮件传输
        当Router进程Main Thread检测到Transfer Queue中存在文档需要传输,分配一个空闲的 Transfer Thread 或者派生一个新的 Transfer Thread进行邮件文档传输。在初始时,Main Thread为Transfer Queue中的每个目的服务器,指派一个Transfer Thread负责邮件文档传输工作。
        但是,如果源服务器与目的服务器之间存在高速网络连接,且当前已经存在一个双方之间的成功的通信会话,同时在Transfer Queue中存在多个相同目的服务器的待处理文档,则Main Thread则会派生或指派更多的 transfer thread并发进行相同目的服务器之间的邮件传输操作。通常,路由费用(routing cost)为1的源、目的服务器之间,经常会多个Transfer Thread并发执行邮件传输的情况发生。例如:在处于相同Domino Network的服务器之间、不同Domino Network之间,但存在routing cost设置为1的Connection文档存在、以及与外部SMTP服务器之间,均可以实现多线程并发的邮件传输。
        接着,Router进程执行目的服务器的IP地址查询操作。在缺省状态,首先使用查询DNS服务器,若未果则继续查询本机上的hosts配置文件。这个行为时可控制的,配置位置为:server configuration文档。见下图:
我理解的Domino之一:Router - 苦行僧 - Alex Chens Blog
 确定了主机地址之后,则继续进行 最佳路由选择。依据如下的算法:
-- 选择源、目的服务器之间最小的Routing Cost的路径作为最佳邮件传输路径;
--如果再源、目的服务器之间存在多条相同Routing Cost的可选路径,则选择所经历的 hop 数最小的那条,作为最佳邮件传输路劲;
--如果Routing Cost和HOP都一样,则根据下一跳服务器名称的排序,选择包含排序最靠前的那台服务器在内的路径最为最佳邮件传输路径。

接下来,根据目的服务器能接受的邮件消息格式,确定是否进行邮件格式转换。如果对方服务器只可接收MIME消息,则需要在本地服务器上进行 RTF-->MIME消息格式转化。

然后,打开下一跳邮件服务器上MAIL.BOX数据库,将邮件文档写入。

最后,如同Delivery操作一样,标识Transfer Queue中文档状态,触发Main Thread执行对应文档的状态更新操作。

SMTP邮件传输
对于Internet邮件传输,首先也是查询对方主机的地址信息,发起一个RFC821会话,执行消息数据交换。最后,如同Delivery操作一样,标识Transfer Queue中文档状态,触发Main Thread执行对应文档的状态更新操作。

Note:自Domino R5起, Router任务支持 ESMTP。但缺省状态下,ESMTP特性是禁用的,需要人为进行配置更改。配置位置为Server Configuration文档,其中Pipelining extension(Outbound SMTP)特性,建议开启。此将有助于数据传输效率。
我理解的Domino之一:Router - 苦行僧 - Alex Chens Blog
 
消息队列清理
        当一封邮件的全部收件人都已经处理完毕,Router进程主线程将与该文档相关的全部信息从 Main Queue 和 MAIL.BOX queue中清除,最终将该邮件文档从 MAIL.BOX数据库中物理删除掉。
     
2.3  传输/投递失败处理
 
投递失败处理   
           当Router进程主线程查询到Domino Directory目录存在重复的收件人时,该邮件文档时无法投递的。此时,Router主线程生成一个 NDR (Non-Delivery Failure Report)文档,写入MAIL.BOX数据库。Router主线程将其认作一封新的邮件文档,发送给原先文档的发件人的邮箱,同时将原有文档删除。
          如果,出于Quota enforcement策略因素,邮件文档无法写入收件人的邮箱数据库,Router主线程将邮件文档的状态更改为 RETRY,并在一定时间间隔之后,执行文档的投递操作。

传输失败处理   
        传输失败处理方式等同于邮件投递失败处理方式。

失效重发处理   
        当Transfer Thread无法打开远程服务器上的MAIL.BOX数据库,或无法连接远程SMTP服务器,或连接超时,邮件文档状态被标识为 RETRY。遇到种情况时,Router主进程等待上15分钟,然后重试传输;如果依旧失败,Router进程继续等待30分钟,然后再次重试传输;如果第二次重传依旧失败,Router进程会等待45分钟,尝试再次传输。此后,每次的重新传送的等待间隔时间保持在 45 分钟,直至24小时之后成为死信。

3、R8.5对Router性能的改进

在新版本的Domino R8.5中,在Router任务的体系中增加了 二个数据队列,分别为 Mail Event Queue和Mail Message Queue。缺省情况下,邮件文档大小低于10MB的邮件写入MAIL.BOX数据库时,同时在 Mail Meesage Queue中保持一个副本。这样,Router进程不必再对MAIL.BOX数据库进行新文档扫描,直接读取Message Queue内存中的文档数据并投递,从而提升了Router进程的处理效率。关于这个新特性,在Domino Admin帮助数据库中有着更为详细的描述,请自行查阅。


  评论这张
 
阅读(562)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017