Ceph剖析:消息处理
作者:吴香伟 发表于 2014/10/9
版权声明:可以任意转载,转载时务必以超链接形式标明文章原始出处和作者信息以及版权声明

总体上,Ceph的消息处理框架是发布者订阅者的设计结构。Messenger担当发布者的角色,Dispatcher担当订阅者的角色。Messenger将接收到的消息通知给已注册的Dispatcher,由Dispatcher完成具体的消息处理。
在服务端,SimpleMessenger通过Accepter实例监听端口,接收来自客户端的连接。Accepter接受客户端的连接后,为该连接创建一个Pipe实例。Pipe实例负责具体消息的接收和发送,一个Pipe实例包含一个读线程和一个写线程。读线程读取到消息后,有三种分发消息的方法:
1) 快速分发,直接在Pipe的读线程中处理掉消息。可快速分发的消息在Dispatcher的ms_can_fast_dispatch中注册。
2) 正常分发,将消息放入DispatchQueue,由单独的线程按照消息的优先级从高到低进行分发处理。需要注意的是,属于同个SimpleMessenger实例的Pipe间使用同个DispatchQueue。
3) 延迟分发,为消息随机设置延迟时间,定时时间到时由单独的线程走快速分发或正常分发的流程分发消息。
Pipe的写线程将消息放入out_q队列,按照消息的优先级从高到低发送消息。另外,消息(Message)中携带了seq序列号,Pipe使用in_seq和out_seq记录它接收到和发送出去的消息的序列号。发送消息时,Pipe用out_seq设置消息的序列号;接收消息时,通过比较消息的序列号和in_seq来确定消息是否为旧消息,如果为旧消息则丢弃,否则使用消息的序列号更新in_seq。
Ceph剖析:消息处理的更多相关文章
- Ceph剖析:故障检测
作者:吴香伟 发表于 2014/10/10 版权声明:可以任意转载,转载时务必以超链接形式标明文章原始出处和作者信息以及版权声明 心跳是用于OSD节点间检测对方是否故障的,以便及时发现故障节点进入相应 ...
- Ceph剖析:Paxos算法实现
作者:吴香伟 发表于 2014/10/8 版权声明:可以任意转载,转载时务必以超链接形式标明文章原始出处和作者信息以及版权声明 Recovery阶段 在Leader选举成功后,Leader和Peon都 ...
- Ceph剖析:Leader选举
作者:吴香伟 发表于 2014/09/11 版权声明:可以任意转载,转载时务必以超链接形式标明文章原始出处和作者信息以及版权声明 Paxos算法存在活锁问题.从节点中选出Leader,然后将所有对数据 ...
- Ceph剖析:数据分布之CRUSH算法与一致性Hash
作者:吴香伟 发表于 2014/09/05 版权声明:可以任意转载,转载时务必以超链接形式标明文章原始出处和作者信息以及版权声明 数据分布是分布式存储系统的一个重要部分,数据分布算法至少要考虑以下三个 ...
- Ceph剖析:定时器safetimer的实现
定时器的作用是在指定的时间执行指定的动作.SafeTimer通过multimap数据结构维护定时项,定时项是时间和事件的Pair,定时项在map中按照定时时间从小到大排列.此外,SafeTimer使用 ...
- Ceph剖析:线程池实现
线程池ThreadPool的实现符合生产者-消费者模型,这个模型解除生产者消费者间的耦合关系,生产者可以专注处理制造产品的逻辑而不用关心产品的消费,消费者亦然.当然,生产者消费者之间需要一个连接的纽带 ...
- DuiLib消息处理剖析
本来想自己写写duilib的消息机制来帮助duilib的新手朋友,不过今天发现已经有人写过了,而且写得很不错,把duilib的主干消息机制都说明了,我就直接转载过来了,原地址:http://blog. ...
- .Net WinForm 控件键盘消息处理剖析
在WinForm控件上我们可以看到很多关于键盘消息处理的方法,比如OnKeyDown, OnKeyPress, ProcessCmdKey, ProcessDialogKey,IsInputKey等等 ...
- WinForm 控件键盘消息处理剖析(转)
一直想整理键盘事件的调用顺序,刚好看见园子里的这篇文章,写的不错,就转载了:http://www.cnblogs.com/tedzhao/archive/2010/09/07/1820557.html ...
随机推荐
- VA的自动补全Snippet
开始旅程 如果您想要自定义补全,比如在使用UE4框架时,想输入一个方法的注释模板,可以这么做. 方法1:点击VAssistX -> insert VA Snippet -> Edit VA ...
- springboot一个service内组件的加载顺序
先加载自身构造器,所以在构造器中初始化时若使用需要注入的(即@Autowired注解的)组件相关的方法,则会报null: 然后加载注入的组件即@Autowired 最后加载@PostConstruct ...
- jQuery iframe之间相互调用
,子iframe内调用父类函数方法: window.parent.func(); ,子Iframe中获取父界面的元素: $("#xx", window.parent.documen ...
- sys模块和os模块,利用sys模块生成进度条
sys模块import sysprint(sys.argv)#sys.exit(0) #退出程序,正常退出exit(0)print(sys.version) #获取 ...
- RequireJS基础(二)
上一篇是把整个jQuery库作为一个模块.这篇来写一个自己的模块:选择器. 为演示方便这里仅实现常用的三种选择器id,className,attribute. RequireJS使用define来定义 ...
- ubuntu使用 服务
在这里写了很多篇linux,习惯了在这里写 centos中定时任务命令是crond ubuntu中定时任务命令是cron 这两种linux系统不一样的地方还是挺多的, 既然我目前的专注点是ubuntu ...
- MFC 获取图像的大小
// 获致图像的大小 int CCImageDialog::GetImageSize(CSize& size, CString filename) { CImage image; image. ...
- VC++ 实现文件与应用程序关联
日常工作中,doc文件直接双击后,就能启动word软件,并读取该文档的内容在软件中显示,这都得益于注册表的配置,我们的软件也需要实现这样的功能,该如何写注册表以及写入哪些内容呢?下面的两个函数就能实现 ...
- CCS3.3下执行优化
最近想研究一下CCS下的程序优化,之前也了解一些,现在查阅一下资料,整理一下. 当然优化有很多种,我本次先说的是执行优化方式. 首先打开我们自己的工程.工程文件若显示为黄色的,则表示此文件默认优化选项 ...
- new和alloc的区别
简单来说,new和alloc在功能上基本没有什么区别,都是分配内存,初始化对象. 但是,调用new的话,只能通过默认的init方法来初始化对象,而alloc可以通过其他的初始化方法如:-(instan ...