zoukankan      html  css  js  c++  java
  • RocketMq基本概念

    官方文档

    一、基本概念

    1. 基本消息模型

    RocketMQ主要由 Producer、Broker、Consumer 三部分组成

    • Producer(生产者): 负责生产消息,把业务应用系统里产生的消息发送到broker服务器
      • 同步发送(需要broker返回确认信息)
      • 异步发送(需要broker返回确认信息)
      • 顺序发送
      • 单向发送
    • Consumer(消费者):负责消费消息,从Broker服务器拉取消息、并将其提供给应用程序
      • 拉取式消费
      • 推动式消费
    • Broker Server(代理服务器):消息中转角色,负责存储消息、转发消息。代理服务器也存储消息相关的元数据,包括消费者组、消费进度偏移和主题和队列消息等。Broker 在实际部署过程中对应一台服务器,每个 Broker 可以存储多个Topic的消息,每个Topic的消息也可以分片存储于不同的 Broker

    2. 其他概念

    • Topic(主题):一类消息的集合,每个主题包含若干条消息,每条消息只能属于一个主题,是RocketMQ进行消息订阅的基本单位
    • Name Server(名称服务):名称服务充当路由消息的提供者,生产者或消费者能够通过名字服务查找各主题相应的Broker IP列表,多个Namesrv实例组成集群,但相互独立,没有信息交换。
    • Pull Consumer(拉取式消费):主动权由应用控制,主动调用Consumer的拉消息方法从Broker服务器拉消息,一旦获取了批量消息,应用就会启动消费过程。
    • Push Consumer(推动式消息):该模式下Broker收到数据后会主动推送给消费端,该消费模式一般实时性较高
    • Producer Group(生产者组):同一类Producer的集合,这类Producer发送同一类消息且发送逻辑一致。如果发送的是事务消息且原始生产者在发送之后崩溃,则Broker服务器会联系同一生产者组的其他生产者实例以提交或回溯消费。
    • Consumer Group(消费者组):同一类Consumer的集合,这类Consumer通常消费同一类消息且消费逻辑一致。消费者组使得在消息消费方面,实现负载均衡和容错的目标变得非常容易。要注意的是,消费者组的消费者实例必须订阅完全相同的Topic。RocketMQ 支持两种消息模式:集群消费(Clustering)和广播消费(Broadcasting)。
    • Clustering(集群消费):相同Consumer Group的每个Consumer实例平均分摊消息
    • Broadcasting(广播消费):相同Consumer Group的每个Consumer实例都接收全量的消息。
    • Normal Ordered Message(普通顺序消息):消费者通过同一个消费队列收到的消息是有顺序的,不同消息队列收到的消息则可能是无顺序的。
    • Strictly Ordered Message(严格顺序消息):消费者收到的所有消息均是有顺序的
    • Message(消息):传输信息的物理载体,生产和消费数据的最小单位,每条消息必须属于一个主题。RocketMQ中每个消息拥有唯一的Message ID,且可以携带具有业务标识的Key。系统提供了通过Message ID和Key查询消息的功能。
    • Tag(标签):用于同一主题下区分不同类型的消息,标签能够有效地保持代码的清晰度和连贯性,并优化RocketMQ提供的查询系统。消费者可以根据Tag实现对不同子主题的不同消费逻辑,实现更好的扩展性。

    二、特性

    1. 订阅与发布

    消息的发布是指某个生产者向某个topic发送消息;消息的订阅是指某个消费者关注了某个topic中带有某些tag的消息,进而从该topic消费数据。

    2. 消息顺序

    消息有序指的是一类消息消费时,能按照发送的顺序来消费。

    • 全局顺序:对于指定的一个 Topic,所有消息按照严格的先入先出(FIFO)的顺序进行发布和消费。 适用场景:性能要求不高,所有的消息严格按照 FIFO 原则进行消息发布和消费的场景
    • 分区顺序:对于指定的一个 Topic,所有消息根据 sharding key 进行区块分区。 同一个分区内的消息按照严格的 FIFO 顺序进行发布和消费。 Sharding key 是顺序消息中用来区分不同分区的关键字段,和普通消息的 Key 是完全不同的概念。 适用场景:性能要求高,以 sharding key 作为分区字段,在同一个区块中严格的按照 FIFO 原则进行消息发布和消费的场景。

    3. 消息过滤

    RocketMQ的消费者可以根据Tag进行消息过滤,也支持自定义属性过滤。消息过滤目前是在Broker端实现的,优点是减少了对于Consumer无用消息的网络传输,缺点是增加了Broker的负担、而且实现相对复杂。

    4. 消息可靠性

    RocketMQ支持消息的高可靠,影响消息可靠性的几种情况:

    • Broker非正常关闭
    • Broker异常Crash
    • OS Crash
    • 机器掉电,但是能立即恢复供电情况
    • 机器无法开机(可能是cpu、主板、内存等关键设备损坏)
    • 磁盘设备损坏

    1)、2)、3)、4) 四种情况都属于硬件资源可立即恢复情况,RocketMQ在这四种情况下能保证消息不丢,或者丢失少量数据(依赖刷盘方式是同步还是异步)。

    5)、6)属于单点故障,且无法恢复,一旦发生,在此单点上的消息全部丢失。RocketMQ在这两种情况下,通过异步复制,可保证99%的消息不丢,但是仍然会有极少量的消息可能丢失。通过同步双写技术可以完全避免单点,同步双写势必会影响性能,适合对消息可靠性要求极高的场合,例如与Money相关的应用。注:RocketMQ从3.0版本开始支持同步双写。

    5. 至少一次

    每个消息必须投递一次,Consumer先Pull消息到本地,消费完成后,才向服务器返回ack,如果没有消费一定不会ack消息,所以RocketMQ可以很好的支持此特性。

    6. 回溯消费

    回溯消费是指Consumer已经消费成功的消息,由于业务上需求需要重新消费,要支持此功能,Broker在向Consumer投递成功消息后,消息仍然需要保留。

    7. 事务消息

    应用本地事务和发送消息操作可以被定义到全局事务中,要么同时成功,要么同时失败,RocketMQ的事务消息提供类似 X/Open XA 的分布事务功能,通过事务消息能达到分布式事务的最终一致。

    8. 定时消息

    定时消息(延迟队列)是指消息发送到broker后,不会立即被消费,等待特定时间投递给真正的topic。 broker有配置项messageDelayLevel,默认值为“1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h”,18个level。可以配置自定义messageDelayLevel。注意,messageDelayLevel是broker的属性,不属于某个topic。发消息时,设置delayLevel等级即可:msg.setDelayLevel(level)。level有以下三种情况:

    • level == 0,消息为非延迟消息
    • 1<=level<=maxLevel,消息延迟特定时间,例如level==1,延迟1s
    • level > maxLevel,则level== maxLevel,例如level==20,延迟2h

    定时消息会暂存在名为SCHEDULE_TOPIC_XXXX的topic中,并根据delayTimeLevel存入特定的queue,queueId = delayTimeLevel – 1,即一个queue只存相同延迟的消息,保证具有相同发送延迟的消息能够顺序消费。broker会调度地消费SCHEDULE_TOPIC_XXXX,将消息写入真实的topic。

    需要注意的是,定时消息会在第一次写入和调度写入真实topic时都会计数,因此发送数量、tps都会变高。

    9. 消息重试

    Consumer消费消息失败后,要提供一种重试机制,令消息再消费一次。Consumer消费消息失败通常可以认为有以下几种情况:

    • 由于消息本身的原因
    • 由于依赖的下游应用服务不可用

    RocketMQ会为每个消费组都设置一个Topic名称为“%RETRY%+consumerGroup”的重试队列(这里需要注意的是,这个Topic的重试队列是针对消费组,而不是针对每个Topic设置的),用于暂时保存因为各种异常而导致Consumer端无法消费的消息。考虑到异常恢复起来需要一些时间,会为重试队列设置多个重试级别,每个重试级别都有与之对应的重新投递延时,重试次数越多投递延时就越大。RocketMQ对于重试消息的处理是先保存至Topic名称为“SCHEDULE_TOPIC_XXXX”的延迟队列中,后台定时任务按照对应的时间进行Delay后重新保存至“%RETRY%+consumerGroup”的重试队列中。

    10. 消息重投

    生产者在发送消息时,同步消息失败会重投,异步消息有重试,oneway没有任何保证。消息重投保证消息尽可能发送成功、不丢失,但可能会造成消息重复,消息重复在RocketMQ中是无法避免的问题

    如下方法可以设置消息重试策略:

    • retryTimesWhenSendFailed:同步发送失败重投次数,默认为2,因此生产者会最多尝试发送retryTimesWhenSendFailed + 1次。不会选择上次失败的broker,尝试向其他broker发送,最大程度保证消息不丢。超过重投次数,抛出异常,由客户端保证消息不丢。当出现RemotingException、MQClientException和部分MQBrokerException时会重投。
    • retryTimesWhenSendAsyncFailed:异步发送失败重试次数,异步重试不会选择其他broker,仅在同一个broker上做重试,不保证消息不丢。
    • retryAnotherBrokerWhenNotStoreOK:消息刷盘(主或备)超时或slave不可用(返回状态非SEND_OK),是否尝试发送到其他broker,默认false。十分重要消息可以开启。

    11. 流量控制

    生产者流控,因为broker处理能力达到瓶颈;消费者流控,因为消费能力达到瓶颈。

    生产者流控:

    • commitLog文件被锁时间超过osPageCacheBusyTimeOutMills时,参数默认为1000ms,返回流控。
    • 如果开启transientStorePoolEnable == true,且broker为异步刷盘的主机,且transientStorePool中资源不足,拒绝当前send请求,返回流控。
    • broker每隔10ms检查send请求队列头部请求的等待时间,如果超过waitTimeMillsInSendQueue,默认200ms,拒绝当前send请求,返回流控。
    • broker通过拒绝send 请求方式实现流量控制。

    注意,生产者流控,不会尝试消息重投。

    消费者流控:

    • 消费者本地缓存消息数超过pullThresholdForQueue时,默认1000。
    • 消费者本地缓存消息大小超过pullThresholdSizeForQueue时,默认100MB。
    • 消费者本地缓存消息跨度超过consumeConcurrentlyMaxSpan时,默认2000。

    消费者流控的结果是降低拉取频率。

    12. 死信队列

    死信队列用于处理无法被正常消费的消息。当一条消息初次消费失败,消息队列会自动进行消息重试;达到最大重试次数后,若消费依然失败,则表明消费者在正常情况下无法正确地消费该消息,此时,消息队列 不会立刻将消息丢弃,而是将其发送到该消费者对应的特殊队列中。

  • 相关阅读:
    English 2
    速算24点
    心理学1
    从微服务到函数式编程
    034 01 Android 零基础入门 01 Java基础语法 04 Java流程控制之选择结构 01 流程控制概述
    033 01 Android 零基础入门 01 Java基础语法 03 Java运算符 13 运算符和表达式知识点总结
    032 01 Android 零基础入门 01 Java基础语法 03 Java运算符 12 运算符和if-else条件语句的综合案例——闰年问题
    031 01 Android 零基础入门 01 Java基础语法 03 Java运算符 11 运算符的优先级
    030 01 Android 零基础入门 01 Java基础语法 03 Java运算符 10 条件运算符
    029 01 Android 零基础入门 01 Java基础语法 03 Java运算符 09 逻辑“非”运算符
  • 原文地址:https://www.cnblogs.com/steven158/p/14860378.html
Copyright © 2011-2022 走看看