当前位置:首页 > 科技  > 软件

三分钟白话RocketMQ系列—— 如何发送消息

来源: 责编: 时间:2023-08-05 11:46:05 5304观看
导读我们知道RocketMQ主要分为消息 生产、存储(消息堆积)、消费 三大块领域。那接下来,我们白话一下,RocketMQ是如何发送消息的,揭秘消息生产全过程。注意,如果白话中不小心提到相关代码配置与类名,请参考RocketMQ 4.9.4版本关键

我们知道RocketMQ主要分为消息 生产、存储(消息堆积)、消费 三大块领域。mx828资讯网——每日最新资讯28at.com

那接下来,我们白话一下,RocketMQ是如何发送消息的,揭秘消息生产全过程。mx828资讯网——每日最新资讯28at.com

注意,如果白话中不小心提到相关代码配置与类名,请参考RocketMQ 4.9.4版本mx828资讯网——每日最新资讯28at.com

关键字摘要

  • 哪些消息类型?
  • 发给谁?
  • 怎么发?
  • 怎么知道发成功了还是失败了?
  • 发失败了怎么办?

Q1: RocketMQ有哪些消息类型?

RocketMQ生产消息时,支持多种「消息类型」:mx828资讯网——每日最新资讯28at.com

  • 普通消息:发送普通消息。
SendResult send(final Message msg);
  • 普通有序消息:发送普通有序消息,通过指定「消息筛选器selector」,动态决定发送哪个队列。
SendResult send(final Message msg, final MessageQueueSelector selector, final Object arg);
  • 严格有序消息:发送严格有序消息,通过指定队列,保证严格有序。
SendResult send(final Message msg, final MessageQueue mq);
  • 事务消息:实现分布式事务。(属于分布式事务范畴,区别较大,本文不再展开讨论,后面单独写一篇针对「事务消息」的分析)

上面列举的三种send方法,都是以同步发送模式为例。定时/延迟消息从发送方式角度来说,不算一种独立的消息类型。mx828资讯网——每日最新资讯28at.com

Q2:RocketMQ怎么知道一条消息要发送给谁?

一般我们要发送一条消息给RocketMQ,需要创建这样一个消息体。mx828资讯网——每日最新资讯28at.com

Message msg = new Message( "TestTopic", "Hello World".getBytes() );

在这个消息体里面,我们只单纯指定了要发送的Topic名字,以及要发送的消息内容。mx828资讯网——每日最新资讯28at.com

那么,RocketMQ-client怎么知道这条消息要发送到RocketMQ集群中的哪一个broker上呢?mx828资讯网——每日最新资讯28at.com

这里需要了解下RocketMQ中Topic的「路由注册与发现机制」。mx828资讯网——每日最新资讯28at.com

RocketMQ基本架构RocketMQ基本架构mx828资讯网——每日最新资讯28at.com

Topic 路由注册与发现:mx828资讯网——每日最新资讯28at.com

  • Broker 每30秒向 NameServer 发送心跳包,里面包含Topic的路由信息,包括主题的读写队列数和操作权限等。NameServer会保存这些路由信息,并记录最后一次收到 Broker 心跳包的时间(NameServer每10秒根据记录的时间戳清理已经失联120秒以上的 Broker)。
  • 生产者每30秒获取一次主题的路由信息。这意味着消息生产者不会立即知道有新的 Broker 加入或者被移除。

Topic路由信息Topic路由信息mx828资讯网——每日最新资讯28at.com

Topic的路由信息,包括了Topic的 队列queue和broker的映射关系 ,那么如何利用这个Topic的路由信息呢?mx828资讯网——每日最新资讯28at.com

我们需要根据前面的不同「消息类型」进行分别讨论:mx828资讯网——每日最新资讯28at.com

  • 普通消息:默认采用轮询机制,消息会依次发送到Topic的每个可用的 Broker 的某个队列queue上,以实现负载均衡。
  • 普通有序消息:根据传递的 MessageQueueSelector 和消息体 msg 内容,计算可以投递的队列queue,然后发送消息。(可以类比分库分表中的分表计算写入的方式)
  • 严格有序消息:根据传递的 MessageQueue 信息,强制消息发送到对应队列queue上。(可以类比分库分表中,强制指定物理表写入的方式)

根据消息类型获取到目标队列queue后,就可以根据Topic路由信息发送消息到指定broker上了。mx828资讯网——每日最新资讯28at.com

Q3:怎么发送一条消息?

从发送模式角度来说,RocketMQ有三种「消息发送模式」:mx828资讯网——每日最新资讯28at.com

  • 同步发送:调用发送消息方法后,同步阻塞,直到返回SendResult。
SendResult send(final Message msg);
  • 异步发送:调用发送消息方法后,立即返回,发送结果会通过开发者自己注册的回调函数SendCallback进行处理。
void send(final Message msg, final SendCallback sendCallback);
  • 单向发送:这种方法完全不关心发送后的返回结果。显然,它具有最大吞吐量,但也存在消息丢失的潜在风险。
void sendOneway(final Message msg);

上面列举的三种send方法,都是以「普通消息」为例。mx828资讯网——每日最新资讯28at.com

「消息类型」 和 「消息发送模式」 是 N*M 的关系,所以聪明的你一定已经想到了,存在9种不同组合(不包括事物消息),RocketMQ也是在接口中定义了9种不同方法。mx828资讯网——每日最新资讯28at.com

Q4: 发送后,怎么知道消息发成功了还是失败了?

前面介绍了三种「消息发送模式」,其中「单向发送」属于不可靠发送,我们无法知道是否发送成功。mx828资讯网——每日最新资讯28at.com

而「同步发送」和「异步发送」都是可靠发送,我们能够获取发送状态,知道是否成功。mx828资讯网——每日最新资讯28at.com

在「同步发送」中,我们可以根据SendResult中的sendStatus属性判断是否发送成功。mx828资讯网——每日最新资讯28at.com

SendResult类属性SendResult类属性mx828资讯网——每日最新资讯28at.com

在「异步发送」中,我们可以自定义实现SendCallback的onSuccess()方法和onException()方法,来判断消息是否发送成功。mx828资讯网——每日最新资讯28at.com

SendCallback接口定义SendCallback接口定义mx828资讯网——每日最新资讯28at.com

Q5: 消息发送失败了怎么办?

如果消息发送失败了,RocketMQ-client默认有重试机制,以确保消息的高可用性。mx828资讯网——每日最新资讯28at.com

前面提到,生产者每30秒获取一次主题的路由信息,所以即使某个 Broker 宕机,消息发送者可能无法立即察觉到它的宕机状态。mx828资讯网——每日最新资讯28at.com

但是,当消息发送者向某个 Broker 发送消息后,如果返回异常,生产者会在接下来的一段时间内(例如5分钟)避免再次选择该 Broker 上的队列来发送消息。这样做的目的是规避可能发生故障的 Broker。mx828资讯网——每日最新资讯28at.com

当然了,用户也能根据返回的异常,自己定义业务重试、补偿机制。mx828资讯网——每日最新资讯28at.com

需要注意的是,不同「消息类型」和「消息发送模式」的RocketMQ-client默认重试机制不同。mx828资讯网——每日最新资讯28at.com

消息类型:mx828资讯网——每日最新资讯28at.com

  • 普通消息:无顺序性要求,异常时RocketMQ-client默认重试。
  • 普通有序消息:异常时RocketMQ-client默认不重试,可以用户自己捕获异常重试,并发送到其他队列。
  • 严格有序消息:保证严格有序,异常时RocketMQ-client默认不重试,可以用户自己捕获异常重试。

注意:有序消息异常时RocketMQ-client都是默认不重试mx828资讯网——每日最新资讯28at.com

消息发送模式:mx828资讯网——每日最新资讯28at.com

  • 同步发送:配置retryTimesWhenSendFailed默认重试次数。
  • 异步发送:配置retryTimesWhenSendAsyncFailed默认重试次数。
  • 单向发送:无重试机制,存在丢失消息的风险。

注意:单向发送模式异常时RocketMQ-client默认不重试mx828资讯网——每日最新资讯28at.com

总结

  • 有哪些消息类型:普通消息、有序消息、事务消息
  • 发给谁?:Topic路由信息注册与发现机制、普通消息轮询发送、有序消息指定selector或者queue发送
  • 怎么发?:同步发送、异步发送、单向发送
  • 怎么知道发成功了还是失败了?:同步&异步都能够获取发送状态(可靠发送)、单向发送不可靠
  • 发失败了怎么办?: 失败重试机制

本文链接:http://www.28at.com/showinfo-26-144-0.html三分钟白话RocketMQ系列—— 如何发送消息

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 使用Webdriver-manager解决浏览器与驱动不匹配所带来自动化无法执行的问题

下一篇: 从零到英雄:高并发与性能优化的神奇之旅

标签:
  • 热门焦点
  • 直屏旗舰来了 iQOO 12和K70 Pro同台竞技

    旗舰机基本上使用的都是双曲面屏幕,这就让很多喜欢直屏的爱好者在苦等一款直屏旗舰,这次,你们等到了。据博主数码闲聊站带来的最新爆料称,Redmi下代旗舰K70 Pro和iQOO 12两款手
  • 6月安卓手机好评榜:魅族20 Pro蝉联冠军

    性能榜和性价比榜之后,我们来看最后的安卓手机好评榜,数据来源安兔兔评测,收集时间2023年6月1日至6月30日,仅限国内市场。第一名:魅族20 Pro好评率:95%5月份的时候魅族20 Pro就是
  • 只需五步,使用start.spring.io快速入门Spring编程

    步骤1打开https://start.spring.io/,按照屏幕截图中的内容创建项目,添加 Spring Web 依赖项,并单击“生成”按钮下载 .zip 文件,为下一步做准备。请在进入步骤2之前进行解压。图
  • 一文搞定Java NIO,以及各种奇葩流

    大家好,我是哪吒。很多朋友问我,如何才能学好IO流,对各种流的概念,云里雾里的,不求甚解。用到的时候,现百度,功能虽然实现了,但是为什么用这个?不知道。更别说效率问题了~下次再遇到,
  • 零售大模型“干中学”,攀爬数字化珠峰

    文/侯煜编辑/cc来源/华尔街科技眼对于绝大多数登山爱好者而言,攀爬珠穆朗玛峰可谓终极目标。攀登珠峰的商业路线有两条,一是尼泊尔境内的南坡路线,一是中国境内的北坡路线。相
  • 破圈是B站头上的紧箍咒

    来源 | 光子星球撰文 | 吴坤谚编辑 | 吴先之每年的暑期档都少不了瞄准追剧女孩们的古偶剧集,2021年有优酷的《山河令》,2022年有爱奇艺的《苍兰诀》,今年却轮到小破站抓住了追
  • 造车两年股价跌六成,小米的估值逻辑变了吗?

    如果从小米官宣造车后的首个交易日起持有小米集团的股票,那么截至2023年上半年最后一个交易日,投资者将浮亏59.16%,同区间的恒生科技指数跌幅为52.78%
  • 华为Mate 60系列用上可变灵动岛:正式版体验将会更出色

    这段时间以来,关于华为新旗舰的爆料日渐密集。据此前多方爆料,今年华为将开始恢复一年双旗舰战略,除上半年推出的P60系列外,往年下半年的Mate系列也将
  • 苹果MacBook Pro 2021测试:仍不支持平滑滚动

    据10月30日9to5 Mac 消息报道,苹果新的 14 英寸和 16 英寸 MacBook Pro 2021 上市后获得了不错的评价,亮点包括行业领先的性能,令人印象深刻的电池续航,精美丰
Top