UCMQ

HTTP协议级消息队列服务组件
授权协议 GPLv2
开发语言 C/C++
所属分类 服务器软件、 JMS/消息中间件
软件类型 开源软件
地区 国产
投 递 者 卫弘图
操作系统 Linux
开源组织
适用人群 未知
 软件概览

UCMQ 是一款轻量的HTTP协议级消息队列服务组件,项目的最初原型来自“张宴”的HTTPSQS

基本特性:

  • 支持标准的HTTP协议( GET/POST方法),支持长连接(keep-alive);
  • 请求响应非常快速,入队列、出队列速度超过10000次/秒;
  • 每个UCMQ实例支持多队列,队列通过操作接口自动创建;
  • 单个队列默认限制存储100w未读消息,可以不限制(非必要建议限制);
  • 可以在不停止服务的情况下便捷地修改单个队列的属性(大小限制/只读锁/延时队列/同步频率);
  • 可以实时查看队列属性(入队列数量、出队列数量、未读消息数量、消息积压数量)。
  • 每个队列有独立的数据文件易管理易搬迁。

常见部署:

UCMQ逻辑架构中通常会涉及到三个角色:生产者(producer)/异步消息队列(UCMQ)/消费者(consumer),而三者间都以http协议作为通讯方式,如下图:

逻辑部署图

【UCMQ部署逻辑架构图】

【说明】 在整个部署架构中“生产者”和“消费者”都被视为UCMQ的客户端。“生产者”和“消费者”通过设定的负载均衡机制访问UCMQ服务端。每个客户端(生产 者/消费者)均可注册一个或多个服务端(在客户端配置文件添加每个UCMQ服务端监听地址),如果注册多个则可以“业务容灾”和“负载均衡”。

内部结构: 

MQ内部模块图(主备)

【UCMQ内部结构图】

 【说明】

控制模块:负责UCMQ内部流程的控制;

主从复制模块:将数据变更使用binlog方式同步到备机实现容灾(本版本暂不实现);

http协议处理模块:http处理模块负责http协议的解析和封装;

libevent网络事件驱动模块:负责异步事件的接收和分发;

MQ队列管理模块:管理所有队列的rtag信息和队列使用状态信息;

数据存储模块:负责消息持久化(当前数据文件mmap到缓存,所以持久化由系统 辅助完成),清理垃圾数据文件(一个队列中可有多个文件);负责准确和完整的存/取队列的rtag信息。

存储设计

由于HTTP_SQS项目是基于TC存储数据,众所周知TC的数据文件是从头开始map到缓存的,由于数据量的扩大不能被缓存的数据将很大程度上影 响服务的性能和稳定性。所以UCMQ摒弃了TC,使用日志文件方式存储消息,数据缓存被顺序读取至内存中,且缓存区域随读写指针移动,这样既节省了内存使 用也保证了性能。设计原理如图: 

数据存储模块图

【UCMQ存储设计图】

  • 本文主要收录了UCMQ开源后,各位网友提到的一些共性问题。此外,很多网友对UCMQ抱有更多的期望。在此,统一记录一下,既希望能解决大家的疑问,也希望有支持者与我共同完善大家的好点子。 1. 消息队列简介及应用场景相关 消息队列(Message Queue):将消息按照产生的次序插入队列,而后由其他的处理程序、模块将其从队列中取出,并对消息加以处理,从而形成一个基本的消息队列。使用消息队列可以很好地

  • 先安装libevent,最新版本号 libevent-2.1.11-stable.tar.gz   [root@localhost ~]# ls -al /usr/lib | grep libevent [root@localhost ~]#  yum install libtool -y [root@localhost ~]# wget https://github.com/libevent/l

  •     此文主要记录和整理了UCMQ项目在“高手问答”中大家提到的问题。如有错漏请指正。谢谢! 源博客地址:http://tech.uc.cn/?p=1344 项目地址:https://github.com/ucweb/ucmq 使用指南:http://ucweb.github.io/ucmq_guide/ 消息队列简介及应用场景相关: 消息队列(Message Queue):把消息按照产生的次序

  • ZMQ是什么? 这是个类似于Socket的一系列接口,他跟Socket的区别是:普通的socket是端到端的(1:1的关系),而ZMQ却是可以N:M 的关系,人们对BSD套接字的了解较多的是点对点的连接,点对点连接需要显式地建立连接、销毁连接、选择协议(TCP/UDP)和处理错误等,而ZMQ屏蔽了这些细节,让你的网络编程更为简单。ZMQ用于node与node间的通信,node可以是主机或者是进程。

 相关资料
  • 消息协议 节点之间通过消息来进行交互,所有消息都由下面的数据结构来实现。 message Message { enum Type { UNDEFINED = 0; DISC_HELLO = 1; DISC_DISCONNECT = 2; DISC_GET_PEERS = 3; DISC_PEERS = 4;

  • 本服务条款(以下简称“本协议”)由北京百度网讯科技有限公司(以下简称“百度”)与您(以下简称“您”或“用户”)订立,用于规范您对百度统计(以下简称“本服务”)的使用。只要您点击 “确定”按钮、完成注册程序或开通、使用本服务,即代表您已理解并同意本协议,特别是以黑体字标示出的关于百度统计及您重大权益的条款均以知晓、理解并接受,同意将其作为确定双方权利义务的依据。如果您不同意本协议,请您立即停止使用本

  • 京东小程序开放平台开发者服务协议 【请认真阅读并理解以下内容,其中以加粗方式显著标识的文字,请着重阅读、慎重考虑】 前言 1、本协议由拟在京东小程序开放平台(以下或简称“京东小程序平台”或“小程序平台”)开发京东小程序(以下或简称“小程序”)的京东小程序开发者(以下简称“开发者”,“乙方”或“您”)与京东小程序开放平台运营方(以下或简称“京东”或“甲方”)共同缔结,具有合同效力。 2、本协议由协议

  • 1.1. Rokid 开发者社区服务协议 1.1.1. 一、定义 1.2. 二、协议构成 1.3. 三、特别提示 1.3.1. 四、甲方服务内容 1.3.2. 五、开发者承诺和服务使用规范 1.3.3. 六、数据及隐私 1.3.4. 七、服务费用及开发者收费 1.3.5. 八、违约责任 1.3.6. 九、协议的解除和转让 1.3.7. 十、服务终止后的处理 1.3.8. 十一、责任限制和免责 1.

  • 为了营造规范、有序、安全的开发者社区环境,并利用先进的互联网技术给用户带来便利或更好的体验,芋头科技(杭州)有限公司(下文简称“甲方”)与您(以下简称“开发者”或“乙方”)就开发者社区的使用等相关事项,在杭州市余杭区签订本协议。 特别提示: 开发者通过网络页面点击确认或以其他方式选择接受本协议或使用开发者社区的服务,即表示开发者同意并接受本协议条款,请开发者仔细阅读本协议的全部内容(特别是以粗体标

  • 为了营造规范、有序、安全的开发者社区环境,并利用先进的互联网技术给用户带来便利或更好的体验,芋头科技(杭州)有限公司(下文简称“甲方”)与您(以下简称“开发者”或“乙方”)就开发者社区的使用等相关事项,在杭州市余杭区签订本协议。 特别提示: 开发者通过网络页面点击确认或以其他方式选择接受本协议或使用开发者社区的服务,即表示开发者同意并接受本协议条款,请开发者仔细阅读本协议的全部内容(特别是以粗体标

  • 我有一个windows服务,它侦听Azure服务总线队列消息,以便从我的WebApi应用程序分发处理。此外,我还需要处理重复性任务(每晚/每周),我认为最好使用相同的系统来处理这些任务。 例如,假设我有一个“CleanupDb”队列,每天午夜删除过时的DB节点: 理论上这应该行得通,但我觉得我错过了一个更明显的处理方法。有没有更好的办法?

  • 为什么已经拥有了共享内存时需要消息队列呢? 这将是多种原因,让我们将其分解为多个点来简化 - 据了解,一旦消息被一个进程接收到,它将不再可用于任何其他进程。 而在共享内存中,数据可供多个进程访问。 如果想使用小信息格式进行通信。 当多个进程同时进行通信时,共享内存数据需要同步保护。 使用共享内存的写入和读取频率很高,那么实现功能将会非常复杂。 在这种情况下不值得使用。 如果所有的进程不需要访问共享