当前位置: 首页 > news >正文

mq 消息队列 mqtt emqx ActiveMQ RabbitMQ RocketMQ

省流:

十几年前,淘宝的notify,借鉴ActiveMQ。京东的ActiveMQ集群几百台,后面改成JMQ。

Linkedin的kafka,因为是scala,国内很多人不熟。淘宝的人把kafka用java写了一遍,取名metaq,后来再改名RocketMQ。

正文:

总的来说,三大原因,语言、潮流、生态。

MQ这种东西,当你的消息量不大的时候,用啥是没多大区别的。特别是在过去20年里,有些阶段你没多少开源的MQ可选,所以最开始ActiveMQ和RabbitMQ还是很火的。

ActiveMQ、RabbitMQ、Kafka/RocketMQ,包括最近很火的pulsar,都非常有自己的特色,但是中间件这条线上,越早出现的,包袱越大,功能可能更多,比如ActiveMQ发展16年了,有大几百个功能,你能想到的所有消息领域的特性,它全都有,所有消息协议,都支持,搞的太重了。淘宝最早期的notify,就是借鉴ActiveMQ来的。

京东多年使用大规模的ActiveMQ集群10年前就有几百台了,然后发现古老的MQ模型,broker太重,量一大就卡(90%用ActiveMQ,但是有一定规模的数据量,这个问题都搞不好搞),然后慢慢发展了自己的JMQ。当年大家消息吞吐量都不大的时候,RabbitMQ就是神器,吞吐高出ActiveMQ几倍。但是慢慢大家发现,真有什么问题,团队没有erlang高手的话,没任何办法。比如说,一天几个亿、几十亿的消息,RabbitMQ一卡住,上下游所有交易订单处理,全都蹦掉了。

这个时候,linkedin搞出来了kafka天然支持消息堆积。然后很快twitter之类的公司快速跟上,在传输消息量非常大的几个领域,大数据的数据传输,日志和监控数据收集,等领域就称霸了。这个几年的代差,让大家不在一个起跑线上。紧接着淘宝尝试用kafka效果不错,但是搞不定scala,然后像从ActiveMQ发展出来了notify一样,基本上用java把kafka翻译了一遍,有了metaq,然后再逐渐出来了RocketMQ,发展了很多年,跟Kafka有一些小的差异,本质上还是那一套。

特别是最近这5-6年,随着整个互联网数据量的进一步增大,kafka/rocketmq在越来越丰富的场景下证明了分布式+支持堆积消息的优越性。大家积累了大量的经验和应用场景,然后发现日常做业务也可以放心大胆用mq处理了。

最后kafka和RocketMQ本身社区活跃,工具体系丰富,发展的很快(ActiveMQ中间尝试6.x版本浪费了很多年,最近两年跟hornetq合并才有新的发展方向。RabbitMQ中间也错失了一些机会。特别是RabbitMQ属于pivotal,spring品牌所在的公司,有个erlang的产品,跟其他的东西相比,蛮奇怪的,也许这也有些原因)。

总而言之,现在技术发展太快了,越是后起之秀,越能站上前辈的肩膀上,实现弯道超车。Kafka/RocketMQ,首先是基于JVM和Java,其次就是赶上了数据量爆发的快车道,最后是体系工具非常丰富,所以目前基本上占山为王(时至今日,几乎可以说,rpc和mq是分布式大厦门口最基础的两块砖)。

Kafka在stream流处理的道路上越走越远,下一波大的技术浪潮也许还能赶上。

个人非常看好pulsar,在kafka的基础上,进一步的分离计算和存储计算存储分离是下一代基础软件的大趋势),国内很多人在负责和参与这个新的MQ项目。

对了,前面提到的所有MQ,只有RabbitMQ是pivotal的,其他的都属于Apache开源基金会。

2021-04-08 https://www.zhihu.com/question/449611434/answer/1824707689

至于用不用erlang开发,只不过正巧emq和rabbitmq都是用erlang开发的,但是这个跟你准备用啥语言开发一点关系都没有。你的程序接收到MQTT消息后,就可以作为消息中间件的producer转发给消息中间件,消息中间件你可以选RabbitMQ,也可以选ActiveMQ,kafka等。这个消息中间件的作用是解耦消息解析和消息分发处理的业务逻辑,让其他应用作为消息中间件的consumer可以去订阅消费它所需的消息。

MQTT是IBM制定的物联网通信协议。可以先读下3.1.1版本MQTT协议标准文档,有中文版。emq是华为出来的人开发的遵循MQTT等协议的MQTT broker。官网有详细使用文档。有开源版本和收费的企业版。RabbitMQ不能称之为中间件,更准确的说法是AMQP(Advanced Message Queue 高级消息队列协议)协议的一种broker实现

https://www.zhihu.com/question/326354272/answer/698693509

相关文章:

mq 消息队列 mqtt emqx ActiveMQ RabbitMQ RocketMQ

省流: 十几年前,淘宝的notify,借鉴ActiveMQ。京东的ActiveMQ集群几百台,后面改成JMQ。 Linkedin的kafka,因为是scala,国内很多人不熟。淘宝的人把kafka用java写了一遍,取名metaq,后…...

沃尔玛卖家必看!解决订单被Kan、Feng号问题的终极方案!

近期有很多沃尔玛卖家和工作室联系到我提到说在沃尔玛平台上下单,买家号出现副款义常订单被k掉,是什么原因、我们该如何去解决呢? 以下是一些可能导至你的测评订单被k单的原因: 1.技术问题:有时,网站或系…...

浅谈日常使用的 Docker 底层原理-三大底座

适合的读者,对Docker有过简单了解的朋友,想要进一步了解Docker容器的朋友。 前言 回想我这两年,一直都是在使用 Docker,看过的视频、拜读过的博客,大都是在介绍 Docker 的由来、使用、优点和发展趋势,但对…...

前端面试:【DOM】编织网页的魔法

嘿,亲爱的代码魔法师!在JavaScript的奇幻世界里,有一项强大的技能,那就是DOM操作。DOM(文档对象模型)操作允许你选择、修改和创建网页元素,就像是在编织一个魔法的网页。 1. 什么是DOM&#xff…...

基于MATLAB开发AUTOSAR软件应用层Code mapping专题-part 2 Inport和Outports 标签页介绍

上篇我们介绍了Function页的内容,这篇我们介绍Inports和Outports页的内容,这里我们再次强调一个概念,code mapping是以simulink的角度去看的,就是先要在模型中建立simulink模块,在code mapping里映射他要对应的autosar的元素,之后生成代码时的c语言的名字是以Autosar的元…...

第9步---MySQL的索引和存储引擎

第9步---MySQL的索引和存储引擎 1.索引 1.1分类 索引可以快速的找出具有特定值的行。不用从头开始进行寻找了。 类别 hash和btree hash 根据字段值生生成一个hash的值 快速的进行定位到对应的行的值 可能会出现相同的值,找到对应的空间会出现对应的值 btree树…...

Numpy入门(3)—线性代数

线性代数 线性代数(如矩阵乘法、矩阵分解、行列式以及其他方阵数学等)是任何数组库的重要组成部分,NumPy中实现了线性代数中常用的各种操作,并形成了numpy.linalg线性代数相关的模块。本节主要介绍如下函数: diag&am…...

php的openssl_encrypt是不是自动做了PKCS5Padding?

在PHP中,openssl_encrypt函数默认使用的是PKCS7填充(不是PKCS5填充)。PKCS7填充实际上是PKCS5填充的扩展,用于对不同块大小的数据进行填充。 当你使用openssl_encrypt函数进行加密时,如果你没有显式指定填充模式和填充…...

在本地创建repository及上传至github

文章目录 本地管理设定git的用户名与邮箱初始化添加修改提交修改设定分支问题一:error: insufficient permission for adding an object... 数据同步创建SSH keys创建并关联远程仓库上传改动至github问题二:Failed to connect to github.com port 443: Connection timed out问题…...

情人节特别定制:多种语言编写动态爱心网页(附完整代码)

写在前面案例1:HTML Three.js库案例2:HTML CSS JavaScript案例3:Python环境 Flask框架结语 写在前面 随着七夕节的临近,许多人都在寻找独特而令人难忘的方式来表达爱意。在这个数字时代,结合创意和技术&#xff0…...

Docker mysql主从同步安装

1. 构建master实例 docker run -p 3307:3306 --name mysql-master \ -v /mydata/mysql-master/log:/var/log/mysql \ -v /mydata/mysql-master/data:/var/lib/mysql \ -v /mydata/mysql-master/conf:/etc/mysql \ -e MYSQL_ROOT_PASSWORDroot \ -d mysql:5.7 2. 构建master配置…...

docker update 命令

docker update 更新一个或多个容器的配置。官方文档 用法 $ docker update [OPTIONS] CONTAINER [CONTAINER...]请参阅选项部分OPTIONS,了解此命令可用的概述。 描述 该docker update命令动态更新容器配置。您可以使用此命令来防止容器消耗 Docker 主机的过多资…...

阻塞和挂起的区别和联系

阻塞和挂起是进程两种不同的状态,其描述如下: 阻塞:正在执行的进程由于发生某时间(如I/O请求、申请缓冲区失败等)暂时无法继续执行。此时引起进程调度,OS把处理机分配给另一个就绪进程,而让受阻…...

水力发电厂测量装置配置选型及厂用电管理系统

《水力发电厂测量装置配置设计规范》对水电厂的测量装置配置做了详细要求和指导。测量装置是水力发电厂运行监测的重要环节,水电厂的测量主要分为电气量测量和非电量测量。电气测量指使用电的方式对电气实时参数进行测量,包括电流、电压、频率、功率因数…...

【RabbitMQ】RabbitMQ整合SpringBoot案例

文章目录 1、前情提要【RabbitMQ】2、RabbitMQ-SpringBoot案例 -fanout模式2.1 实现架构总览2.2 具体实现2.2.1生产者2.2.1消费者 1、前情提要【RabbitMQ】 【RabbitMQ】消息队列-RabbitMQ篇章 RabbitMQ实现流程 2、RabbitMQ-SpringBoot案例 -fanout模式 2.1 实现架构总览…...

如何在window下cmd窗口执行linux指令?

1.Git:https://git-scm.com/downloads(官网地址) 2.根据自己的实际路径,添加两个环境变量 3.重启电脑...

c++基础系列:字符串、向量和数组

字符串、向量和数组 命名空间的using声明 目前用到的库函数基本上都属于命名空间std;通过using声明(using declaration)实现更简单的途径使用到命名空间中的成员。 标准库类型string string表示可变长的字符序列,必须先包含st…...

docker 05(dockerfile)

一、docker镜像原理 镜像可以复用 二、容器转镜像 将容器保存为镜像[参考] docker commit -a -m 现有容器ID 保存后的名称:版本号 -a :提交的镜像作者; -c :使用Dockerfile指令来创建镜像; -m :提交时的说明文字; -p :…...

PostMan 测试项目是否支持跨域

使用PostMan可以方便快速的进行跨域测试。 只需要在请求头中手动添加一个Origin的标头,声明需要跨域跨到的域(IP:端口)就行,其余参数PostMan会自动生成。添加此标头后,请求会被做为一条跨域的请求来进行处…...

jsp 协同过滤 图书管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 JSP 协同过滤 图书管理系统是一套完善的java web信息管理系统,对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境 为TOMCAT7.0,Myeclipse8.5开发,数据库为My…...

在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module

1、为什么要修改 CONNECT 报文? 多租户隔离:自动为接入设备追加租户前缀,后端按 ClientID 拆分队列。零代码鉴权:将入站用户名替换为 OAuth Access-Token,后端 Broker 统一校验。灰度发布:根据 IP/地理位写…...

工程地质软件市场:发展现状、趋势与策略建议

一、引言 在工程建设领域,准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具,正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...

Frozen-Flask :将 Flask 应用“冻结”为静态文件

Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是:将一个 Flask Web 应用生成成纯静态 HTML 文件,从而可以部署到静态网站托管服务上,如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...

《通信之道——从微积分到 5G》读书总结

第1章 绪 论 1.1 这是一本什么样的书 通信技术,说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号(调制) 把信息从信号中抽取出来&am…...

并发编程 - go版

1.并发编程基础概念 进程和线程 A. 进程是程序在操作系统中的一次执行过程,系统进行资源分配和调度的一个独立单位。B. 线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。C.一个进程可以创建和撤销多个线程;同一个进程中…...

GO协程(Goroutine)问题总结

在使用Go语言来编写代码时,遇到的一些问题总结一下 [参考文档]:https://www.topgoer.com/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B/goroutine.html 1. main()函数默认的Goroutine 场景再现: 今天在看到这个教程的时候,在自己的电…...

关于uniapp展示PDF的解决方案

在 UniApp 的 H5 环境中使用 pdf-vue3 组件可以实现完整的 PDF 预览功能。以下是详细实现步骤和注意事项&#xff1a; 一、安装依赖 安装 pdf-vue3 和 PDF.js 核心库&#xff1a; npm install pdf-vue3 pdfjs-dist二、基本使用示例 <template><view class"con…...

开源项目实战学习之YOLO11:12.6 ultralytics-models-tiny_encoder.py

👉 欢迎关注,了解更多精彩内容 👉 欢迎关注,了解更多精彩内容 👉 欢迎关注,了解更多精彩内容 ultralytics-models-sam 1.sam-modules-tiny_encoder.py2.数据处理流程3.代码架构图(类层次与依赖)blocks.py: 定义模型中的各种模块结构 ,如卷积块、残差块等基础构建…...

Java + Spring Boot + Mybatis 插入数据后,获取自增 id 的方法

在 MyBatis 中使用 useGeneratedKeys"true" 获取新插入记录的自增 ID 值&#xff0c;可通过以下步骤实现&#xff1a; 1. 配置 Mapper XML 在插入语句的 <insert> 标签中设置&#xff1a; xml 复制 下载 运行 <insert id"insertUser" para…...

【学习记录】Office 和 WPS 文档密码破解实战

文章目录 &#x1f4cc; 引言&#x1f4c1; Office 与 WPS 支持的常见文件格式Microsoft Office 格式WPS Office 格式 &#x1f6e0; 所需工具下载地址&#xff08;Windows 官方编译版&#xff09;&#x1f510; 破解流程详解步骤 1&#xff1a;提取文档的加密哈希值步骤 2&…...