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 ...
随机推荐
- 使用 IDEA 创建 Maven Web 项目 (四)- 让 WEB 应用跑起来
在 IDEA 中配置 Tomcat 单击 IDEA 工具栏上的 Edit Configurations... (在一个下拉框中),弹出 Run/Debug Configurations 对话框. 单击 ...
- jdk各版本新特性
只收纳常用的新特性 jdk1.4 1.引入断言 jdk5 1.引入泛型 2.引入枚举Enum 3.可以自动拆装箱 4.引入注解Annotation 5.引入新的迭代方式foreach 6.引入静态导入 ...
- 从ASP.NET Web API 2 (C#)开始说起
[译]Getting Started with ASP.NET Web API 2 (C#) 单击此处查看原文 HTTP不是单单为网页服务的,它更是一种用于构建API(用于暴露服务和数据)的强大平台. ...
- 构建jenkins
一.Jenkins简介: jenkins,之前叫做Hudson,是基于Java开发的一种持续集成工具,用户监控秩序重复的工作,包括: 1>持续的软件版本发布测试项目. 2>监控外部调 ...
- socket 心跳包机制
心跳包的发送,通常有两种技术 方法1:应用层自己实现的心跳包 由应用程序自己发送心跳包来检测连接是否正常,大致的方法是:服务器在一个 Timer事件中定时 向客户端发送一个短小精悍的数据包,然后启动 ...
- Web框架——Django笔记
Web框架--Django笔记 MVC和MTV MVC:Model.View.Controller MTV:Model.Template.View Django--MTV 1.创建Django程序 ...
- dev gridcontrol把event事件转换成命令
可以通过继承gridcontrol的形式来实现 定义DataGridDoubleClickCommand依赖属性 class MyGridControl : GridControl { ...
- Windows下载地址
文件名 cn_windows_7_professional_with_sp1_x64_dvd_u_677031.iso SHA1 9B57E67888434C24DD683968A3CE2C72755 ...
- HTML5学习总结——本地存储
一.HTML4客户端存储 B/S架构的应用大量的信息存储在服务器端,客户端通过请求响应的方式从服务器获得数据,这样集中存储也会给服务器带来相应的压力,有些数据可以直接存储在客户端,传统的Web技术中会 ...
- 使用canvas实现超绚丽的旋转正方形
自己无意中的一个小"bug",却让动画变得超绚丽= = 所以,不要害怕出bug,谁知道bug不会开出一朵绚丽的花呢? <!DOCTYPE html> <html ...