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 ...
随机推荐
- 怎样清除SWAP里的文件
在vim 编辑一个文件时断了网,文件就留在SWAP里,但我再vim这个文件保存后,再打开时又提示SWAP里有这文件了,此时swapoff -a后再ls -al查看,把文件所在目录里*.swp结尾的文件 ...
- Ueditor1.4.3实现跨域上传到独立文件服务器,完美解决单文件和多文件上传!
再写配置方法之前先吐槽一下网上的各种教程,TM没一个有卵用,一群傻屌不会写就别写,写了就要负责. 百度google搜了半天,全是配置什么document.domain,根域名什么的,我只想对你说: 好 ...
- apache2部署django以及静态文件
django中的runserver只是一个很简单的web服务器,在开发中是不建议使用的,django在官方中建议是使用apache2等web服务器来配置,并且django会把静态文件交由apache2 ...
- websocket+前后端分离+https的nginx配置
后端服务路径: 172.168.0.2:8080 172.168.0.2:7080 前端目录(html + css + js): /root/apps/mzsg-web 1.修改 /etc/nginx ...
- Gpt转mbr
1)Shift + F10 2)diskpart 3)list disk 4)select dist 0 5)clean 6)convert mbr [注]mbr常用于windows操作系统,而gpt ...
- vue+vuex初入门
Vuex Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式.它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化. 解决问题: 传参的方法对于多层嵌 ...
- windows 上搭建 sftp 服务器 --freesshd
Linux 下 sftp 默认都会安装的, Windows 就没有了.网上搜的资料发现比较好用的是 freesshd,免费版中最好用的. 1,下载:http://www.freesshd.com/?c ...
- Linux安装Firefly
1.安装一些必要的东东 yum install -y gcc zlib zlib-devel lrzsz openssl openssl-devel python-devel mysql-devel ...
- WPF Application
Application类作为启动的入口,在VS中,通常自动代码为我们继承了Application类,这样做的有点,我还没有理解到,但是我们先学到这个知识点. 为了能够更好的控制整个启动过程,包括得到A ...
- ubuntu 14.04中文分词 结巴分词
在自然语言处理中,很常见的是要对文本数据进行分词处理.博主是代码小白,目前只是用python作为数据预处理的工具,而按照结巴中文分词的导语:做最好的python中文分词组件“jieba”.因而博主也就 ...