【ceph】Ceph 网络模块(4)——SimpleMessenger数据结构及代码流程分析--研读

本文深入分析Ceph的SimpleMessenger数据结构和代码流程,采用发布/订阅设计模式,详细阐述初始化、消息处理过程。当接收到连接请求时,创建Pipe进行消息读写,并通过Dispatcher进行消息处理。尽管存在线程切换性能问题,但Ceph后续版本引入了AsyncMessenger和XioMessenger以优化处理。
摘要由CSDN通过智能技术生成

收发代码流分析:https://blog.51cto.com/wendashuai/2497104

原文:https://blog.csdn.net/zhq5515/article/details/49814941

UML

这里写图片描述

架构上采用 Publish/subscribe(发布/订阅) 的设计模式.

模块说明:


Messenger 
该类作为消息的发布者, 各个 Dispatcher 子类作为消息的订阅者, Messenger 收到消息之后,通过 Pipe 读取消息,然后转给 Dispatcher 处理

SimpleMessenger 
Messenger 接口的实现

Dispatcher 
该类是订阅者的基类,具体的订阅后端继承该类,初始化的时候通过 Messenger::add_dispatcher_tail/head 注册到 Messenger::dispatchers. 收到消息后,通知改类处理

Accepter 
监听 peer 的请求, 有新请求时, 调用 SimpleMessenger::add_accept_pipe() 创建新的 Pipe 到 SimpleMessenger::pipes 来处理该请求

Pipe 
用于消息的读取和发送,该类主要有两个组件,Pipe::Reader 和 Pipe::Writer, 分别用来处理 消息的读取和发送. 这两个类都是 class Thread 的子类,意味这每次处理消息都会有两个 线程被分别创建.

消息被 Pipe::Reader 读取后,该线程会通知注册到 Messenger::dispatchers 中的某一个 Dispatcher(如 Monitor) 处理, 处理完成之后将回复的消息放到 SimpleMessenger::Pipe::out_q 中,供 Pipe::Writer 来处理发送

DispatchQueue 
该类用来缓存收到的消息, 然后唤醒 DispatchQueue::dispatch_thread 线程找到后端的 Dispatch 处理消息

详细解析:


这里写图片描述

下面的代码涉及到的订阅子类以 Monitor 为例:

初始化

int main(int argc, char *argv[])
{
    // 创建一个 Messenger 对象,由于 Messenger 是抽象类,不能直接实例化,提供了一个
    // ::create 的方法来创建子类,目前 Ceph 所有模块使用 SimpleMessenger
    Messenger *messenger = Messenger::create(g_ceph_context,
                                             entity_name_t::MON(rank),
                                             "mon",
                                             0);

    /**
     * 执行 socket() -> bind() -> listen() 等一系列动作, 执行流程如下:
     SimpleMessenger::bind()
         --> Accepter::bind()
             socket() -> bind() -> listen()
    */
    err = messenger->bind(ipaddr);

    // 创建一个 Dispatch 的子类对象, 这里是 Monitor
    mon = new Monitor(g_ceph_context, g_conf->name.get_id(), store, 
                      messenger, &monmap);

    // 启动 Reaper 线程
    messenger->start();

    /**
     * a). 初始化 Monitor 模块
     * b). 通过 SimpleMessenger::add_dispatcher_tail() 注册自己到
     * SimpleMessenger::dispatchers 中, 流程如下:
     * Messenger::add_dispatcher_tail()
     *      --> ready()
     *        --> dispatch_queue.start()(新 DispatchQueue 线程)
         
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值