从0到1 手把手搭建spring cloud alibaba 微服务大型应用框架(十三)rocketmq 篇(2):路由注册,消息发送核心流程原理

本文涉及的产品
云原生网关 MSE Higress,422元/月
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
注册配置 MSE Nacos/ZooKeeper,118元/月
简介: 从0到1 手把手搭建spring cloud alibaba 微服务大型应用框架(十三)rocketmq 篇(2):路由注册,消息发送核心流程原理

本文承接上文《从0到1 手把手搭建spring cloud alibaba 微服务大型应用框架(十三)rocketmq 篇(1):整体介绍》6be29068e09c41ec9acfb6ddc5eb4ef1.png

路由注册流程与原理

broker 每隔30s会向所有nameserver 发送自己心跳消息和topic 配置消息,

然后消息会被每个nameserver 将心跳信息保留到brokerLiveTable 中 ,

NameServer每隔10s会扫描一次brokerLiveTable(存放心跳包的时间戳信息)

如果在120s内没有收到心跳包,则认为Broker失效,更新topic的路由信息,将失效的Broker信息移除

nameserver 将broker 发送的消息汇总后会形成几个json 对象

主要是QueueData、BrokerData、BrokerLiveInfo 等对象,数据结构如下图:



cf609b2cd5b14a2d9782e28311d1f7c7.png


832fee3db9494d51af0a51459c839efb.png

消息发送流程与原理

消息发送宏观流程图

4b46344f4a624c7a9b2d52d86b8c6d80.png

消息发送宏观流程描述


1.消息发送者向某一个topic发送消息时,需要查询topic的路由信息。

2.初次发送时会根据topic的名称向NameServer集群查询topic的路由信息,然后将其存储在本地内存缓存中,并且每隔30s依次遍历缓存中的topic,向NameServer查询最新的路由信息。

3 如果成功查询到路由信息,会将这些信息更新至本地缓存,实现topic路由信息的动态感知。

4 RocketMQ提供了自动创建主题(topic)的机制,消息发送者向一个不存在的主题发送消息时,向NameServer查询该主题的路由信息会先返回空,

4.1如果未开启自动创建主题机制,直接抛出异常

4.2如果开启了自动创建主题机制,会使用一个默认的主题名再次从NameServer查询路由信息,

然后消息发送者会使用默认主题的路由信息进行负载均衡,

但不会直接使用默认路由信息为新主题创建对应的路由信息。使用默认主题创建路由信息的流程

注意点:生产环境尽量不要开启自动创建主题机制 也就是autoCreateTopicEnable为true

因为这时候发送不存在的topic仅仅会在某cluster其中一台机器产生topic 会导致topic 不同步

消费者在查询topic 时通过nameserver 永远只能查到一个broker,会一直往这个broker发送

消息发送详细流程

发送流程图bbcd1998e7c54827ac0e90aec14b6ed9.png

发送流程如下:

1.消息长度验证

在消息发送之前,首先确保生产者处于运行状态,然后验证消息是否符合相应的规范。

具体的规范要求是主题名称、消息体不能为空,

消息长度不能等于0且默认不能超过允许发送消息的最大长度4MB(maxMessageSize=1024×1024×4)。

2.查找主题路由信息

在消息发送之前,还需要获取主题的路由信息,

只有获取了这些信息我们才能知道消息具体要发送到哪个Broker节点上

3.选择消息队列

根据路由信息选择消息队列,返回的消息队列按照broker序号进行排序。

举例说明,如果topicA在broker-a、broker-b上分别创建了4个队列,那么返回的消息队列为

[{"brokerName":"broker-a"、"queueId":0}、{"brokerName":"broker-a"、"queueId":1}、{"brokerName":"broker-a"、"queueId":2}、{"brokerName":"broker-a"、"queueId":3}、{"brokerName":"broker-b"、"queueId":0}、{"brokerName":"broker-b"、"queueId":1}、{"brokerName":"broker-b"、"queueId":2}、{"brokerName":"broker-b"、"queueId":3}],

3.1 选择消息队列机制

3.1.1 默认机制

在消息发送过程中,可能会多次执行选择消息队列这个方法,lastBrokerName就是上一次选择的执行发送消息失败的Broker。第一次执行消息队列选择时

lastBrokerName为null,此时直接用sendWhichQueue自增再获取值,与当前路由表中消息队列的个数取模,返回该位置

的MessageQueue(selectOneMessageQueue()方法,如果消息发送失败,下次进行消息队列选择时规避上次MesageQueue所在的Broker,否则有可能再次失败。

或许有读者会问,Broker不可用后,路由信息中为什么还会包含该Broker的路由信息呢?其实这不难解释:首先,NameServer检测Broker是否可用是有延迟的,最短为一次心跳检测间隔(10s);其次,NameServer不是检测到Broker宕机后马上推送消息给消息生产者,而是消息生产者每隔30s更新一次路由信息,因此消息生产者最快感知Broker最新的路由信息也需要30s。这就需要引入一种机制,在Broker宕机期间,一次消息发送失败后,将该Broker暂时排除在消息队列的选择范围中。

3.1.2 故障延迟机制

首先对上述代码进行解读。

1)轮询获取一个消息队列。

2)验证该消息队列是否可用

3)如果返回的MessageQueue可用,则移除关于该topic的条目,表明该Broker故障已经修复。

4.发送消息

4.1 同步发送

第一步:检查消息发送是否合理,这里完成了以下几件事。

1)检查Broker是否有写权限。

2)检查topic是否可以进行消息发送。主要针对默认主题,默认主题不能发送消息,仅供路由查找。

3)在NameServer端存储主题的配置信息,默认路径为${ROCKET_HOME}/store/ config/ topic.json。下面是主题存储信息。

4)检查队列,如果队列不合法,则返回错误码。

如果消息重试次数超过允许的最大重试次数,消息将进入DLQ死信队列。死信队列主题为%DLQ%+消费组名。

调用DefaultMessageStore

4.2 异步发送

异步发送是指消息生产者调用发送的API后,无须等待消息服务器返回本次消息发送的结果,

只需要提供一个回调函数,供消息发送客户端在收到响应结果后回调。异步发送方式相比于同步发送方式,

虽然消息发送端的发送性能会显著提高,但是为了降低消息服务器的负载压力,

RocketMQ对消息发送的异步消息进行了并发控制,通过参数clientAsyncSemaphoreValue实现,默认为65535。

异步消息发送虽然也可以通过DefaultMQProducer#retryTimesWhenSendAsyncFailed属性来控制消息的发送重试次数,

但是重试的调用入口是在收到服务端响应包时进行的,如果出现网络异常、网络超时等情况将不会重试

4.3单向发送

单向发送是指消息生产者调用消息发送的API后,无须等待消息服务器返回本次消息发送的结果,

并且无须提供回调函数,这表示压根就不关心本次消息发送是否成功,

其实现原理与异步消息发送相同,只是消息发送客户端在收到响应结果后什么都不做了,并且没有重试机制。





相关实践学习
消息队列RocketMQ版:基础消息收发功能体验
本实验场景介绍消息队列RocketMQ版的基础消息收发功能,涵盖实例创建、Topic、Group资源创建以及消息收发体验等基础功能模块。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
相关文章
|
12天前
|
Cloud Native Java Nacos
微服务时代的新宠儿!Spring Cloud Nacos实战指南,带你玩转服务发现与配置管理,拥抱云原生潮流!
【8月更文挑战第29天】Spring Cloud Nacos作为微服务架构中的新兴之星,凭借其轻量、高效的特点,迅速成为服务发现、配置管理和治理的首选方案。Nacos(命名和配置服务)由阿里巴巴开源,为云原生应用提供了动态服务发现及配置管理等功能,简化了服务间的调用与依赖管理。本文将指导你通过五个步骤在Spring Boot项目中集成Nacos,实现服务注册、发现及配置动态管理,从而轻松搭建出高效的微服务环境。
73 0
|
12天前
|
Dubbo Java 应用服务中间件
💥Spring Cloud Dubbo火爆来袭!微服务通信的终极利器,你知道它有多强大吗?🔥
【8月更文挑战第29天】随着信息技术的发展,微服务架构成为企业应用开发的主流模式,而高效的微服务通信至关重要。Spring Cloud Dubbo通过整合Dubbo与Spring Cloud的优势,提供高性能RPC通信及丰富的生态支持,包括服务注册与发现、负载均衡和容错机制等,简化了服务调用管理并支持多种通信协议,提升了系统的可伸缩性和稳定性,成为微服务通信领域的优选方案。开发者仅需关注业务逻辑,而无需过多关心底层通信细节,使得Spring Cloud Dubbo在未来微服务开发中将更加受到青睐。
28 0
|
2天前
|
前端开发 Java UED
"揭秘!如何以戏剧性姿态,利用SpringCloud铸就无懈可击的异常处理铁壁,让你的微服务架构稳如泰山,震撼业界!"
【9月更文挑战第8天】随着微服务架构的普及,Spring Cloud作为一套完整的微服务解决方案被广泛应用。在微服务架构中,服务间调用频繁且复杂,异常处理成为保障系统稳定性和用户体验的关键。传统的异常处理方式导致代码冗余,降低系统可维护性和一致性。因此,基于Spring Cloud封装统一的异常处理机制至关重要。这样不仅可以减少代码冗余、提升一致性,还增强了系统的可维护性,并通过统一的错误响应格式优化了用户体验。具体实现包括定义全局异常处理器、自定义业务异常以及在服务中抛出这些异常。这种方式体现了微服务架构中的“服务治理”和“契约先行”原则,有助于构建健壮、可扩展的系统。
12 2
|
10天前
|
Java 微服务 Spring
驾驭复杂性:Spring Cloud在微服务构建中的决胜法则
【8月更文挑战第31天】Spring Cloud是在Spring Framework基础上打造的微服务解决方案,提供服务发现、配置管理、消息路由等功能,适用于构建复杂的微服务架构。本文介绍如何利用Spring Cloud搭建微服务,包括Eureka服务发现、Config Server配置管理和Zuul API网关等组件的配置与使用。通过Spring Cloud,可实现快速开发、自动化配置,并提升系统的伸缩性和容错性,尽管仍需面对分布式事务等挑战,但其强大的社区支持有助于解决问题。
22 0
|
12天前
|
Kubernetes Cloud Native Docker
云原生之旅:从容器到微服务的架构演变
【8月更文挑战第29天】在数字化时代的浪潮下,云原生技术以其灵活性、可扩展性和弹性管理成为企业数字化转型的关键。本文将通过浅显易懂的语言和生动的比喻,带领读者了解云原生的基本概念,探索容器化技术的奥秘,并深入微服务架构的世界。我们将一起见证代码如何转化为现实中的服务,实现快速迭代和高效部署。无论你是初学者还是有经验的开发者,这篇文章都会为你打开一扇通往云原生世界的大门。
|
13天前
|
负载均衡 应用服务中间件 持续交付
微服务架构下的Web服务器部署
【8月更文第28天】随着互联网应用的不断发展,传统的单体应用架构逐渐显露出其局限性,特别是在可扩展性和维护性方面。为了解决这些问题,微服务架构应运而生。微服务架构通过将应用程序分解成一系列小型、独立的服务来提高系统的灵活性和可维护性。本文将探讨如何在微服务架构中有效部署和管理Web服务器实例,并提供一些实际的代码示例。
42 0
|
5天前
|
存储 Java Maven
从零到微服务专家:用Micronaut框架轻松构建未来架构
【9月更文挑战第5天】在现代软件开发中,微服务架构因提升应用的可伸缩性和灵活性而广受欢迎。Micronaut 是一个轻量级的 Java 框架,适合构建微服务。本文介绍如何从零开始使用 Micronaut 搭建微服务架构,包括设置开发环境、创建 Maven 项目并添加 Micronaut 依赖,编写主类启动应用,以及添加控制器处理 HTTP 请求。通过示例代码展示如何实现简单的 “Hello, World!” 功能,并介绍如何通过添加更多依赖来扩展应用功能,如数据访问、验证和安全性等。Micronaut 的强大和灵活性使你能够快速构建复杂的微服务系统。
23 5
|
18天前
|
Kubernetes 安全 微服务
使用 Istio 缓解电信 5G IoT 微服务 Pod 架构的安全挑战
在5G电信领域,Kubernetes集群中部署微服务至关重要,但也带来了重大的安全挑战。Istio作为一个强大的开源服务网格,能有效地管理这些微服务间的通信,通过其控制平面自动将Sidecar代理注入到各微服务Pod中,确保了安全且高效的通信。Istio的架构由数据平面和控制平面组成,其中Sidecar代理作为Envoy代理运行在每个Pod中,拦截并管理网络流量。此外,Istio支持多种Kubernetes发行版和服务,如EKS等,不仅增强了安全性,还提高了应用性能和可观测性。
41 0
使用 Istio 缓解电信 5G IoT 微服务 Pod 架构的安全挑战
|
20天前
|
Java Docker 微服务
微服务架构的概念、特点以及如何在Java Web开发中实现微服务。
微服务架构的概念、特点以及如何在Java Web开发中实现微服务。
46 1
|
21天前
|
Java Docker 微服务
微服务架构已成为Java Web开发的新趋势,它通过将应用分解为独立、可部署的服务单元,提升了系统的灵活性与可维护性。
微服务架构已成为Java Web开发的新趋势,它通过将应用分解为独立、可部署的服务单元,提升了系统的灵活性与可维护性。每个服务负责特定功能,通过轻量通信机制协作。利用Spring Boot与Spring Cloud等框架可简化开发流程,支持模块化设计、独立部署、技术多样性和容错性,适应快速迭代的需求。
59 1
下一篇
DDNS