去哪儿网正式开源内部使用的消息中间件QMQ
jopen 6年前
<p><a href="/misc/goto?guid=5047997735745504917" title="去哪儿"><img alt="去哪儿网正式开源内部使用的消息中间件QMQ" src="https://simg.open-open.com/show/563c121d29fe6511162574cb49c77d1a.gif" /></a></p> <p>去哪儿网近日宣布开源其内部广泛使用的消息中间件 QMQ 。QMQ 自 2012 年诞生以来在去哪儿网所有业务场景中广泛的应用,包括跟交易息息相关的订单场景; 也包括报价搜索等高吞吐量场景。目前在公司内部日常消息 qps 在 60W 左右,生产上承载将近 4W+ 消息 topic ,消息的端到端延迟可以控制在 10ms 以内。</p> <p>QMQ 主要提供以下特性:</p> <ul> <li> <p>异步实时消息</p> </li> <li> <p>延迟/定时消息</p> </li> <li> <p>基于 Tag 的服务端过滤</p> </li> <li> <p>Consumer 端幂等处理支持</p> </li> <li> <p>Consumer 端 filter</p> </li> <li> <p>死信消息</p> </li> <li> <p>结合 Spring annotation 使用的简单 API</p> </li> <li> <p>提供丰富的监控指标</p> </li> <li> <p>接入 OpenTracing</p> </li> <li> <p>分布式事务(即将开源)</p> </li> <li> <p>消息投递轨迹(即将开源)</p> </li> <li> <p>历史消息的自动备份(即将开源)</p> </li> </ul> <p>架构概览 </p> <p>下图是 QMQ 中各组件及其交互图:</p> <ul> <li> <p>meta server 提供集群管理和集群发现的作用</p> </li> <li> <p>server 提供实时消息服务</p> </li> <li> <p>delay server 提供延时/定时消息服务,延时消息先在 delay server 排队,时间到之后再发送给 server</p> </li> <li> <p>producer 消息生产者</p> </li> <li> <p>consumer 消息消费者</p> </li> </ul> <p style="text-align:center"><img alt="去哪儿网正式开源内部使用的消息中间件QMQ" src="https://simg.open-open.com/show/3a0172eb47e9c1be67e69a1857892e98.png" width="600" height="250" /></p> <p>根据图中的编号描述一下其交互过程</p> <ol> <li> <p>delay server 向 meta server 注册</p> </li> <li> <p>实时 server 向 meta server 注册</p> </li> <li> <p>producer 在发送消息前需要询问 meta server 获取 server list</p> </li> <li> <p>meta server 返回 server list 给 producer (根据 producer 请求的消息类型返回不同的 server list )</p> </li> <li> <p>producer 发送延时/定时消息</p> </li> <li> <p>延时时间已到,delay server 将消息投递给实时 server</p> </li> <li> <p>producer 发送实时消息</p> </li> <li> <p>consumer 需要拉取消息,在拉取之前向 meta server 获取 server list (只会获取实时 server 的 list )</p> </li> <li> <p>meta server 返回 server list 给 consumer</p> </li> <li> <p>consumer 向实时 server 发起 pull 请求</p> </li> <li> <p>实时 server 将消息返回给 consumer</p> </li> </ol> <p>项目首页: <a href="/misc/goto?guid=5047997735877369506">https://github.com/qunarcorp/qmq</a></p> <p> </p>