push类型消息中间件-消息服务端(三)
1.连接管理
网络架构原来是使用是自己开发的网络框架Gecko,Gecko默认为每个网络连接分配64KB的内存,支持1000个网络连接,就需要大概64MB的内存。后来采用Netty重构了网络服务层。
在Netty4是采用 Reactor Pattern线程模型
- 所谓Reactor Pattern模型是IO multiplexing event loop,Reactor负责处理所有IO事件,同时dispatching各IO事件的handler。
- 在新的模型中,有一个Boss线程池和Woker线程池,boss线程池主要处理socket accept事件,worker线程主要处理socket读写事件
- Boss线程在处理完socket accept请求(实际也只有一个NioEventLoop在处理accept事件)后,向Worker线程池取出一个NioEventLoopIO线程(默认轮询策略)注册刚建立连接的Channel(socket连接),此Channel生命周期内的所有读写事件都由其注册的NioEventLoopIO线程负责。
2.存储管理
数据库存储
支持异步和同步的数据库消息记录创建和更新,时序图如下

文件存储
存储分为物理分区和逻辑分区,物理分区存储数据,逻辑分区存储各个消费者需要的消息的索引,文件以DirectByteBuffer方式打开,消息顺序存储和顺序消费,性能非常高。
接收和发送数据都采用 FileChannel Transfer的方式进行数据拷贝,减少内核态和用户态的转换,减少gc。
分布式文件的基本结构

3.分组管理

消息存储
到消息时先通过订阅关系知道这条消息有哪些订阅者需要订阅,然后把这条消息的索引对应的订阅分组的逻辑分区里面去,分区的选择采用随机策略。消息存入逻辑分区时需要把消息序列化为通讯层传输的格式,便于使用零拷贝特性。
消息拉取推送
- 系统启动时根据订阅关系获取所有订阅分组的信息和分组对应的分区的信息,然后顺序启动每个订阅分组对应分区的拉取消息的任务,比如订阅组A有5个分区,则会启动5个任务分别的去5个分区里面并行获取消息并投递,每次获取消息的数量支持批量。
- 每个任务获取消息时都需要获取任务锁,投递完消息后需要释放任务锁,保证获取消息
- 任务对每个分区是单线程访问的,避免消息重复投递。
- 任务启动时还需要向任务监控注册,保证由于线程池异常或者其他异常导致任务异常终止时能够自动恢复超时的任务,继续获取消息并投递。
- 订阅关系新增时自动监听并启动新的任务投递新订阅分组的消息,当订阅关系删除时自动停止对应的订阅分组的所有任务。
- 当某个订阅者的分区数增多时自动增加一个该分区的任务获取并投递消息,当分区数减少时需要把减少的分区的消息投递完后才停止该分区的任务并释放相应资源。
push类型消息中间件-消息服务端(三)的更多相关文章
- pull类型消息中间件-消息服务端(三)
部署架构 消息存储 存储结构 MetaQ的存储结构是一种物理队列+逻辑队列的结构.如下图所示: Producer生产消息,根据消息的topic选择topic对应某一个分区,然后发送到这个分区对应的Br ...
- push类型消息中间件-消息订阅者(一)
1.订阅者的声明方式 我们以spring组件化的方式,声明一个消息订阅者,对于消息订阅者关心的主要有: topic: 一级消息类型(又名消息主题).如TRADE 消息类型:二级消息类型,区别同一Top ...
- push类型消息中间件-消息发布者(二)
1.消息发布者声明 我们以spring的方式来声明一个消息发布者: <bean id="operateLogsMessageManager" class="com. ...
- 从零讲解搭建一个NIO消息服务端
本文首发于本博客,如需转载,请申明出处. 假设 假设你已经了解并实现过了一些OIO消息服务端,并对异步消息服务端更有兴趣,那么本文或许能带你更好的入门,并了解JDK部分源码的关系流程,正如题目所说,笔 ...
- .net平台 基于 XMPP协议的即时消息服务端简单实现
.net平台 基于 XMPP协议的即时消息服务端简单实现 昨天抽空学习了一下XMPP,在网上找了好久,中文的资料太少了所以做这个简单的例子,今天才完成.公司也正在准备开发基于XMPP协议的即时通讯工具 ...
- pull类型消息中间件-消息发布者(一)
消息集群架构 对于发送方来说的关键几要素 topic 消息的主题,由用户定义.类似于知乎的话题,Producer发送消息的时候需要指定发送到某一个topic下面,Consumer从某一个topic下面 ...
- pull类型消息中间件-消息消费者(二)
消费者的实例化 关于consumer的默认实现,metaq有两种: DefaultMQPullConsumer:由业务方主动拉取消息 DefaultMQPushConsumer:通过业务方注册回调方法 ...
- Openstack Ocata 公共服务端(三)
Openstack Ocata 公共服务端 mysql 安装: yum install mariadb mariadb-server mysql 安装过程省略 rabbit-server 安装包: # ...
- js接收对象类型数组的服务端、浏览器端实现
1.服务端 JSONArray jsonArr = JSONUtil.generateObjList(objList); public static generateObjList(List<O ...
随机推荐
- 本地Eclipse连接HDFS进行简单的文件操作
昨天总结了一点自己在搭建Hadoop完全分布式环境过程中遇到的几个小问题以及解决方案,今天在搭建成功的环境中进行了简单的文件操作,包括:文件目录的创建.文件的创建.本地文件的上传.文件的重命名.文件的 ...
- C#开发学习——存储过程
举个例子: 带输入参数的存储过程计算班级中英语和数学不及格的人数 if(exists(select * from sys.objects where name='usp_GetFailCou ...
- openstack-kilo--issue(十二)openstack-keystone和httpd服务同时占用35357和5000
== Keystone service == openstack-keystone: inactive 如上面显示的状态:如果启动了httpd就不能很好的启动openstack-keystone服务, ...
- mysql数据恢复问题
现象 mysql> drop database zabbix; Query OK, 104 rows affected (0.30 sec)mysql> exitBye[root@mysq ...
- angularjs的directive详解
Directive(指令)笔者认为是AngularJ非常强大而有有用的功能之一.它就相当于为我们写了公共的自定义DOM元素或CLASS属性或ATTR属性,并且它不只是单单如此,你还可以在它的基础上来操 ...
- 关于Mac中Clion使用OpenCV
关于Mac中Clion使用OpenCV 目标 Clion能够使用OpenCV 步骤 下载安装cmake,官网下载 下载OpenCV mac/linux版 使用cmake gui编译opencv安装包, ...
- button 自动刷新当前页面
button请始终为按钮规定 type 属性.Internet Explorer 的默认类型是 "button",而其他浏览器中(包括 W3C 规范)的默认值是 "sub ...
- Arch安装KDE5
plasma desktop Install the plasma-meta meta-package or the plasma group. Alternatively, for a more m ...
- c/c++笔试面试经典函数实现
/* strcpy函数实现 拷贝字符串 */ char* Strcpy(char* dst, char* src) { assert(dst != NULL && src != NUL ...
- jquery轻松实现li标签上下滚动的原理
在网站上我们常看到有滚动的文字或者图片,比如消息提醒,新闻列表,等等.那么这些效果是怎么形成的呢?经过查阅,找到一种十分方便的写法,经过改良,得出我自己的终极版滚动效果. 我先写个布局吧 <di ...