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
rabbitmq -- networking的更多相关文章
- emqtt 1 (初初初初稿)
第一篇,先简单分析一下整个emqtt 的大致结构,包括两个部分: 1.message packet 类型 2.message 流向 message packet 类型 P1:mqtt_packet 的 ...
- 分享 rabbitMQ入门详解
原文地址http://blog.csdn.net/cugb1004101218/article/details/21243927 目录(?)[-] rabbitMQ说明文档 rabbitMQ是什么 消 ...
- 【RabbitMQ】CentOS安装RabbitMQ,及简单的Java客户端连接
在CentOS安装 因Rabbit MQ使用Erlang,所以需要先安装Erlang,安装过程中可能会遇到种种问题,可参考CentOS 6.5安装Erlang/OTP 17.0.然后就可以安装MQ了. ...
- RabbitMq 集群配置
1. RabbitMQ 所需的附属安装包 1.1 openGL安装 执行命令: [root@localhost local]# yum install mesa-libGL-devel mesa-l ...
- RabbitMQ配置文件
配置文件Config 在Web的可视化管理界面中可以看到一些文件的路径 比如 Config文件的地址 数据库存放的文件夹 log文件的地址 进入到这个文件夹会发现有这些文件,其中example是con ...
- NET下RabbitMQ实践[配置篇]
这个系列目前计划写四篇,分别是配置,示例,WCF发布,实战.当然不排除加餐情况. 介绍: rabbitMQ是一个在AMQP协议标准基础上完整的,可服用的企业消息系统.他遵循Mozilla Publi ...
- openstack私有云布署实践【6 RabbitMQ】
生产环境建议在集群三台controller上做rabbitmq 使用到队列的openstack组件 OpenStack Compute OpenStack Block Storage OpenStac ...
- openstack controller ha测试环境搭建记录(五)——配置rabbitmq集群
配置rabbitmq集群的步骤非常简单,因为其本身含集群功能,参考openstack官网文档:http://docs.openstack.org/ha-guide/controller-ha-rabb ...
- rabbitmq.config配置文件
%% -*- mode: erlang -*-%% -------------------------------------------------------------------------- ...
随机推荐
- 使用Java实现八种基本排序
插入排序.选择排序.冒泡排序.希尔排序.堆排序.快速排序.归并排序.基数排序 import java.util.ArrayList; import java.util.List; /** * 排序算法 ...
- jQuery横向图片手风琴
在线演示 本地下载
- 20145230《java程序设计》 第四次实验报告
20145230实验4 Android开发基础 实验内容 基于Android Studio开发简单的Android应用并部署测试; 了解Android组件.布局管理器的使用: 掌握Android中事件 ...
- 【bzoj1899】[Zjoi2004]Lunch 午餐(贪心+dp)
题目传送门:https://www.lydsy.com/JudgeOnline/problem.php?id=1899 显然为了节省时间,吃饭慢的人要先打饭.于是我们可以先把所有人按吃饭时间排序,于是 ...
- EntityFramework 学习 一 Multiple Diagrams in Entity Framework 5.0
Visual Studio 2012 provides a facility to split the design time visual representation of the Entity ...
- How to use Jenkins
一.关键点 1.how to start the build server? do i need to start some app to do this? I don't believe so... ...
- ZSTU 4241 圣杯战争(线段树+经典)
题意:CS召唤了n个实验怪兽,第i号怪兽在i这个位置出.并把KI召唤出的第i位从者安排在pos(i)处,总共有m位从者. 第i只怪兽有战斗力atk(i), 而i号从者的体力为AP(i).如果从者想要移 ...
- Codeforces Round #200 (Div. 1) BCD
为了锻炼个人能力奋力div1 为了不做原题从200开始 B 两个电线缠在一起了 能不能抓住两头一扯就给扯分开 很明显当len为odd的时候无解 当len为偶数的时候 可以任选一段长度为even的相同字 ...
- JAVA8新特性——接口定义增强
JAVA9都要出来了,JAVA8新特性都没搞清楚,是不是有点掉队哦~ 接口定义增强 在JDK1.8以前,接口是定义的: 接口(英文:Interface),在JAVA编程语言中是一个抽象类型,是抽象方法 ...
- Aix-Linux查看系统信息
1.查看内存.磁盘等使用情况 命令:nmon 输入命令nmon之后,按M键memory,N键NetWork,J键查看目录使用情况. 2.查看防火墙 命令:smit 输入之后按照图形化操作 Commun ...