目录
引用:https://blog.csdn.net/zhq5515/article/details/49814941
基础知识
1.src/msg
msg是客户端和服务器间通信的底层模块,用来在客户端和服务器间发送和接收请求。
在src/msg 目录下:首先定义了一个网络通信的框架,完成通信接口和具体实现的分离,子目录Simple,Async,XIO分别是三种不同的实现方式。
simple:每一个网络连接都会创建两个线程,一个负责接收,一个负责发送。
Async模式:使用了基于事件的I/O多路复用模式。是目前网络通信中广泛采用的方式,但是在ceph中,还实验阶段??
XIO:使用了开源的网络通信库accelio来实现。实验阶段??
1.1 相关的类
1.1 .1 message
类Message: src/msg/Message.h Message.cc
是所有消息的基类,任何要发送的消息都要继承该类。数据格式如图所示:
header | user_data | footer |
class Message : public RefCountedObject {
protected:
ceph_msg_header header; // headerelope
ceph_msg_footer footer;
bufferlist payload; // "front" unaligned blob
bufferlist middle; // "middle" unaligned blob
bufferlist data; // data payload (page-alignment will be preserved where possible)
...
};
在消息内容可以分成3个部分
- header
- user data
- footer。
user data 当中可以分成3个部分
- payload
- middle
- data
ceph_msg_header 是消息头,定义了消息传输相关的元数据;
ceph_msg_footer为消息的尾部,附加了一些crc校验数据和消息结束标记。
消息带的数据user data分别保存在payload,middle,data这三个bufferlist中。
payload一般保存ceph操作相关的元数据;
middle目前没有使用到;
data一般为读写的数据。
1.1.2 connection
src/msg/connection.h
是端(port)对端的socket的链接的封装。其最重要的接口是可以发送消息。
1.1.3 messenger
是整个网络抽象模块,(架构上采用 Publish/subscribe(发布/订阅) 的设计模式),定义了网络模块的基本api接口。
该类作为消息的发布者, 各个 Dispatcher 子类作为消息的订阅者。Messenger 收到消息之后,通过 Pipe 读取消息,然后转给 Dispatcher 处理
SimpleMessenger
Messenger 接口的实现
1.1.4 dispatcher
src/msg/dispatcher.h
dispatcher是消息分发的接口。
server端注册dispatcher类用于把接收到的message请求分发给具体处理的应用层;client需要实现一个dispatcher函数用于处理接收到的ACK应对消息。
dispatcher类是订阅者的基类,具体的订阅后端(Monitor, osd等)继承该类,初始化的时候通过 Messenger::add_dispatcher_tail/head 注册到 Messenger::dispatchers,(Messenger?)收到消息后,通知该类处理。(观察者模式?)Monitor, osd等都是继承自dispatcher。
1.1.5 Accepter
监听 peer 的请求, 有新请求时, 调用 SimpleMessenger::add_accept_pipe() 创建新的 Pipe 到 SimpleMessenger::pipes 来处理该请求
1.1.6 Pipe
用于消息的读取和发送,该类主要有两个组件,Pipe::Reader 和 Pipe::Writer, 分别用来处理 消息的读取和发送. 这两个类都是 class Thread 的子类,意味着每次处理消息都会有两个线程被分别创建.
消息被 Pipe::Reader 读取后,该线程会通知 注册到 Messenger::dispatchers 中的某一个 Dispatcher(如 Monitor) 处理, 处理完成之后将回复的消息放到 SimpleMessenger::Pipe::out_q 中,供 Pipe::Writer 来处理发送
1.1.7 DispatchQueue
该类用来缓存收到的消息, 然后唤醒 DispatchQueue::dispatch_thread 线程找到后端的 Dispatch 处理消息。
1.2 详细过程
数据流向/流程分析:https://blog.51cto.com/wendashuai/2497104