浅谈消息队列之RocketMQ

什么是消息队列?


为什么要用消息队列?

即,应用场景是什么,也就是用了有什么好处

解耦

多应用间通过消息队列对同一消息进行处理,避免调用接口失败导致整个过程失败

异步

多应用对消息队列中同一消息进行处理,应用间并发处理消息,相比串行处理,减少处理时间

削峰/限流

避免流量过大导致应用系统挂掉的情况


使用消息队列需要注意什么?

系统复杂性增加

如何保证消息队列是高可用,即做到集群高可用

如何保证消费的可靠性传输,即不丢消息

如何保证消息不被重复消费,即保证消费的幂等性

如何保证消息的顺序性,即保证数据的逻辑正确性


简单分析RocketMQ的原理

高可用

上架构

NameServer

维持心跳和提供Topic-Broker的关系数据,多个Namesrv之间相互没有通信,单台Namesrv宕机不影响其他Namesrv与集群;即使整个Namesrv集群宕机,已经正常工作的Producer,Consumer,Broker仍然能正常工作,但新起的Producer, Consumer,Broker就无法工作,nameserver不会有频繁的读写,所以性能开销非常小,稳定性很高

Broker

Broker与Namesrv的心跳机制:单个Broker跟所有Namesrv保持心跳请求,心跳间隔为30秒,心跳请求中包括当前Broker所有的Topic信息

高可靠并发读写服务:所有发往broker的消息,有同步刷盘和异步刷盘机制,同步刷盘时,消息写入物理文件才会返回成功,因此非常可靠;异步刷盘时,只有机器宕机,才会产生消息丢失,broker挂掉可能会发生,但是机器宕机崩溃是很少发生的,除非突然断电。

负载均衡:Broker上存Topic信息,Topic由多个队列组成,队列会平均分散在多个Broker上,而Producer的发送机制保证消息尽量平均分布到所有队列中,最终效果就是所有消息都平均落在每个Broker上

高可用:集群部署时一般都为主备,Broker名相同的一组Master/Slave Broker,其中包含一个Master Broker(Broker Id为0)和0~N个Slave Broker(Broker Id不为0),备机实时从主机同步消息,如果其中一个主机宕机,备机提供消费服务,但不提供写服务。

Producer

Producer启动时,也需要指定Namesrv的地址,从Namesrv集群中选一台Master建立长连接,生产者每30秒从Namesrv获取Topic跟Broker的映射关系,更新到本地内存中。再跟Topic涉及的所有Broker建立长连接

生产者发送时,会自动轮询当前所有可发送的broker,一条消息发送成功,下次换另外一个broker发送,以达到消息平均落到所有的broker上。假如某个Broker宕机,意味生产者最长需要30秒才能感知到。在这期间会向宕机的Broker发送消息。当一条消息发送到某个Broker失败后,会往该broker自动再重发2次,假如还是发送失败,则抛出发送失败异常。业务捕获异常,重新发送即可。客户端里会自动轮询另外一个Broker重新发送,这个对于用户是透明的

消息发送方式分为,同步发送,异步发送,单向发送

Consumer

消费者启动时需要指定Namesrv地址,与其中一个Namesrv建立长连接。消费者每隔30秒从nameserver获取所有topic的最新队列情况

Consumer跟Broker是长连接,会每隔30秒发心跳信息到Broker。Broker端每10秒检查一次当前存活的Consumer,若发现某个Consumer 2分钟内没有心跳,就断开与该Consumer的连接,并且向该消费    组的其他实例发送通知,触发该消费者集群的负载均衡。

消费者得到master宕机通知后,转向slave消费(重定向,对于2次开发者透明),但是slave不能保证master的消息100%都同步过来了,因此会有少量的消息丢失。但是消息最终不会丢的,一旦master恢复,未同步过去的消息会被消费掉。

消费分为集群消费和广播消费,


Topic+Queue :

topic的逻辑存储模型:

如果各Master Broker有Slave Broker,Slave Broker中的结构和其对应的Master Broker完全相同。

Topic是逻辑概念,对于RocketMQ,一个Topic可以分布在各个Broker上,把一个Topic分布在一个Broker上的子集定义为一个Topic分片,其实就是在某一broke上一个topic的部分数据

Queue 存在的意义:每个Topic分片等分的Queue的数量可以不同,由用户在创建Topic时指定, 是消费负载均衡过程中资源分配的基本单元.

Topic 的创建过程:

创建topic需要指定的参数,

-b 指定broker上创建topic

-c 指定cluster创建topic

-n 指定namesrv地址,cluster模式下必须从namesrv获取broker地址,支持cluster模式下创建topic和支持broker模式下创建topic

-t topic的名字标志

-r/w 读写队列的个数,建议相等

-o 待研究不确定是不是保证全局有序消息的配置


存储持久化

消息队列的存储选型:

分布式KV存储,文件系统(目前业界较为常用的几款产品RocketMQ/Kafka/RabbitMQ 均采用的是消息刷盘至所部署虚拟机/物理机的文件系统来做持久化,关系性DB(ActiveMQ)

从高可靠,高效率,中间件减少对第三方的依赖考虑, 文件系统>分布式KV存储>关系型数据库DB

存储架构:

对比下Kafka的存储结构:

每个Topic有多个partition(queue),kafka的每个partition都是一个独立的物理文件, 消息直接从里面读写

RocketMQ存储的特点:

1.Broker单个实例下所有的队列共用一个日志数据文件(即为CommitLog)来存储

2.consumerQueue 是个消费的逻辑队列,保存了数据在commit log中的offset

3. 消费读取数据,需要先读取consumerQueue,再读取commit log,消息主体都是通过CommitLog来进行读写.

缺点:

1. 顺序写,随即读

克服缺点:

由于Consume Queue存储数据量极少, 而且是顺序读, 在PAGECACHE预读作用下, Consume Queue的读性能几乎与内存一致, 即使堆积情况下. 所以可认为Consume Queue完全不会阻碍读性能

小结

RocketMQ可以严格的保证消息有序。但这个顺序,不是全局顺序,只是分区(queue)顺序。要全局顺序只能一个分区

RocketMQ不保证消息不重复,如果你的业务需要保证严格的不重复消息,需要你自己在业务端去重

作者:王洪伦
链接:https://www.jianshu.com/p/027accb2b7ae
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

原文地址:https://www.cnblogs.com/eryun/p/12163775.html

时间: 2024-10-08 17:34:56

浅谈消息队列之RocketMQ的相关文章

浅谈消息队列的原理及优势

什么是消息队列这样的场景你一定不陌生:小王到M记点餐之后,服务员给了他一个号牌,并让他在柜台桌子前方等待叫号取餐.每个人都按照自己付款拿到的号牌顺序排队等叫号.即使店里人再多,也不会显得没有秩序.在上述场景中,柜台其实就充当了一个消息队列(Message Queue).小王等生产者把订餐的消息发送到柜台即消息队列里,又从其中取了餐即消费了消息,可以说这就是消息队列的一个完整走向--消息被发送到队列中,又成功被消费者消费."消息队列"是在消息的传输过程中保存消息的容器,队列的主要目的是提

浅谈消息队列及常见的消息中间件

消息队列 已经逐渐成为企业应用系统 内部通信 的核心手段.它具有 低耦合.可靠投递.广播.流量控制.最终一致性 等一系列功能. 当前使用较多的 消息队列 有 RabbitMQ.RocketMQ.ActiveMQ.Kafka.ZeroMQ.MetaMQ 等,而部分 数据库 如 Redis.MySQL 以及 phxsql 也可实现消息队列的功能. 正文 1. 消息队列概述 消息队列 是指利用 高效可靠 的 消息传递机制 进行与平台无关的 数据交流,并基于 数据通信 来进行分布式系统的集成. 通过提供

再谈消息队列技术

上周,我们举办了第二届技术沙龙,我这边主要演讲了消息队列技术的议题,现分享给大家: 在我们团队内部,随着消息应用中心(任务中心)的广泛应用,有时候我们感觉不到消息队列的存在,但这不影响消息队列在高可用.分布式.高并发架构下的核心地位. 消息队列都应用到了哪些实际的应用场景中? 一.再谈消息队列的应用场景 异步处理:例如短信通知.终端状态推送.App推送.用户注册等 数据同步:业务数据推送同步 重试补偿:记账失败重试 系统解耦:通讯上下行.终端异常监控.分布式事件中心 流量消峰:秒杀场景下的下单处

浅谈单调队列、单调栈

       初谈这个话题,相信许多人会有一种似有所悟,但又不敢确定的感觉.没错,这正是因为其中"单调"一词的存在,所谓单调是什么,学过函数的people都知道单调函数或者函数的单调性,直白一点说单调就是一直增或一直减.例如:1,3,5,9就是一个单调增数列,数列中不存在后一个数比前一个数小的现象.那么同样,在这里谈到的话题也有类似特点.        先说一下单调队列吧!      单调队列,就是一个符合单调性质的队列,它同时具有单调的性质以及队列的性质.他在编程中使用频率不高,但却

浅谈单调队列:死海不是海,单调队列不是队列

1.滑动窗口最值问题 给定一个长度为n的序列a1,a2,-ai,-,an,将一个长为k的滑动窗口自序列最左端向右边滑动.例如:初始时,窗口内的子序列为a1,a2,-,ak:当窗口向右滑动一位,此时窗口内的子序列变为a2,a3,-,ak+1. 我们要解决的问题是,给定长度为n的序列以及滑动窗口的大小k,求每一个滑动窗口内的最小值和最大值. 以长度为5的序列1, 3, 4, 5, 7滑动窗口k=3为例说明: 第1个滑动窗口(1, 3, 4)的最小值.最大值分别为1和4: 第2个滑动窗口(3, 4,

「消息队列」看过来!

为了获得更良好的阅读体验,建议您前往个人独立域名博客观看:传送门 ) 一.什么是消息队列? 当我试图用一则通俗的比喻来说明这个概念的时候,我想到一个有意思的比喻:如果把队列抽象成一个集合体,那么消息队列也就是一堆消息的集合.按照这个思路我想到了「杂志」.这不就是一堆消息的集合吗,关心这些消息的人都能通过「购买」来获得这些消息,而我可以通过不同种类的「杂志」或许到不同的消息.并且如果我作为出版方,我可以提供所有出版过的「杂志」,也可以选择让读者只能购买近期的. 二.为什么需要消息队列? 好处一:解

消息队列技术

消息队列技术 上周,我们举办了第二届技术沙龙,我这边主要演讲了消息队列技术的议题,现分享给大家: 在我们团队内部,随着消息应用中心(任务中心)的广泛应用,有时候我们感觉不到消息队列的存在,但这不影响消息队列在高可用.分布式.高并发架构下的核心地位. 消息队列都应用到了哪些实际的应用场景中? 一.再谈消息队列的应用场景 异步处理:例如短信通知.终端状态推送.App推送.用户注册等 数据同步:业务数据推送同步 重试补偿:记账失败重试 系统解耦:通讯上下行.终端异常监控.分布式事件中心 流量消峰:秒杀

RabbitMQ,Apache的ActiveMQ,阿里RocketMQ,Kafka,ZeroMQ,MetaMQ,Redis也可实现消息队列,RabbitMQ的应用场景以及基本原理介绍,RabbitMQ基础知识详解,RabbitMQ布曙

消息队列及常见消息队列介绍 2017-10-10 09:35操作系统/客户端/人脸识别 一.消息队列(MQ)概述 消息队列(Message Queue),是分布式系统中重要的组件,其通用的使用场景可以简单地描述为: 当不需要立即获得结果,但是并发量又需要进行控制的时候,差不多就是需要使用消息队列的时候. 消息队列主要解决了应用耦合.异步处理.流量削锋等问题. 当前使用较多的消息队列有RabbitMQ.RocketMQ.ActiveMQ.Kafka.ZeroMQ.MetaMq等,而部分数据库如Re

浅谈算法和数据结构(1):栈和队列

浅谈算法和数据结构(1):栈和队列 2014/11/03 ·  IT技术                                         · 2 评论                                      ·  数据结构, 栈, 算法, 队列 分享到: 60 SegmentFault D-Day 2015 北京:iOS 站 JDBC之“对岸的女孩走过来” CSS深入理解之relative HTML5+CSS3实现春节贺卡 原文出处: 寒江独钓   欢迎分享原创