热衷于造轮子,去哪儿网开源消息中间件 QMQ,京东也搞 JMQ!

JAVA herman 99浏览
公告:“业余草”微信公众号提供免费CSDN下载服务(只下Java资源),关注业余草微信公众号,添加作者微信:xttblog,发送下载链接帮助你免费下载!
本博客日IP超过1800,PV 2600 左右,急需赞助商。
极客时间所有课程通过我的二维码购买后返现24元微信红包,请加博主新的微信号:xttblog,之前的微信号好友位已满,备注:返现
所有面试题(java、前端、数据库、springboot等)一网打尽,请关注文末小程序
视频教程免费领

中国互联网热衷于“造轮子“!

在极客时间上消息队列高手课的时候,那个专栏作者就透露,京东有自己的消息队列产品 JMQ,并且将很快开源问世!

之后,我很少留意过 JMQ 的消息。今天偶然之间,看到去哪儿网也搞了一个消息中间件 QMQ。

根据去哪网的开发团队透露,QMQ 内部已经使用了 6 年。之所以,选择自研 QMQ 是因为当时并没有“优秀且适合去哪网“的 MQ。

首先因为技术栈去哪网排除了 erlang 开发的 RabbitMQ,而 Kafka 以及 Java 版 Kafka 的 MetaQ 在当时还并不成熟和稳定。而 ActiveMQ 在去哪儿网已经有很多应用在使用了,但是使用过程中并不一帆风顺:宕机,消息丢失,消息堵塞等问题屡见不鲜,而且 ActiveMQ 发展多年,代码也非常复杂,想要完全把控也不容易,所以去哪网决定自己造一个轮子。

QMQ 目前在去哪网已进行了大量的使用。包括跟交易息息相关的订单场景;也包括报价搜索等高吞吐量场景。目前在公司内部日常消息 qps 在 60W 左右,生产上承载将近 4W+ 消息 topic ,消息的端到端延迟可以控制在 10ms 以内。

去哪网 QMQ 消息队列架构图

QMQ 主要提供以下特性:

  • 异步实时消息
  • 延迟/定时消息
  • 基于 Tag 的服务端过滤
  • Consumer 端幂等处理支持
  • Consumer 端 filter
  • 死信消息
  • 结合 Spring annotation 使用的简单 API
  • 提供丰富的监控指标
  • 接入 OpenTracing
  • 分布式事务
  • 消息投递轨迹
  • 历史消息的自动备份

看起来这都是一些很好的特性,但是依然被称为重复造轮子。

每个造轮子的团队或程序员都有自己“不得不造”的理由。比如:

  • 以为自己的需求独一无二,现有的库就是在某个点上满足不了
  • 老轮子没有规格说明书,或者接口太复杂,不知道怎么用,搞明白太难
  • 需要在老轮子上添加新功能,然而老轮子代码难读无人可问,不知道何时能弄明白,看不到结果,容易放弃
  • 眼界有限,不知道已有这样的轮子
  • 版权原因无法使用第三方库,比如Google Android实现JVM(Google曾因为一行代码而和Oracle打官司),比如阿里YunOS自己实现JVM
  • 就想锻炼自己,因为造轮子对自己的设计、编码能力有很大好处,对理解业务也有很大好处
  • 自己造轮子,有“控制感”,看得见摸的着,可以一步一步来,一个一个小目标迭代出大目标,不断成功的小激励,会带给自己前行的动力
  • 创新成分多(对自己而言),有成就感
  • 不相信老轮子,譬如老轮子可能有后门、漏洞(想想OpenSSL的心脏出血漏洞)、后期万一要修改没把握等,反正是觉得自己造轮子心里更踏实
  • 不想让自己产品的关键技术掌握在别人手里,也不想让自己的核心用户数据流经别人的系统
  • 别人的轮子不开放,我就是要赶紧造(山寨)一个出来以便获得话语权或商业利益

虽然,被调侃为造轮子,但是造轮子有造轮子的好处,那就是会多招一些程序员。同时,造轮子,挖的坑不好被替换,提升自己的竞争力,被裁员的风险可能就会小一些!

程序员造轮子也有特殊的学习意义,学习别人怎么造,了解内部机理,自己造造看,这也是非常好的锻炼机会。

最后,说一点,QMQ 开源后,可能我们在使用消息队列时就多了一种选择。但是,QMQ 的社区毕竟比较落后一些,遇到问题还真不一定能自己搞定。所以,在前期还是谨慎采用!

业余草公众号

最后,欢迎关注我的个人微信公众号:业余草(yyucao)!可加作者微信号1:xmtxtt(5000人已满),微信号2:codedq(5000人已满),微信号3:xttblog(超2800)。备注:“xttblog”,添加博主微信拉你进微信群。备注错误不会同意好友申请。再次感谢您的关注!后续有精彩内容会第一时间发给您!原创文章投稿请发送至532009913@qq.com邮箱。商务合作也可添加作者微信进行联系!

本文原文出处:业余草: » 热衷于造轮子,去哪儿网开源消息中间件 QMQ,京东也搞 JMQ!