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 ...
随机推荐
- master-slave
Redis的master/slave数据复制方式可以是一主一从或者是一主多从的方式,Redis在master是非阻塞模式,也就是说在slave执行数据同步的时候,master是可以接受客户端的请求的, ...
- 揭秘 typedef四用途与两陷阱[转]
自 http://niehan.blog.techweb.com.cn/archives/325.html typedef用来声明一个别名,typedef后面的语法,是一个声明.本来笔者以为这里不会产 ...
- MYSQL 中 update set from where 问题
MySQL 和 SQLSERVER不一样,update set from 一张表的时候 应该改为 UPDATE TABLE_AA INNER JOIN TABLE_BB ON TABLE_AA.ID ...
- 用java代码把docx转换成pdf文件
import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.nio ...
- python 面向对象和类成员和异常处理
python 面向对象 你把自己想象成一个上帝,你要创造一个星球,首先你要把它揉成一个个球,两个直径就能创造一个球 class star: '''名字(name),赤道直径(equatorial di ...
- XidianOJ 1195 Industry of Orz Pandas
--正文 贪心 排序好慢慢找就好 #include <iostream> #include <cstring> #include <cstdio> #include ...
- C++ 内存的分配方式 (摘选自网络)
在c++中有三种分配内存的方式: 在许多大大公司在面试的时候很可能考到的内容.在这里和大家分享了!1. 静态存储区,是在程序编译时就已经分配好的,在整个运行期间都存在,如全局变量.常量.2. 栈上分配 ...
- [ASP.NET]
public static int iA; protected void Button1_Click(object sender, EventArgs e) { //Label1.Text Respo ...
- 自动备份SQL数据库 并删除指定日期之前的备份文件
/// <summary> /// 数据备份 /// </summary> /// public bool DataBackup(st ...
- [ZT]嵌入视频播放器代码
http://www.cnblogs.com/liulanglang/archive/2007/11/29/976638.html 页面插入REAL播放器代码: < id=video1 styl ...