zoukankan      html  css  js  c++  java
  • rabbitmq -- networking

    RabbitMQ大名鼎鼎, 其networking 部分经常被众多Erlang 程序员, 爱好者分析. 小的时候就见到很多人写过这方面的blog, 比如:

    1, http://www.blogjava.net/killme2008/archive/2009/11/29/304079.html

    2, http://jzhihui.iteye.com/blog/1544779

    基本上就是很简单明了的结构。

    RabbitMQ networking 监控树结构

    使用observer 来查看RabbitMQ networking 的监控树结构, 大致是这样的:

    其中:

    1, rabbit_net_sup 是整个RabbitMQ的 主supervisor 进程

    2, 进程<0.47.0> 是一个实例的tcp_listener_sup, 因为RabbitMQ 的networking 允许可以同时listen 多个端口, 所以此处的tcp_listener_sup 是匿名进程

    3, 进程<0.49.0> 是一个实例的listen 进程, 负责监听端口,并在tcp_acceptor_sup 监控进程下start_child 执行数量的acceptor 进程

    4, tcp_acceptor_sup_:::19000 是所有acceptor 进程的监控进程

    5, 进程<0.50.0> 是实例的acceptor 进程, 负责异步接收新建立的socket 并执行 OnConnect 函数, 在rabbit_tcp_client_sup 监控进程下创建client 进程

    6, <0.267.0>, <0.268.0>, <0.270.0> 是client 进程, 每个client 进程对应一个socket

        在实际的RabbitMQ 中, client 进程是一个supervisor 进程, 其中包包括一个rabbit_reader 进程和一个 helper 进程

    RabbitMQ networking 代码结构

    为了比较清晰的学习下这部分的代码姿势, 我做了一个简单的代码抽离, 将RabbitMQ 的networking 的代码单独出来一个application. 代码module 大致是这个样子的:

    (哈哈, sublime 要比emacs 轻一些, 不用emacs 后, 我的电脑轻了不少)

    这其中:

    1, file_handle_cache, gen_server2 是辅助性的module

    2, rabbit_net_app 是application的 start, 并boot net

       boot net 的流程主要分为三个部分:

       2.1 将epmd 分配给本node 的端口, 写入mnesia 

       2.2 启动rabbit_tcp_client_sup 并声明其工作子进程

       2.3 启动tcp_listener_sup, tcp_listener_sup 会先后start tcp_acceptor_sup_:::19000 进程和listen 进程, tcp_acceptor_sup_:::19000 进程会声明自己的子工作进程(也就是acceptor 进程), listen 进程会监听端口, 并在tcp_acceptor_sup_:::19000 进程下start_child 指定数量的acceptor 进程

     社区相关

    在社区,有不少人用RabbitMQ的networking 做了一些事情,比如最近和小伙伴讨论比较多的esockd , 大致看来, 作者是以RabbitMQ 的networking 作为蓝本, 在此基础上做了一些代码结构的调整.

    总结

    epmd 可扩展性阅读: http://blog.yufeng.info/archives/539

  • 相关阅读:
    【AtCoder】AtCoder Grand Contest 014 解题报告
    【CF603E】Pastoral Oddities(CDQ分治)
    【洛谷4654】[CEOI2017] Mousetrap(DP+二分)
    【洛谷4800】[CEOI2015 Day2] 核能国度(差分细节题)
    【CF626G】Raffles(贪心)
    【CF578E】Walking!(贪心)
    【AtCoder】AtCoder Grand Contest 015 解题报告
    【CF582E】Boolean Function(动态规划+FWT)
    【CF576E】Painting Edges(线段树分治+并查集)
    【CF576D】Flights for Regular Customers(矩乘套路题)
  • 原文地址:https://www.cnblogs.com/--00/p/rabbitmq_networking.html
Copyright © 2011-2022 走看看