moonmq: 用go实现的高性能message queue
介绍
moonmq是一个用go实现的高性能消息队列系统,后续准备用于我们消息推送服务以及各个后台的异步任务。
在设计上面,moonmq主要借鉴了rabbitmq以及rocketmq相关的思想,但是做了很多减法,毕竟我不是要设计成一个非常通用的mq。
名词解释
- publisher,消息生产者
- consumer,消息消费者
- broker,消息中转站
- queue,消息存储队列
publisher给一个命名的queue发送消息msg,broker负责将msg存放在queue里面。
consumer可以关注自己感兴趣的queue,这样当queue里面有消息的时候,broker就会将该消息推送给该consumer。
推拉模型
在rocketmq里面,支持的是pull msg,而rabbitmq则是支持push和pull msg。moonmq只支持push msg。主要有如下考量:
- 当consumer在线的时候,push是最及时的,因为这时候铁定能把msg push成功。
- 当consumer离线,broker会保存离线消息,当consumer上线之后,broker仍然按照push的方式将离线消息进行推送。
另外,因为moonmq后续会支持我们的消息推送系统,如果采用pull模型,几十万的consumer定期的pull,我有点担心moonmq会吃不消。
消息类型
moonmq将msg分为direct和fanout,fanout就是广播消息,moonmq会将任何订阅了该queue的consumer进行msg push。
如果msg的type为direct,moonmq将会采用轮询的方式,选择一个consumer进行msg push。
消息优先级
moonmq不支持消息优先级,处理起来会很麻烦,而且通常我们并不需要特别精细的优先级控制。
可以通过一个简单的方式实现粗粒度的优先级控制:
- 设置queue1,queue2,queue3三个队列,queue1用来处理保存优先级最高的消息,queue2次之,queue3最低
- publisher发送消息的时候根据优先级发送到指定的queue上面去
- 我们可以有多个consumer处理queue1的消息,譬如3个,然后用2个处理queue2的,1个处理queue1的,这样实现优先级控制。
消息过滤
moonmq通过routing key来进行消息过滤。
publisher在给特定queue发送msg的时候,还可以指定对应的routing key,只有关注了该queue同时也指定了相同的routing key的consumer才会收到该msg。
Ack
moonmq支持ack机制,当push一个msg到consumer的时候,consumer必须回应一个ack,moonmq才认为msg push成功。如果长时间没有ack,则moonmq会重新选择一个consumer再次发送。
ack能够很大程度的保证消息推送的成功率,但是对于消息的快速推送会有影响,所以moonmq也支持no ack模式,这种模式下moonmq只要发送成功了msg,就认为push成功,无需等待ack的回执。
延迟消息
这个现在还没支持,后续是情况而定
定时消息
难度比较大,不会实现
协议
moonmq采用的是类似rocketmq的协议,如下:
|total length(4 bytes)|header length(4 bytes)|header json|body|
total length = 4 + len(header json) + len(body)
header length = len(header json)
在moonmq里面,我们使用Proto来定义协议
type Proto struct {
Method uint32 `json:"method"`
Fields map[string]string `json:"fields"`
Body []byte `json:"-"`
}
moonmq的任何协议,都需要带上method,我们通过method进行实际的消息处理。
moonmq的method参考rabbitmq,有如下几种类型的method:
- 同步request method,客户端在发送request method之后必须等待对应的response method,在等待的过程中也能够处理push,error等异步method。
- 同步response method,对应特定的request method。
- 异步method,发送之后无需等待。
现阶段,moonmq支持如下同步method:
- auth, auth_ok
- publish, publish_o
- bind, bind_ok
- unbind, unbind_ok
同时支持如下异步method:
- push
- error
- heartbeat
- ack
后续
这只是moonmq的一个简单介绍,后续我们会不断完善moonmq,争取也能成为一个不错的mq产品。
moonmq的代码在这里https://github.com/siddontang/moonmq,期待大家的反馈。
moonmq: 用go实现的高性能message queue的更多相关文章
- 为什么要用Message Queue
摘录自博客:http://dataunion.org/9307.html?utm_source=tuicool&utm_medium=referral 为什么要用Message Queue 解 ...
- Message Queue的使用目的
为什么要用Message Queue 摘录自博客:http://dataunion.org/9307.html?utm_source=tuicool&utm_medium=referral ...
- 初识Message Queue之--基础篇
之前我在项目中要用到消息队列相关的技术时,一直让Redis兼职消息队列功能,一个偶然的机会接触到了MSMQ消息队列.秉着技术还是专业的好为原则,对MSMQ进行了学习,以下是我个人的学习笔记. 一.什么 ...
- MSMQ(Microsoft Message Queue)
http://www.cnblogs.com/sk-net/archive/2011/11/25/2232341.html 利用 MSMQ(Microsoft Message Queue),应用程序开 ...
- Message Queue vs. Web Services?
From stackoverflow.com When you use a web service you have a client and a server: If the server fail ...
- hdu 1509 Windows Message Queue
题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=1509 Windows Message Queue Description Message queue ...
- 单线程模型中Message、Handler、Message Queue、Looper之间的关系
1. Android进程 在了解Android线程之前得先了解一下Android的进程.当一个程序第一次启动的时候,Android会启动一个LINUX进程和一个主线程.默认的情况下,所有该程序的组件都 ...
- Top 10 Uses of a Message Queue
Top 10 Uses of a Message QueueAsynchronicity, Work Dispatch, Load Buffering, Database Offloading, an ...
- hdoj 1509 Windows Message Queue【优先队列】
Windows Message Queue Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Ot ...
随机推荐
- linux常用命令随记
常用指令 ls 显示文件或目录 -l 列出文件详细信息l(list) -a 列出当前目录下所有文件及目录,包括隐藏的a(all) mkdir 创建目录 -p 创建目录,若无父目录,则创建p(paren ...
- IntelliJ IDEA 14.0.3 实战搭建Spring+SpringMVC+MyBatis组合框架
简介 Spring+SpringMVC+MyBatis框架(SSM)是比较热门的中小型企业级项目开发的框架,对于新手来说也是比较容易学习入门的.虽说容易,但在框架搭建过程中仍然遇到了许多问题,因此用实 ...
- Memcached在Linux环境下的使用详解
一.引言 写有关NoSQL数据库有关的文章已经有一段时间了,可以高兴的说,Redis暂时就算写完了,从安装到数据类型,在到集群,几乎都写到了.如果以后有了心得,再补充吧.然后就 ...
- 独立游戏《Purgatory Ashes》的经验与总结
1.引子 游戏的灵感萌生于2015年,当时只有一些概念性的设计图. 后来我利用资源商店的素材搭建了最早的原型. 游戏的最终画面: 早期以D.P作为代号进行开发,来源于两个单词的缩写 Devil Pro ...
- block的那些事(从懵懂到使用)
从大学开始自学iOS,在iOS岗位已经两年了,遇到传值等操作,代理和block二选一的话,以前我会毫不犹豫选择代理.久而久之,入职到大公司之后,发现处处是block的天地,才慢慢的了解block并爱上 ...
- jQuery 效果 – 动画
在使用jQuery动画时,你可能想要实现更加丰富的效果,那么你可以通过使用 jQuery animate() 方法自定义动画来达到目的,具体的使用方法如下文所述. jQuery animate() 方 ...
- MongoDB 自动增长
MongoDB 没有像 SQL 一样有自动增长的功能, MongoDB 的 _id 是系统自动生成的12字节唯一标识. 但在某些情况下,我们可能需要实现 ObjectId 自动增长功能. 由于 Mon ...
- Java对象的创建 —— new之后JVM都做了什么?
Java对象创建过程 1. 类加载检查 虚拟机遇到一条new指令时,首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已经被加载.解析和初始化过.如果没 ...
- malloc_stats---检查内存泄露的神器
在之前的博客中提到过,valgrind可以用来检测内存泄露,但在使用中,往往会遇到一些问题,给调试工作带来很多不必要的麻烦,我自己遇到的有以下两种: (1)内存泄露误检(系统初始化时,可能有一些需要长 ...
- 理解性能的奥秘——应用程序中慢,SSMS中快(4)——收集解决参数嗅探问题的信息
本文属于<理解性能的奥秘--应用程序中慢,SSMS中快>系列 接上文:理解性能的奥秘--应用程序中慢,SSMS中快(3)--不总是参数嗅探的错 前面已经提到过关于存储过程在SSMS中运行很 ...