异步解耦之RabbitMQ(二)_RabbitMQ架构及交换机

异步解耦之RabbitMQ(一)-CSDN博客

RabbitMQ架构

RabbitMQ是一个基于AMQP(Advanced Message Queuing Protocol)协议的消息代理中间件,它通过交换机和队列实现消息的路由和分发。以下是RabbitMQ的架构图:

  1. Producer(生产者):Producer是消息的发送方,它将消息发送到RabbitMQ的交换机。生产者可以是任何发送消息的应用程序。

  2. Exchange(交换机):Exchange是消息的路由器,负责接收来自生产者的消息,并根据预定义的规则将消息路由到一个或多个队列中。RabbitMQ支持多种类型的交换机:直连交换机、主题交换机、扇形交换机和头交换机。每种类型的交换机都根据不同的路由规则将消息转发给队列。

  3. Queue(队列):Queue是消息的缓冲区,用于存储交换机转发的消息。当消息到达队列时,它将等待消费者来处理。每个消息都会被分配到一个特定的队列中,消费者将从该队列中获取消息。

  4. Binding(绑定):Binding是交换机和队列之间的关联关系。通过绑定,交换机可以将消息路由到与之绑定的队列。绑定通常包含一个路由键(routing key),它是交换机将消息路由到队列的依据。

  5. Consumer(消费者):Consumer是消息的接收方,它从队列中获取消息并进行处理。消费者可以是任何接收消息的应用程序。一般情况下,多个消费者可以同时从一个队列中获取消息,并实现消息的并发处理。

RabbitMQ在架构中还包含以下关键特性:

  • Virtual Host(虚拟主机):虚拟主机是逻辑上的独立环境,每个虚拟主机都有自己的交换机、队列和绑定。它们可以帮助不同的应用程序或不同的团队在同一个RabbitMQ服务器上进行隔离。

  • Connection(连接):生产者和消费者与RabbitMQ建立的连接。每个连接可以有多个通道(Channel),通道是在连接中打开的独立会话,用于发送和接收消息。

  • Message Acknowledgement(消息确认):当消费者成功处理一条消息后,它将向RabbitMQ发送一个确认消息。RabbitMQ收到确认后,将从队列中删除该消息。如果消费者在处理消息期间出现故障,消息将被重新投递给其他消费者。

  • Message Durability(消息持久化):通过将消息标记为持久化,可以确保在RabbitMQ服务器重启后消息不会丢失。

  • Dead Letter Exchange(死信交换机):当消息无法被路由到任何队列时,它将被发送到死信交换机。可以配置一个特定的队列来接收这些死信消息,以便进一步处理。

  • Message TTL(消息过期时间):可以为消息设置过期时间,当消息在指定的时间内未被消费者处理时,它将被自动删除。

通过这些组件和特性,RabbitMQ提供了一个灵活可靠的消息传递机制,使得应用程序之间可以进行异步通信,并实现解耦和可伸缩性。

RabbitMQ的核心是交换机和队列。交换机有四种类型:直连交换机、主题交换机、头交换机和扇形交换机。每种类型的交换机都有自己的路由规则,可根据不同场景选择适合的交换机类型。队列则是存储消息的地方,它们会等待消费者来处理消息。

整个系统中的消息流动过程如下:

  1. 生产者将消息发布到交换机上。

  2. 交换机按照特定的路由规则将消息路由到相应的队列上。

  3. 消费者从队列中取出消息并进行处理。

  4. 消费者处理完成后,将消息从队列中删除。

RabbitMQ还提供了一些高级功能,如可靠性保证、消息持久化、优先级队列等。

RabbitMQ的四种交换机

RabbitMQ支持四种类型的交换机:直连交换机(Direct Exchange)、主题交换机(Topic Exchange)、扇形交换机(Fanout Exchange)和头交换机(Headers Exchange)。

1. 直连交换机(Direct Exchange)

直连交换机是最简单的交换机类型之一。它根据消息的路由键(Routing Key)将消息直接路由到与之完全匹配的队列。当生产者发送消息时,会指定一个特定的路由键。交换机会检查消息的路由键与绑定到该交换机的队列的路由键是否完全匹配。如果匹配,消息将被路由到相应的队列中。

直连交换机的特点:

  • 路由键与队列之间的完全匹配。
  • 一对一的消息路由方式。

缺点:

  • 不支持模式匹配和通配符匹配。
  • 灵活性不够。

例子应用场景:

  • 日志系统:根据日志级别将不同级别的日志消息路由到不同的队列。
  • 订单系统:根据订单状态将不同状态的订单消息路由到不同的队列。

2. 主题交换机(Topic Exchange)

主题交换机允许更灵活的消息路由。它使用通配符匹配路由键,并将消息路由到符合通配符表达式的队列中。通配符有两种形式:*代表匹配一个单词,#代表匹配零个或多个单词。例如,路由键是stock.usd.nyse,则通配符是stock.*.*;路由键是stock.usd.nyse.apple,则通配符是stock.#

主题交换机的特点:

  • 路由键与队列之间的通配符匹配。
  • 一对多的消息路由方式。

缺点:

  • 配置相对较复杂,需要了解路由键规则和通配符规则。
  • 性能可能会受到一定影响,因为需要进行模式匹配。

例子应用场景:

  • 新闻发布系统:根据新闻的主题标签将消息路由到对应的队列中。
  • 物联网系统:根据设备类型和区域将消息路由到相应的队列中。

3. 扇形交换机(Fanout Exchange)

扇形交换机是一种广播式的路由机制。它会将接收到的消息广播到所有绑定到该交换机上的队列中,无需考虑路由键的匹配。当生产者发送消息给扇形交换机时,交换机会忽略消息的路由键,而是将消息发送给所有绑定的队列。

扇形交换机的特点:

  • 忽略路由键,广播消息给所有队列。
  • 一对多的消息路由方式。

缺点:

  • 不支持路由键,无法根据不同的路由键进行处理。
  • 可能会有一些冗余的消息,因为所有的队列都会接收相同的消息。

例子应用场景:

  • 实时聊天系统:将聊天消息广播到所有在线用户的队列中。
  • 分布式任务系统:将任务请求广播给所有可用的工作节点。

4. 头交换机(Headers Exchange)

头交换机是根据消息头部信息(Headers)进行路由的交换机。头部信息可以是键值对的形式,生产者在发送消息时可以指定一组键值对。交换机会根据这些键值对与队列绑定时指定的参数进行匹配,如果匹配成功则将消息路由到相应的队列中。

头交换机的特点:

  • 根据消息头部信息进行匹配。
  • 复杂的消息路由方式。

缺点:

  • 配置相对较复杂,需要了解键值对的规则。
  • 性能较低,因为需要进行复杂的匹配操作。

例子应用场景:

  • 消息过滤系统:根据消息的特定属性进行过滤,并将消息路由到相应的队列中。
  • 数据分析系统:根据数据的特征进行分类并将数据路由到不同的队列中。

通过了解这四种交换机类型的原理和特性,我们可以灵活地在RabbitMQ中设计和实现消息传递系统,以满足不同的需求。

无论是直连交换机、主题交换机、扇形交换机还是头交换机,它们都为我们提供了强大的消息路由机制。根据具体的业务需求,我们可以选择合适的交换机类型来构建灵活可靠的消息传递系统。

参考资料:

  • RabbitMQ官方网站:RabbitMQ: easy to use, flexible messaging and streaming — RabbitMQ
  • RabbitMQ文档:Documentation: Table of Contents — RabbitMQ

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/370356.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

LabVIEW风力发电机在线监测

LabVIEW风力发电机在线监测 随着可再生能源的发展,风力发电成为越来越重要的能源形式。设计了一个基于控制器局域网(CAN)总线和LabVIEW的风力发电机在线监测系统,实现风力发电机的实时监控和故障诊断,以提高风力发电的…

ArrayList在添加元素时报错java.lang.ArrayIndexOutOfBoundException

一、添加单个元素数组越界分析 add源码如下 public boolean add(E e) {ensureCapacityInternal(size 1); // Increments modCount!!elementData[size] e;return true; } size字段的定义 The size of the ArrayList (the number of elements it contains). ArrayList的大…

【面试官问】Redis 持久化

目录 【面试官问】Redis 持久化 Redis 持久化的方式RDB(Redis DataBase)AOF(Append Only File)混合持久化:RDB + AOF 混合方式的持久化持久化最佳方式控制持久化开关主从部署使用混合持久化使用配置更高的机器参考文章所属专区

【Django】Cookie和Session的使用

Cookies和Session 1. 会话 从打开浏览器访问一个网站,到关闭浏览器结束此次访问,称之为一次会话。 HTTP协议是无状态的,导致会话状态难以保持。 Cookies和Session就是为了保持会话状态而诞生的两个存储技术。 2. Cookies 2.1 Cookies定…

机器学习系列——(六)数据降维

引言 在机器学习领域,数据降维是一种常用的技术,旨在减少数据集的维度,同时保留尽可能多的有用信息。数据降维可以帮助我们解决高维数据带来的问题,提高模型的效率和准确性。本文将详细介绍机器学习中的数据降维方法和技术&#…

【Linux取经路】进程控制——程序替换

文章目录 一、单进程版程序替换看现象二、程序替换的基本原理三、程序替换接口学习3.1 替换自己写的可执行程序3.2 第三个参数 envp 验证四、结语一、单进程版程序替换看现象 #include <stdio.h> #

Vue学习笔记之组件基础

1、组件的定义 一般将 Vue 组件定义在一个单独的 .vue 文件中&#xff0c;称做单文件组件&#xff1b;当然也可以将组件直接定义在js文件中&#xff0c;如下js代码&#xff0c;定义一个组件BlogPost&#xff0c;通过props定义对外暴露属性title&#xff0c;父组件传递title&am…

List的模拟实现 迭代器

———————————————————— list与vector相比&#xff0c;插入、删除等操作实现的成本非常低&#xff0c;如果在C语言阶段熟悉理解过链表&#xff0c;那么现在实现起来list就显得比较简单&#xff0c;可以说操作层面上比vector更简洁&#xff0c;因为list没有扩…

C++ 动态规划 线性DP 最长上升子序列

给定一个长度为 N 的数列&#xff0c;求数值严格单调递增的子序列的长度最长是多少。 输入格式 第一行包含整数 N 。 第二行包含 N 个整数&#xff0c;表示完整序列。 输出格式 输出一个整数&#xff0c;表示最大长度。 数据范围 1≤N≤1000 &#xff0c; −109≤数列中的数…

istio 限流

#详细参数看官网&#xff0c;我参数就不解释https://istio.io/latest/docs/reference/config/networking/destination-rule/cat << EOF > dr.yaml apiVersion: networking.istio.io/v1alpha3 kind: DestinationRule metadata:name: my-testnamespace: demon spec:hos…

瑞_23种设计模式_抽象工厂模式

文章目录 1 抽象工厂模式&#xff08;Abstract Factory Pattern&#xff09;1.1 概念1.2 介绍1.3 小结1.4 结构 2 案例一2.1 需求2.2 代码实现 3 案例二3.1 需求3.2 代码实现 4 总结4.1 抽象工厂模式优缺点4.2 抽象工厂模式使用场景4.3 抽象工厂模式 VS 工厂方法模式4.4 抽象工…

记一次生产系统每隔10小时(36000000毫秒)固定进行一次Full GC排查思路

一、 背景描述 某个应用在生产环境通过系统监控发现&#xff0c;应用每隔10小时就会触发一次Full GC&#xff0c;该系统当时承接的业务量并不大&#xff0c;而且固定10小时就会进行Full GC&#xff0c;通过监控时间轴发现Full GC频率很规律&#xff0c;直觉告诉我这不是JVM自身…

回归预测 | Matlab实现RIME-CNN-LSTM-Attention霜冰优化卷积长短期记忆网络注意力多变量回归预测(SE注意力机制)

回归预测 | Matlab实现RIME-CNN-LSTM-Attention霜冰优化卷积长短期记忆网络注意力多变量回归预测&#xff08;SE注意力机制&#xff09; 目录 回归预测 | Matlab实现RIME-CNN-LSTM-Attention霜冰优化卷积长短期记忆网络注意力多变量回归预测&#xff08;SE注意力机制&#xff0…

计算机网络-差错控制(奇偶校验码 CRC循环冗余码)

文章目录 差错从何而来从传感器层面提高信道比来减少线路本身的随机噪声的一个例子热噪声和冲击噪声 数据链路层的差错控制检错编码-奇偶校验码检错编码-CRC循环冗余码例子注意 差错从何而来 噪声通常指的是任何未预期的、随机的信号干扰&#xff0c;这些干扰可能源自多种物理…

Python脚本自动去除文档中无用的信息

1.在进行嵌入式开发过程中会遇到此类情况&#xff1a; 想去掉文档中的“//0x20”的信息&#xff0c;手动消除的话会很麻烦&#xff0c;这时用python脚本就很方便。 2.源码&#xff1a; #!/usr/bin/python3# 打开一个文件 f open("test.txt", "r")text …

LabVIEW智能温度直流模件自动测试系统

LabVIEW智能温度直流模件自动测试系统 自动化测试系统在提高测试效率和准确性方面发挥着越来越重要的作用。介绍了一种基于LabVIEW的智能温度直流模件&#xff08;TDCA&#xff09;自动测试系统的设计与实施&#xff0c;旨在提高测控装置的产品质量。 系统的硬件平台主要由PS…

【Boost】:searcher的建立(四)

searcher的建立 一.初始化二.搜索功能三.完整源代码 sercher主要分为两部分&#xff1a;初始化和查找。 一.初始化 初始化分为两步&#xff1a;1.创建Index对象&#xff1b;2.建立索引 二.搜索功能 搜索分为四个步骤 分词&#xff1b;触发&#xff1a;根据分词找到对应的文档…

P4071 [SDOI2016] 排列计数 错排,递归公式

错排公式理解&#xff1a; //f(x)表示1~x的错排数目 // //1选择(x-1种&#xff09; //乘以剩下的总数目就是答案。//(1选了2就接着排2了&#xff0c;这样所有的都可以算到&#xff0c;是递归所以难想)// 选2时 // 2可选 1 和 3~x//2选1&#xff0c;对2开始来说此次总数就是1*f(…

Linux权限【超详细】

&#x1f4d9; 作者简介 &#xff1a;RO-BERRY &#x1f4d7; 学习方向&#xff1a;致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 &#x1f4d2; 日后方向 : 偏向于CPP开发以及大数据方向&#xff0c;欢迎各位关注&#xff0c;谢谢各位的支持 目录 扩展知识&#xff1a…

C++项目 -- 高并发内存池(二)Thread Cache

C项目 – 高并发内存池&#xff08;二&#xff09;Thread Cache 文章目录 C项目 -- 高并发内存池&#xff08;二&#xff09;Thread Cache一、高并发内存池整体框架设计二、thread cache设计1.整体设计2.thread cache哈希桶映射规则3.TLS无锁访问4.thread cache代码 一、高并发…