RabbitMQ精讲10:基础组件架构封装思路

简介: RabbitMQ精讲10:基础组件架构封装思路

目录

1 前言

2 一线大厂的MQ组件实现思路和架构设计思路

3 基础MQ消息组件设计思路-1(迅速,确认,批量,延迟)

迅速消息发送

确认消息发送

批量消息发送

延迟消息发送

4 基础MQ消息组件设计思路-2(顺序)

5 基础MQ消息组件设计思路-3(事务)

6 消息幂等性保障-消息路由规则架构设计思路



1 前言

分享互联网大厂的基础组件架构封装思路,

其中涉及到

  • 消息发送的多模式化、
  • 消息的高性能序列化、
  • 消息的异步化、
  • 连接的缓存容器、
  • 消息的可靠性投递、补偿策略、
  • 消息的幂等解决方案


2 一线大厂的MQ组件实现思路和架构设计思路

一线大厂的MQ组件实现思路和架构设计思路

一线大厂的MQ组件实现思路和架构设计思路

一线大厂的MQ组件实现思路和架构设计思路

一线大厂的MQ组件实现思路和架构设计思路

 

  • 支持高性能的序列化转换, 异步化发送消息
  • 支持消息生产实例与消费实例的链接池化缓存化, 提升性能
  • 支持可靠性投递消息, 保障消息100%不丢失
  • 支持消费端的幂等操作, 避免消费端重复消费的问题
  • 支持迅速消息发送模式, 在一些日志收集/统计分析等需求下可以保证高性能, 高吞吐量
  • 支持延迟消息模式, 消息可以延迟发送, 指定延迟时间, 用于某些延迟检查, 服务限流场景
  • 支持事务消息, 器100%保障可靠性投递, 在金融行业单笔大金额操作时会有此类需求
  • 支持顺序消息, 保证消息送达消费端的先后顺序
  • 支持消息补偿, 重试, 以及快速定位异常/失败消息
  • 支持集群消息负载均衡, 保障消息落到具体SET集群的负载均衡
  • 支持消息路由策略, 指定某些消息路由到指定的SET集群


3 基础MQ消息组件设计思路-1(迅速,确认,批量,延迟)

迅速消息发送

迅速消息发送

 

  • 迅速消息是指消息不进行落库存储, 不做可靠性的保障
  • 在一些非核心消息, 日志数据, 或者统计分析等场景下比较合适
  • 迅速消息的优点就是性能最高, 吞吐量最大


确认消息发送

确认消息发送

 

  • step1, step2 : 业务信息和消息信息入库
  • step3 : 消息发送到MQ Broker
  • step4 : Broker回送一个ACK确认消息
  • step5 : 更新DB中消息状态
  • step6 : 定时任务读取中间状态消息
  • step7 : 执行消息重发
  • step8 : 重发多次依旧失败的消息, 将其置为失败终态


批量消息发送

批量消息发送

批量消息是指我们把消息放到一个集合里统一进行提交, 这种方案设计思路是期望消息在一个会话里, 比如投递到threadlocal里的集合, 然后拥有相同的会话ID, 并且带有这次提交消息的SIZE等相关相关属性, 最重要的一点是要把这一批消息进行合并。对于Channel而言, 就是发送一次消息。这种方式也是希望消费端在消费的时候, 可以进行批量化的消费, 针对于某一个原子业务的操作去处理, 但是不保障可靠性, 需要进行补偿机制。

批量消息发送

  • step1 : 业务数据入库
  • step2 : 消息组装之后进行统一入库(如果不需要可靠性投递的话, 可以省略)
  • step3 : 消息发送到Broker
  • step4-step8基本和确认消息是一致的,如果不需要可靠性投递的话, 是可以省略的


延迟消息发送

延迟消息发送

延迟消息发送

  • 延迟消息就是在Message封装的时候, 添加delayTime属性即可, 使得我们的消息可以进行延迟发送1


4 基础MQ消息组件设计思路-2(顺序)

 

基础MQ消息组件设计思路-2(顺序)

基础MQ消息组件设计思路-2(顺序)

顺序消息有点类似于批量消息的实现机制, 但是有些不同, 顺序消息需要保障一下几点:

  1. 发送的顺序消息, 必须保障消息投递到同一个队列, 且这个消费者只能有一个(独占模式)
  2. 然后需要统一提交(可能是合并成一个大的消息, 也可能是拆分为多个消息), 并且所有消息的会话ID要一致
  3. 添加消息属性 : 顺序标记的序号, 和本次顺序消息的SIZE属性, 进行落库操作
  4. 并行进行发送给自身的延迟消息(带上关键属性 : 会话ID, SIZE)进行后续处理消费
  5. 当收到延迟消息后, 根据会话ID, SIZE抽取数据库数据进行处理即可
  6. 定时轮询补偿机制, 对于异常情况(如生产端消息没有完全投递成功或者消费端落库异常导致消费端落库后缺少消息条目的情况)进行补偿

基础MQ消息组件设计思路-2(顺序)


5 基础MQ消息组件设计思路-3(事务)

事务消息

事务消息

事务消息

事务消息

事务消息

  • 事务消息, 使用相对较少
  • 为了保障性能的同时, 也支持事务。并不推荐选择传统的RabbitMQ事务和Spring集成的机制, 因为在性能测试过程中, 这种方式性能并不理想, 非常消耗系统资源, 且会出现阻塞等情况, 高峰期也是一定程度上影响MQ集群的性能
  • 解决方案 : 采用类似可靠性投递的机制, 也就是补偿机制。但是数据源必须是同一个, 也就是业务操作的数据库DB1和消息记录的数据库DB2使用同一个数据库, 保证DB层的数据一致性
  • 然后利用重写Spring DataSourceTransactionManager, 在本地事务提交的时候进行发送消息, 但是也有可能事务提交成功但是消息发送失败, 这个时候就需要进行补偿了。


6 消息幂等性保障-消息路由规则架构设计思路

消息幂等性保障


可能导致消息出现非幂等性的原因 :

  • 可靠性消息投递机制造成的消息重发
  • MQ Broker服务于消费端消息传输的过程中出现网络抖动
  • 消费端故障或异常


消息幂等性设计 :

消息幂等性设计


相关实践学习
RocketMQ一站式入门使用
从源码编译、部署broker、部署namesrv,使用java客户端首发消息等一站式入门RocketMQ。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
目录
相关文章
|
2月前
|
存储 Kubernetes 负载均衡
Kubernetes的“厨房”:架构是菜谱,组件是厨具,资源对象是食材(下)
本文深入探讨了Kubernetes(K8s)的架构、核心组件以及资源对象。Kubernetes作为一个开源的容器编排系统,通过其独特的架构设计和丰富的组件,实现了对容器化应用程序的高效管理和扩展。通过本文的介绍,读者可以深入了解Kubernetes的架构、核心组件以及资源对象,从而更好地应用和管理容器化应用程序。Kubernetes的灵活性和可扩展性使得它成为容器编排领域的领先者,为企业提供了强大的容器运行环境。
|
3月前
|
SQL 存储 缓存
MySQL - 一文了解MySQL的基础架构及各个组件的作用
MySQL - 一文了解MySQL的基础架构及各个组件的作用
|
2月前
|
设计模式 安全 Java
【分布式技术专题】「Tomcat技术专题」 探索Tomcat技术架构设计模式的奥秘(Server和Service组件原理分析)
【分布式技术专题】「Tomcat技术专题」 探索Tomcat技术架构设计模式的奥秘(Server和Service组件原理分析)
35 0
|
2月前
|
NoSQL Java Redis
【分布式技术专题】「分布式技术架构」手把手教你如何开发一个属于自己的分布式锁的功能组件(二)
【分布式技术专题】「分布式技术架构」手把手教你如何开发一个属于自己的分布式锁的功能组件
15 0
|
15天前
|
消息中间件 存储 数据安全/隐私保护
RabbitMQ组件介绍
【4月更文挑战第25天】RabbitMQ中有几个非常重要的组件:服务实体(Broker)、虚拟主机(Virtual Host)、交换机(Exchange)、队列(Queue)和绑定(Binging)
|
25天前
|
消息中间件 存储 数据库
RabbitMQ入门指南(二):架构和管理控制台的使用
RabbitMQ是一个高效、可靠的开源消息队列系统,广泛用于软件开发、数据传输、微服务等领域。本文主要介绍了RabbitMQ架构和管理控制台的使用等内容。
49 0
RabbitMQ入门指南(二):架构和管理控制台的使用
|
28天前
|
存储 数据库 Android开发
构建高效安卓应用:采用Jetpack架构组件优化用户体验
【4月更文挑战第12天】 在当今快速发展的数字时代,Android 应用程序的流畅性与响应速度对用户满意度至关重要。为提高应用性能并降低维护成本,开发者需寻求先进的技术解决方案。本文将探讨如何利用 Android Jetpack 中的架构组件 — 如 LiveData、ViewModel 和 Room — 来构建高质量的安卓应用。通过具体实施案例分析,我们将展示这些组件如何协同工作以实现数据持久化、界面与逻辑分离,以及确保数据的即时更新,从而优化用户体验并提升应用的可维护性和可测试性。
|
2月前
|
SpringCloudAlibaba Java 持续交付
【Springcloud Alibaba微服务分布式架构 | Spring Cloud】之学习笔记(一)基础知识+各个组件介绍+聚合父工程创建
【Springcloud Alibaba微服务分布式架构 | Spring Cloud】之学习笔记(一)基础知识+各个组件介绍+聚合父工程创建
129 1
|
2月前
|
Kubernetes API 调度
Kubernetes的“厨房”:架构是菜谱,组件是厨具,资源对象是食材(上)
本文深入探讨了Kubernetes(K8s)的架构、核心组件以及资源对象。Kubernetes作为一个开源的容器编排系统,通过其独特的架构设计和丰富的组件,实现了对容器化应用程序的高效管理和扩展。通过本文的介绍,读者可以深入了解Kubernetes的架构、核心组件以及资源对象,从而更好地应用和管理容器化应用程序。Kubernetes的灵活性和可扩展性使得它成为容器编排领域的领先者,为企业提供了强大的容器运行环境。
|
2月前
|
消息中间件 存储 Cloud Native
深度剖析 RocketMQ 5.0,架构解析:云原生架构如何支撑多元化场景?
了解 RocketMQ 5.0 的核心概念和架构概览;然后我们会从集群角度出发,从宏观视角学习 RocketMQ 的管控链路、数据链路、客户端和服务端如何交互;学习 RocketMQ 如何实现数据的存储,数据的高可用,如何利用云原生存储进一步提升竞争力。
140114 2