来自UC的HTTP协议级消息队列服务组件:UCMQ
UCMQ是一款轻量的HTTP协议级消息队列服务组件,项目的最初原型来自“张宴”的HTTPSQS。
基本特性:
- 支持标准的HTTP协议( GET/POST方法),支持长连接(keep-alive);
- 请求响应非常快速,入队列、出队列速度超过10000次/秒;
- 每个UCMQ实例支持多队列,队列通过操作接口自动创建;
- 单个队列默认限制存储100w未读消息,可以不限制(非必要建议限制);
- 可以在不停止服务的情况下便捷地修改单个队列的属性(大小限制/只读锁/延时队列/同步频率);
- 可以实时查看队列属性(入队列数量、出队列数量、未读消息数量、消息积压数量)。
- 每个队列有独立的数据文件易管理易搬迁。
常见部署:
UCMQ逻辑架构中通常会涉及到三个角色:生产者(producer)/异步消息队列(UCMQ)/消费者(consumer),而三者间都以http协议作为通讯方式,如下图:
【UCMQ部署逻辑架构图】
【说明】 在整个部署架构中“生产者”和“消费者”都被视为UCMQ的客户端。“生产者”和“消费者”通过设定的负载均衡机制访问UCMQ服务端。每个客户端(生产 者/消费者)均可注册一个或多个服务端(在客户端配置文件添加每个UCMQ服务端监听地址),如果注册多个则可以“业务容灾”和“负载均衡”。
内部结构:
【UCMQ内部结构图】
【说明】
控制模块:负责UCMQ内部流程的控制;
主从复制模块:将数据变更使用binlog方式同步到备机实现容灾(本版本暂不实现);
http协议处理模块:http处理模块负责http协议的解析和封装;
libevent网络事件驱动模块:负责异步事件的接收和分发;
MQ队列管理模块:管理所有队列的rtag信息和队列使用状态信息;
数据存储模块:负责消息持久化(当前数据文件mmap到缓存,所以持久化由系统 辅助完成),清理垃圾数据文件(一个队列中可有多个文件);负责准确和完整的存/取队列的rtag信息。
存储设计:
由于HTTP_SQS项目是基于TC存储数据,众所周知TC的数据文件是从头开始map到缓存的,由于数据量的扩大不能被缓存的数据将很大程度上影 响服务的性能和稳定性。所以UCMQ摒弃了TC,使用日志文件方式存储消息,数据缓存被顺序读取至内存中,且缓存区域随读写指针移动,这样既节省了内存使 用也保证了性能。设计原理如图:
【UCMQ存储设计图】