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

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

在Github上查看消息队列的时候,那个专栏就透露:

京东已推出自己的消息队列产品 JMQ,并且将很快开源问世!

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

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

首先因为技术栈去哪网排除了 erlang 开发的 RabbitMQ,而 Kafka 以及 Java 版 Kafka 的 MetaQ 在当时还并不成熟和稳定。

而 ActiveMQ 在去哪儿网已经有很多应用在使用了,但是使用过程中并不一帆风顺:宕机,消息丢失,消息堵塞等问题屡见不鲜,而且 ActiveMQ 发展多年,代码也非常复杂,想要完全把控也不容易,所以去哪网决定自己造一个轮子。

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

“去哪儿网” QMQ 消息队列架构图

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

 

QMQ 主要提供以下特性:

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

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

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

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

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

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

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

热门文章

暂无图片
编程学习 ·

Python学习:变量

Python 变量类型 变量存储在内存中的值。这就意味着在创建变量时会在内存中开辟一个空间。 基于变量的数据类型,解释器会分配指定内存,并决定什么数据可以被存储在内存中。 因此,变量可以指定不同的数据类型,这些变量可以存储整数,小数或字符。变量赋值 Python 中的变量赋…
暂无图片
编程学习 ·

718. 最长重复子数组

给两个整数数组 A 和 B ,返回两个数组中公共的、长度最长的子数组的长度。目录1、题目分析2、解题分析3、代码示例 1:输入: A: [1,2,3,2,1] B: [3,2,1,4,7] 输出: 3 解释: 长度最长的公共子数组是 [3, 2, 1]。1、题目分析求两个数组公共的子数组的长度,那么可以用较短的那个…
暂无图片
编程学习 ·

kubectl源码分析之config delete-context

发布一个k8s部署视频:https://edu.csdn.net/course/detail/26967课程内容:各种k8s部署方式。包括minikube部署,kubeadm部署,kubeasz部署,rancher部署,k3s部署。包括开发测试环境部署k8s,和生产环境部署k8s。腾讯课堂连接地址https://ke.qq.com/course/478827?taid=4373…
暂无图片
编程学习 ·

Less 基础

1. 维护CSS的弊端 CSS是一门非程序式语言,没有变量、函数、SCOPE(作用域)等概念。CSS需要书写大量看似没有逻辑的代码,CSS冗余度是比较高的。 不方便维护及扩展,不利于复用。 CSS没有很好的计算能力 非前端开发工程师来讲,往往会因为缺少CSS编写经验而很难写出组织良好且易…
暂无图片
编程学习 ·

linux系统与windows系统的选择

linux系统与windows系统的选择 由 虎扑JR0716707505 发表在虎扑步行街步行街主干道 https://bbs.hupu.com/bxj 我们经常遇到有的用户在租用网站服务器之后,说不知道该选择linux系统还是windows系统,我给出的建议是用户可以根据自己的需求,操作,安全,稳定以及性价比来看,就…
暂无图片
编程学习 ·

使用john软件进行账户弱口令检测实验

使用john软件进行账户弱口令检测实验 前言 在生产环境中,服务器账号的密码能够不被黑客入侵破解是尤为重要的,关系着业务正常运行的安全,所以在创建完账户的密码后,我们需要进行弱口令的检测,排查出是否有容易被破解的密码存在。 本次实验使用的破解密码软件是john-1.8.0版…
暂无图片
编程学习 ·

Android客户端调起地图定位不准,导航路线出现偏差,目的地坐标偏离

前言 APP调起地图导航出现偏差 是什么问题造成的呢 一:可能是模糊定位造成的 二:也有可能 改变了经纬度的数据 解决思路如下 先了解一下调起高德APP的各个参数是什么 百度地图 参数如下:参数名称 描述 是否必选 格式(示例)origin 起点名称或经纬度,或者可同时提供名称和经纬…
暂无图片
编程学习 ·

jar包用ftp协议去获取图片无法成功(IDEA可以成功)

jar包用ftp协议去获取图片无法成功(IDEA可以成功)同样的代码 在同一个服务器上运行,用idea去获取图片 可以成功,但是打成jar包去远程获取图片无法成功,拉回来的图片是0kb 同样的代码 在同一个服务器上运行,用idea去获取图片 可以成功,但是打成jar包去远程获取图片无法成…
暂无图片
编程学习 ·

MySQL数据类型(最大值和最小值--类型定义的值)

MySQL数据类型定义的值:1、整型MySQL数据类型含义(有符号)tinyint(m)1个字节 范围(-128~127)smallint(m)2个字节 范围(-32768~32767)mediumint(m)3个字节 范围(-8388608~8388607)int(m)4个字节 范围(-2147483648~2147483647)bigint(m)8个字节 范围(+-9.22*10的18次方)取…
暂无图片
编程学习 ·

三通道低功耗AS3933/PAN3501低频唤醒芯片125K

三通道低功耗 ASK 接收机 1 、概 述 PAN3501 是一款支持最多三个通道接收的低功耗 ASK 接收机,可用于检测 15kHz-150kHz之间的 LF 载波频率的数据信号并触发唤醒信号。支持检测可编程的 16 位或 32 位曼彻斯特唤醒模式。 …
暂无图片
编程学习 ·

随笔 弹窗 二维码生成及图片下载

一、qrcode-vue模块该模块是用来动态生成二维码的vue模块插件,<qrcode-vue></qrcode-vue>的底层其实是一个<canvas></canvas>标签。要想使用qrcode.vue插件,需要用vue的脚手架安装这个插件安装指令npm install qrcode --save-dev,在这里我举一个例子…
暂无图片
编程学习 ·

Leetcode 349. 两个数组的交集 C++

Leetcode 349. 两个数组的交集 题目 给定两个数组,编写一个函数来计算它们的交集。 测试样例 示例 1: 输入:nums1 = [1,2,2,1], nums2 = [2,2] 输出:[2]示例 2: 输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4] 输出:[9,4]说明:输出结果中的每个元素一定是唯一的。 我们可以…
暂无图片
编程学习 ·

布局优化 include viewstub merge 及源码解析

我只是一个无情的搬运工 布局是我们再开发应用时必不可少的工作,通常情况下,布局并不会成为工作中的难点。但是,当你的应用变得越来越富咱,页面越来越多时,布局上的优化工作就成了性能优化的第一步。因为布局上的优化并不像其他优化方式那么复杂,通过Android Sdk提供的Hi…
暂无图片
编程学习 ·

C++ builder listview 自绘条形图

菜鸟的学习笔记,如果对你有用最好。高手请无视。ListView 要开 Doublebuffervoid __fastcall TForm1::ListView1CustomDrawSubItem(TCustomListView *Sender, TListItem *Item,int SubItem, TCustomDrawState State, bool &DefaultDraw) { DefaultDraw=true; int lef=0; T…
暂无图片
编程学习 ·

appium获取toast

环境准备:appium server 1.7版本 下载地址:https://github.com/appium/appium-desktop/releases/tag/v1.5.0下载appium-desktop-Setup-1.5.0-ia32.exe 并启动服务安装appium-uiautomator2-driver使用npm命令安装,npm如何安装自己百度。 npm install appium-uiautomator2-dri…
暂无图片
编程学习 ·

抽象类和接口复习

1.抽象类1.1抽象类定义在面向对象中,所有的对象都是由类进行描绘实现的,但是并不是所有的类都是用来描绘对象的,当一个类中没有包含足够的信息描绘一个具体的对象。我们把这种类定义为一个抽象类。1.2抽象类的特征(1)不能用来实例化对象,通过被继承来使用。(2)一个类只…
暂无图片
编程学习 ·

公司开发规范 - 【管理岗的第二年】

由于阿里的规范太长了 本文就不赘述阿里大佬了,只是用于我带的团队书写代码严格遵循驼峰命名规范每个方法类【不包含工具类、抽象类、实体类】行数不能超过200行,可以拆解到多个类(DataOperatorService,DataLogService等)每个方法有效逻辑行数【不包含注释、静态、属性字段…
暂无图片
编程学习 ·

外卖下沉趋势明显.,2020年的创业机遇来了

近几年来,随着互联网用户数量的不断上升,在2020年,中国的互联网用户数已经达到了10.8亿,人们越来越趋向于使用线上消费,在网络上购物、买机票、订酒店等,点外卖已经渐渐的成为了人们的一种日常生活方式。以下这张图是2015年至2018年网上订外卖用户规模及增长速度。从此图…