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 ...
随机推荐
- 利刃 MVVMLight 1:MVVMLight介绍以及在项目中的使用
一.MVVM 和 MVVMLight介绍 MVVM是Model-View-ViewModel的简写.类似于目前比较流行的MVC.MVP设计模式,主要目的是为了分离视图(View)和模型(Model)的 ...
- [转载]关于shell脚本的基本语法
关于shell脚本的基本语法 整理于:2014-03-31,何俭飞,mymladdr@sina.com 一.执行 1.shell脚本如果要被执行,一般地必须要有执行权限"x"(除了 ...
- Josephus问题的不同实现方法与总结
/************************************************************************/ /* Josephus问题--数组实现 */ /* ...
- action = "#" 是什么意思 在HTML语言中
action = "#" 是form标签的属性,代表提交数据到本页,如:// 提交数据到a.aspx页面<form action="a.aspx"> ...
- mysql数据恢复问题
现象 mysql> drop database zabbix; Query OK, 104 rows affected (0.30 sec)mysql> exitBye[root@mysq ...
- 一台服务器上同时启动多个 Tomcat
在同一台服务器上启动多个 Tomcat 服务,需要修改 conf/server.xml文件里的三个部分,如下: 1.修改Http访问端口(默认为8080端口) <Connector port=& ...
- 图片,音频资源预加载和文档dom加载
在项目中遇到一个问题,ajax请求音频资源,然后动态的插入到文档中,其中.原生的音频外观实在太丑了,而且每个浏览器的样式都不一样,采取了一个audio插件. 就遇到一个问题,请求后的直接调用插件的话, ...
- [SQL基础教程] 5-1视图
[SQL基础教程] 5-1视图 视图和表 从SQL角度看视图就是一张表 视图与表的差别 表保存了实际的数据,视图保存的是SELECT语句: 视图的优点 节省存储空间: 将常用的Select 语句保存成 ...
- C++引用(&)详解
C++引用详解 引用的概念 引用:就是某一变量(目标)的一个别名,对引用的操作与对变量直接操作完全一样. 引用的声明方法:类型标识符 &引用名=目标变量名: 如下:定义引用ra,它是变量a的引 ...
- c语言编程实例——小球跳动
1.预备知识 1.1 相关头文件 "#include"是c语言中用以申明所需调用的库函数或自定义函数的头文件路径及文件名.#include ""和#includ ...