`
tyny
  • 浏览: 74607 次
  • 性别: Icon_minigender_1
  • 来自: 黄冈
社区版块
存档分类
最新评论

Rhino.Queues随笔2 网络发送流程

 
阅读更多

从理解的角度看Rhino.Queues来看,功能很齐全,但是有几个小地方还是略显粗糙。从发送服务和接收服务(其实就是一个发送线程和一个异步监听),他们原理是统一的,即有协调器负责实际的发送接收的存储操作和事务处理,但是他们的细节却大相径庭,不过这个可能由于接收操作略微复杂一点。

首先提一下Queue的存储表,他是使用微软的eset数据存储,跟发送和接收有直接关系的表有四个:消息发送表、历史消息发送表;消息接收表、历史消息接收表。

先看一下发送过程,发送服务主要是启动一个线程运行消息发送协调器QueuedMessagesSender的发送函数Send,这个函数的主要作用就是准备协调消息发送的一些操作,最后一切就绪,实例化发送操作Sender,负责实际的网络发送操作,即实际发送数据。

发送协调器的发送操作的细节

1、首先他会判断当前正在发送的操作是否多于5个,如果多于5个,则挂起秒然后重新循环准备发送;
2、从存储协调器获取发送消息队列管理器(SenderActions),然后利用SenderActions从消息发送表批量获取需要发送的消息,重置其状态为正在发送,以免重新发送;反之如果没有需要发送的消息,同上挂起1庙,然后重新循环发送;
3、新建网络发送操作Sender,同时绑定相应的事件,然后开始发送;

在Sender的发送过程中,根据他与接收消息队列的交互,相应的产生相应的状态,这些状态会激发消息发送协调器绑定相应的成功、失败、撤销事件。

● 成功状态:把发送的消息存到历史消息发送表,然后从消息发送表删除;
● 失败状态:把发送的消息在消息发送表重新置为可以发送;
● 撤销操作:撤销操作一般发送在成功之后,所以需要把发送的消息从历史表里面取出来重新存储到消息发送表中,同时其状态可以可以发送,即可以重新发送;

这些操作的实现就是在消息发送协调对象里面。队列管理器(QueueManager)初始化消息发送协调器QueuedMessagesSender)时提供了队列管理器(QueuedMessagesSender)和存储协调器(QueueStorage),所以和发送消息有关的状态信息表基本都可以在发送协调器里面看到。

接着可以讨论一下消息发送的过程于数据存储的简单的交互

● 首先在发送时获取发送消息时,就是通过存储协调器获取发送消息队列管理器获取需要发送的消息;
● 发送成功时,存储发送的消息到历史消息发送表,然后从消息发送表删除发送的消息;
● 发送失败时,修改发送消息表相应发送消息的状态为准备发送;
● 发送撤销时,从历史消息发送表取出发送的消息的数据存储到消息发送表,同时标志位为准备发送;

下图为发送成功的序列图



 

  • 大小: 47.8 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics