小米消息队列的选型与实践

        之前写了一篇关于消息队列的文章:《消息队列介绍与对比》,本文主要介绍消息队列在实际工作中的使用情况(截止到2023年,因为我2023年离职了,后续的情况不了解了,哈哈)。

        市面上的多种消息队列都有在小米应用,如Notify,Kafka,EMQ,RabbitMQ,Talos,RocketMQ,MQTT等。我们并不是为了使用而使用,主要还是因为部门较多,不同部门业务不同,侧重点不同,因此在选型消息队列时就会根据实际业务需求去选择更合适的消息队列。

        在目前的单位主要还是RabbitMQ,RocketMQ,Kafka主要用于日志采集种。

        本文主要介绍RabbitMQ,RocketMQ,Talos和Notify等等。

1、RabbitMQ的使用

        在小米使用RabbitMQ最典型的场景是邮件中继。在2021年,公司要求所有部门自动发送邮件时不可直连邮件服务器,而是要经过一个邮件中继Guard,其最主要的目的是让Guard做一层治理,比如流量管控,避免大量请求都打到邮件服务器。如果某个大神程序没写好,每个订单都发送一封邮件,一天几十万订单,可是要了命了。Guard内部就使用了RabbitMQ,业务系统将邮件发送到Guard,Guard会将所有邮件作为消息头递到消息队列,随后RabbitMQ负责将消息push到消费者(邮件服务器),在上面有过介绍,push消息的速率完全由broker掌握,我们可以控制Push消息的频率,类似大家经常说的限流,消峰,这就可以有效避免邮件服务器被瞬时大量邮件打垮。

        不过也正是因为这点,经常会出现消息堆积,邮件发不出去的场景。如果某个业务发送了大量邮件,可能会影响到其他业务的邮件发送。如何做到相互不影响,也是Guard团队重点要解决的问题。

          在我目前的单位,RabbitMQ是主推,这主要是领导层决定的,当然我不知道选择RabbitMQ的具体原因,我来得比较晚。我只知道去年发生过的一个问题是,因为Server重启,导致队列丢失,数据丢失,出现事故。这个我在消息队列介绍中已经说过了,RabbitMQ的队列默认是auto-delete的,重启后队列数据就会全部丢失。而且RabbitMQ的限制还包括它是阅后即焚,非常不方便追溯;最重要的是没法实现消费分组,这在实际业务中是非常不方便的。所以,我认为RabbitMQ并不是业务中较好的选择。

2、RocketMQ

        RocketMQ也是这几年才在小米大规模使用的,尤其是电商系统,像有品和小米商城,目前只用RocketMQ作为实际业务的消息队列,日志会用到talos。之前的有品使用过原生的Kafka,也使用过公司自研的Notify。Notify是我个人非常不认同的一个中间件,其内部使用了Mysql和Redis,作为消息队列,非常不成熟,其架构类似如下:

        可以看到,其消息队列依赖于Redis和数据库,实现的性能以及功能都有待商榷。后来它自己也基于RocketMQ了。额,我能直接用RocketMQ,为什么还要用你啊?

        后期经过调研,有品最终都换成了RocketMQ,主要是考虑到RocketMQ的几个特性:

  • 事务写入
  • Key级别顺序消息,可以用订单号作为hashkey
  • 重试 ,支持不同模式的重试(顺序消费时默认无限重试,并发消费可间隔重试16次数)
  • 死信队列 当达到一定消费次数之后,就直接进入死信队列,方便后续手动触发。

小米RocketMQ发展轨迹:

        我们使用的是开源的RocketMQ,众所周知,其只支持固定级别的延迟,为了实现任意时间的延迟,小米云团队参考了DDMQ的经验借助RocksDB和时间轮以插件的形式无侵入地支持了任意时间的延迟。

        此外,针对于Pull模式(RocketMQ 4.x)的缺点,也做了改进。由于RocketMQ要求一个分区只能同时被一个消费者消费(同组),因此当消费者数量大于分区数量时,多出的消费者是不能进行消费的,这无疑是一种浪费。因此针对这点,小米进行了优化。优化如下:

        

        POP模式不会绑定某个实例,弥补了Pull模式的不足,不会出现数据倾斜、消息堆积的问题。实际上,RocketMQ5.X官方已经解决了,官方实现了消费的负载均衡,消息会同时分配给消费者分组中的多个消费者一起分担,功能要比小米基于4.X版本开发的更加强大。具体可看官网:消费者负载均衡

          在我走之前,RocketMQ一直都是小米主推的消息队列,主要还是因为特别适用于我们的业务场景。这也是我自己最喜欢用的消息队列。虽然RocketMQ是基于Kafka思想开发的,但站在巨人的肩膀上并超越它,不是什么坏事。

3、Talos

        Talos是小米自研的一个消息队列,已经比较早了,设计它的初衷是因为当时使用的是Kafka 0.8 版,当时版本的Kafka自身存在很多缺点,比如集群扩容和故障恢复时非常麻烦。

Talos实际上也是参考Kafka进行开发的,其主要变化:

1、将存储和结算相分离。存储采用HDFS,TalosServer只负责调度;

2、采用一致性hash实现负载均衡。

据Talos团队介绍,目前Talos实现了:

  • 日处理消息数超过 2 万亿条,日消息峰值 4 千万条/秒,日处理数据量 1.3PB;
  • Topic 总数 13000+,下游的作业数 15000+,接入业务数量 350+ ;

        其实,Talos还实现了Exactly Once,这是我觉得比较好的一点(当然,新版本的kafka也已经实现了)。基本思想是在生产者生产一个序列号,同样的序列号,使得broker不会再继续处理;在消费端,先查redis缓存,看是否已经处理同样的序列号,如果已处理,就不再继续处理。

        关于Talos这部分,我建议大家看下面参考资料中的小米消息队列的实践,里面详解介绍了talos的由来,架构和特点,非常赞。

参考资料:

千与千寻-浅谈Kafka以及Rocketmq的高性能

万亿级消息背后: 小米消息队列的实践_云计算_勇幸_InfoQ精选文章

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/427539.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

STM32CubeMX实战教程: TIM6、TIM7 - 基本定时器

基本定时器的作用 基本定时器,主要用于实现定时和计数功能。作用包括: 定时功能:可以产生周期性的中断,用于实现定时任务。例如,可以设置一个定时器每隔一定时间(如1秒)产生一次中断&#xff0…

【图像版权】论文阅读:CRMW 图像隐写术+压缩算法

不可见水印 前言背景介绍ai大模型水印生成产物不可见水印CRMW 在保护深度神经网络模型知识产权方面与现有防御机制有何不同?使用图像隐写术和压缩算法为神经网络模型生成水印数据集有哪些优势?特征一致性训练如何发挥作用,将水印数据集嵌入到…

带大家做一个,易上手的水煮牛肉

今天带大家做川菜系中的 水煮牛肉 这个菜是比较费辣椒的 制作成本相对一般菜来说 会高一些 一块牛肉 泡水划冰 从超时买的干腐竹 切成小片 温水浸泡五分钟 泡软它 然后捞出来 去干水分 牛肉切片 尽量切薄一点 三瓣左右蒜 一块生姜 去皮切末 牛肉中下入 一个鸡蛋 小半勺…

【网站项目】136公司项目管理系统

🙊作者简介:拥有多年开发工作经验,分享技术代码帮助学生学习,独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。🌹赠送计算机毕业设计600个选题excel文件,帮助大学选题。赠送开题报告模板&#xff…

大日志精选案例一:南京师范大学教育信息化安全实践

南京师范大学,由江苏省人民政府和中华人民共和国教育部共建,是国家“211工程”重点建设的江苏省属重点大学。在南京师范大学的教育信息化建设过程中,网络安全被视为重中之重。为了保障教学、科研和教务管理等信息化工作的安全进行&#xff0c…

每日一题——LeetCode1576.替换所有的问号

方法一 3个字母原则 把?替换为和他左右都不相等的字符,那么找3个字符abc,?总能替换为abc中的一个字符,遍历字符串找到所有?,再遍历abc把?替换为abc中的一个字符 var modifyString …

产品营销展示型wordpress外贸网站模板

工艺品wordpress外贸主题 简约大气的wordpress外贸主题,适合做工艺品进出品外贸的公司官网使用。 https://www.jianzhanpress.com/?p5377 餐饮设备wordpress外贸主题 简洁的wordpress外贸主题,适合食品机械、餐饮设备公司使用。 https://www.jianzh…

Redis 由浅入深 (7) - 集群操作手册

目录 Redis运维查询命令登录redis集群(登录任意一台即可)查询redis集群信息(登录之后)通过客户端执行命令(redis-cli)查询正则“pattern”所有的key redis 启动和创建的命令Redis 常用命令redis 手动命令设…

2024022701-信息安全(二)——密码学

密码学的基本概念 密码学(Cryptology): 研究信息系统安全保密的科学。 密码编码学(Cryptography): 研究对信息进行编码,实现对信息的隐蔽。 密码分析学(Cryptanalytics) : 研究加密消息的破译或消息的伪造。 消息被称为明文(Plaintext)。 用…

【知识梳理】关于网络分层

转载说明:如果您喜欢这篇文章并打算转载它,请私信作者取得授权。感谢您喜爱本文,请文明转载,谢谢。 网络协议分层 网络协议通常分不同层次进行开发,每一层分别负责不同的通信功能。一个协议族,比如 TCP/IP…

Windows安全中心“管理登录”选项打不开电脑指纹验证失效Windows密码管理时验证个人账号卡住windows休眠后无法验证指纹/密码

目的:本文适用于处理使用:Windows安全中心“管理登录”选项打不开&电脑指纹验证失效&Windows安全中心密码管理时验证个人账号卡住的情况 即下图: 如果发生上述问题,则 按WinR,打开运行窗口,输入se…

java012 - Java集合基础

1、集合基础 1.1 集合概述 引用数据类型包括:类、接口、数组[] 1.2 ArrayList构造和添加方法 代码: 空集合对象:[] add() add(int index,E element): 1.3 ArrayList集合常用方法

亿道信息发布两款升级款全加固笔记本电脑

2022年5月19日,加固手持终端。加固平板电脑、加固笔记本电脑专业设计商和制造商,以及加固型移动计算机软硬件整体定制解决方案提供商亿道信息,宣布对其两款广受欢迎的加固笔记本电脑产品EM-X14U和EM-X15U进行重大升级。新发布的两款升级款全加…

13 丢弃法dropout【李沐动手学深度学习v2笔记】

1. 丢弃法 在层之间加入随机噪音 加入噪音的一些规则 加入噪音后不要改变期望 使用丢弃法 推理中的丢弃法 总结 2. 代码实现 4.6. 暂退法(Dropouthttps://zh.d2l.ai/chapter_multilayer-perceptrons/dropout.html 2.1 Dropout import torch from torch import n…

速度快不拖沓,Frontiers旗下JCR3区SCI,仅3个月13天录用!

录用案例 JCR3区材料类SCI (进展顺) 【期刊简介】IF:3.0-4.0,JCR3区,中科院4区; 【检索情况】SCI在检; 【录用周期】2-3个月左右录用; 【征稿领域】低温环境下新型生物降解材料的开发相关领域均可&…

Qt textBrowser的Html相关

Qt textBrowser的Html相关 Qt textBrowser的Html相关 Qt textBrowser的Html相关 一开始就想要一个简单的功能,点一下按钮,添加的文字居中显示,再点一下按钮,添加的文字变更颜色居右显示。 但是: ui->textEdit-&g…

IM聊天交友APP源码IM带音视频Uniapp即时通讯安卓苹果APP修改二开

前端开发语言:VUE( 安卓,IOS,WEB为一套前端代码) 服务器端开发语言: PHPWebSocket 数据库:MySql mongodb 前端打包工具:Hbuilder 服务器搭建工具:宝塔 Xshell 短信接口: 支持…

Python web框架fastapi数据库操作ORM(二)增删改查逻辑实现方法

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈养成好习惯,先赞后看哦~🎈🎈 所属专栏:Fastapi 景天的主页:景天科技苑 上一章,我们讲到了fastapi数据库操作ORM的配置和查询操作&#xff0…

关于数据提交上传服务端的数据类型以及项目打包上线的流程

1 请求头的类型: content-type; 01: application/json 数据以json格式请求:{"key":"value"} 02: application/x-www.form-urlencoded from表单的数据格式 name"zs"&age12 03 mutipart/form-data…

Linux安装JumpServer并结合内网穿透实现公网访问本地服务

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…