开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第1天,点击查看活动详情
前言
作为一名后端开发工程师,消息队列是我们常用的分布式组件,其削峰、限流、解耦的特性使它成为许多分布式业务场景下拥有崇高地位。RocketMQ作为消息队列家族中的一员,它是系统开发中比较常用的一种MQ,从今天开始,就让我们一同来探索RocketMQ的奥秘吧!本系列文章,将会有较多源码解析,其中会穿插些应用场景以及最佳实践,是后端开发进阶学习不可错过的干货!话不多说,我们一起开始吧!
RocketMQ的消息模型
在开始之前,我们先来回顾下RocketMQ的消息模型。
RocketMQ 最基本的消费模型由 Producer、Broker、Consumer 三部分组成:
- Producer 负责生产消息
- Consumer 负责消费消息
- Broker 负责存储消息
显然,看到这个文章标题就知道,我们需要来了解的知识点就是消息队列的 Producer 是怎么样把消息发送出去的!
RocketMQ 的消息发送方式
RocketMQ 当前支持三种发送方式:
- 同步发送(Sync):Producer 调用发送消息的 API ,需要同步等待消息服务器 Broker 返回发送结果才算完成一次调用。
- 异步发送(ASync):Producer 调用发送消息的 API,无需等待消息服务器 Broker 返回结果,直接结束调用。消息发送给 Broker 的结果成功与否将使用回调的方式来通知 Producer。也就是说, Producer 当前的线程调用发送消息的 API 无需阻塞到 Broker 返回结果,Broker 返回到结果将会开启另外一个线程回调通知 Producer
- 单向发生(OneWay):Producer 调用发送消息的 API,直接返回,不需要等待 Broker 返回对应的结果,也不需要注册回调函数来获取 Broker 的结果。
消息应该发往哪个 Broker
我们知道,在分布式场景下,Broker 通常是集群部署的,才能够满足高可用,否则一台 Broker 挂了,那么相当于整个 RocketMQ 都不可用了。我们来思考这样一个问题,Producer 应该如何知道消息要发到哪个 Broker 上呢? Broker 这么多,总不可能只发到一个地方吧~
这就需要了解下路由机制了。Producer 将消息发送到某个 Topic 前,需要查询 Topic 的路由信息。
- 首次发送时,会根据 Topic 向 NameServer 集群(名字服务器,主要存储路由信息,后面我会单独写文章来对其进行讲解~)中查询 Topic 的路由信息,然后将路由信息存储到本地内存缓存中(一个Map,具体我们后面揭晓~),然后每隔30秒遍历Map中的 Topic,向 NameServer 集群中查询最新的 Topic 路由信息,查询成功的话则把最新的路由信息更新到缓存中,从而能够做到动态获取路由信息。
- 此外,RocketMQ还提供自动创建 Topic的机制,如果 Producer 发送了一个消息给不存在的 Topic,向 NameServer 集群查询该 Topic 的路由信息时首先会返回为空。RocketMQ的自动创建 Topic 配置开启,则会再次发起一个查询默认 Topic 的路由信息的请求给 NameServer,NameServer 返回该路由信息给 Producer ,然后 Producer 就会使用该默认 Topic 的路由信息来进行消息的发送。
有了 Topic 的路由信息后,Producer 就知道该把消息发到哪一个 Broker 上了!
小结
本文简要介绍了 RocketMQ 的消息发送方式以及 Topic 路由信息的获取,后面的文章会有更多精彩的内容,大家多多关注哦~