去哪儿网近日在 GitHub 上开源了其内部广泛使用的消息队列 (内部代号 QMQ),QMQ 自2012年诞生以来在去哪儿网所有业务场景中广泛的应用,包括跟交易息息相关的订单场景; 也包括报价搜索等高吞吐量场景。目前在公司内部日常消息 qps 在 60W 左右,生产上承载将近 4W+ 消息 topic ,消息的端到端延迟可以控制在 10ms 以内。
一经开源,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 消息消费者
根据图中的编号描述一下其交互过程:
delay server 向meta server注册
实时server 向meta server注册
producer在发送消息前需要询问meta server获取server list
meta server返回server list给producer(根据producer请求的消息类型返回不同的server list)
producer发送延时/定时消息
延时时间已到,delay server将消息投递给实时server
producer发送实时消息
consumer需要拉取消息,在拉取之前向meta server获取server list(只会获取实时server的list)
meta server返回server list给consumer
consumer向实时server发起pull请求
实时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