介绍

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的更多相关文章

  1. 为什么要用Message Queue

    摘录自博客:http://dataunion.org/9307.html?utm_source=tuicool&utm_medium=referral 为什么要用Message Queue 解 ...

  2. Message Queue的使用目的

    为什么要用Message Queue   摘录自博客:http://dataunion.org/9307.html?utm_source=tuicool&utm_medium=referral ...

  3. 初识Message Queue之--基础篇

    之前我在项目中要用到消息队列相关的技术时,一直让Redis兼职消息队列功能,一个偶然的机会接触到了MSMQ消息队列.秉着技术还是专业的好为原则,对MSMQ进行了学习,以下是我个人的学习笔记. 一.什么 ...

  4. MSMQ(Microsoft Message Queue)

    http://www.cnblogs.com/sk-net/archive/2011/11/25/2232341.html 利用 MSMQ(Microsoft Message Queue),应用程序开 ...

  5. 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 ...

  6. hdu 1509 Windows Message Queue

    题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=1509 Windows Message Queue Description Message queue ...

  7. 单线程模型中Message、Handler、Message Queue、Looper之间的关系

    1. Android进程 在了解Android线程之前得先了解一下Android的进程.当一个程序第一次启动的时候,Android会启动一个LINUX进程和一个主线程.默认的情况下,所有该程序的组件都 ...

  8. Top 10 Uses of a Message Queue

    Top 10 Uses of a Message QueueAsynchronicity, Work Dispatch, Load Buffering, Database Offloading, an ...

  9. hdoj 1509 Windows Message Queue【优先队列】

    Windows Message Queue Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Ot ...

随机推荐

  1. Mysql锁机制--乐观锁 & 悲观锁

    Mysql 系列文章主页 =============== 从 这篇 文章中,我们知道 Mysql 并发事务会引起更新丢失问题,解决办法是锁.所以本文将对锁(乐观锁.悲观锁)进行分析. 第一部分 悲观锁 ...

  2. AQS简简单单过一遍

    前言 回顾前面: 多线程三分钟就可以入个门了! Thread源码剖析 多线程基础必要知识点!看了学习多线程事半功倍 Java锁机制了解一下 只有光头才能变强! 本来我是打算在这章节中写Lock的子类实 ...

  3. event工具集

    eventTool = { // 页面加载完成后 readyEvent : function(fn) { if (fn==null) { fn=document; } var oldonload = ...

  4. Linux下安装java的jdk和配置环境变量

    每次感觉配这个超级简单 但是每次都要查下 记一下好了 Linux下安装jdk,步骤如下 1:下载jdk包:本章使用的为后缀为tar.gz的文件(不需要安装),如jdk-8u111-linux-x64. ...

  5. textarea不能使用maxlength

    知道文本框有个maxlength属性,有次开发项目中使用了textarea标签,没去看文档,直接加了maxlength属性,且有效果没有报错,喜滋滋的用了,结果没两天就测试出了bug 问题描述:文本域 ...

  6. PHP 表单 - 必需字段

    PHP - 必需字段 在上一章节我们已经介绍了表的验证规则,我们可以看到"Name", "E-mail", 和 "Gender" 字段是必须 ...

  7. Java语言程序设计-助教篇

    1. 给第一次上课(软件工程)的老师与助教 现代软件工程讲义 0 课程概述 给学生:看里面的第0个作业要求 2. 助教心得 美国视界(1):第一流的本科课堂该是什么样?(看里面的助教部分) 助教工作看 ...

  8. 学习TensorFlow,调用预训练好的网络(Alex, VGG, ResNet etc)

    视觉问题引入深度神经网络后,针对端对端的训练和预测网络,可以看是特征的表达和任务的决策问题(分类,回归等).当我们自己的训练数据量过小时,往往借助牛人已经预训练好的网络进行特征的提取,然后在后面加上自 ...

  9. J2EE进阶(十七)Hibernate中常用的HQL查询方法(getHibernateTemplate())

    J2EE进阶(十七)Hibernate中常用的HQL查询方法(getHibernateTemplate())   当我们使用Hibernate进行数据的CRUD操作时,利用模版进行操作不失为一种方法. ...

  10. Android自定义控件及自定义属性

    Android自定义控件及自定义属性 自定义控件 创建自定义控件 自定义一个类,继承View 继承View还是哪个类,取决于你要实现一个什么样的控件 如果你要实现的是一个线性布局的组合控件,就可以继承 ...