作者:吴香伟 发表于 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。

最新文章

  1. URAL 1119. Metro(BFS)
  2. 排列的Java递归语言实现
  3. 学习 html5 需要学习的 基本 库
  4. Apache multiple domains setup
  5. [cocos2dx笔记011]使用Cocostudio UI编辑器
  6. [置顶] 如何在Windows 7 64位安装Python,并使用Matplotlib绘图
  7. 常用Git命令大全
  8. Python常用排序算法
  9. 关于COOKIE在本地可以正常写入发布后不能写入浏览器的问题
  10. #020PAT 没整明白的题L1-009 N个数求和 (20 分)
  11. python跨平台注释
  12. CF1137C Museums Tour(Tarjan,强连通分量)
  13. window下php5.5安装redis扩展
  14. UVa 1426 Discrete Square Roots (扩展欧几里德)
  15. 测试中Android与IOS分别关注的点
  16. C# WPF 文件复制,相对路径
  17. Spark分析之TaskScheduler
  18. Python学习-31.Python中集合的一些操作
  19. 5.2 Components — Defining A Component
  20. java反射机制的简单介绍

热门文章

  1. etcd api 接口
  2. phoenix将hdfs数据导入hbase
  3. php开发环境
  4. 深入jQuery中的Callbacks()
  5. mac下开发IOS代码管理
  6. 【转】 C# 小技巧之获取变量名称
  7. C# .csv文件转为Excel格式;Excel格式转换为.csv
  8. calc常用
  9. NetBIOS发包
  10. yum -y upgrade 和 yum -y update 区别