500630666_wx.jpg

去哪儿网近日在 GitHub 上开源了其内部广泛使用的消息队列 (内部代号 QMQ),QMQ 自2012年诞生以来在去哪儿网所有业务场景中广泛的应用,包括跟交易息息相关的订单场景; 也包括报价搜索等高吞吐量场景。目前在公司内部日常消息 qps 在 60W 左右,生产上承载将近 4W+ 消息 topic ,消息的端到端延迟可以控制在 10ms 以内。

 

微信图片_20181212144459.jpg

 

一经开源,QMQ在GitHub上已经获得  799 个Star,201 个Fork(项目地址:https://github.com/qunarcorp/qmq


 

QMQ主要提供以下特性:

  • 异步实时消息

  • 延迟/定时消息

  • 基于Tag的服务端过滤

  • Consumer端幂等处理支持

  • Consumer端filter

  • 死信消息

  • 结合Spring annotation使用的简单API

  • 提供丰富的监控指标

  • 接入OpenTracing

  • 分布式事务(即将开源)

  • 消息投递轨迹(即将开源)

  • 历史消息的自动备份(即将开源)

 

 

架构概览


下图是QMQ中各组件及其交互图:

  • meta server提供集群管理和集群发现的作用

  • server 提供实时消息服务

  • delay server 提供延时/定时消息服务,延时消息先在delay server排队,时间到之后再发送给server

  • producer 消息生产者

  • consumer 消息消费者

 

微信图片_20181212144538.jpg


根据图中的编号描述一下其交互过程:

  1. delay server 向meta server注册

  2. 实时server 向meta server注册

  3. producer在发送消息前需要询问meta server获取server list

  4. meta server返回server list给producer(根据producer请求的消息类型返回不同的server list)

  5. producer发送延时/定时消息

  6. 延时时间已到,delay server将消息投递给实时server

  7. producer发送实时消息

  8. consumer需要拉取消息,在拉取之前向meta server获取server list(只会获取实时server的list)

  9. meta server返回server list给consumer

  10. consumer向实时server发起pull请求

  11. 实时server将消息返回给consumer

 

 

快速入门


发送消息


MessageProducerProvider producer = new MessageProducerProvider();
producer.init();

Message message = producer.generateMessage("your subject");
message.setProperty("key""value");
//发送延迟消息
//message.setDelayTime(15, TimeUnit.MINUTES);
producer.sendMessage(message);



消费消息


@QmqConsumer(subject = "your subject", consumerGroup = "group")
public void onMessage(Message message){
    //process your message
    String value = message.getStringProperty("key");
}


消息队列是构建微服务架构很关键的基础设施,QMQ和市面上一些活跃的开源产品进行对比,还是有很大的一个优势,感兴趣的小伙伴们,可以尝试一下呢。


开源最前线(ID:OpenSourceTop) 猿妹整编

综合自:https://github.com/qunarcorp/qmq