在RabbitMQ中四种常见的消息路由模式

devtools/2024/9/20 4:47:22/ 标签: rabbitmq, 分布式

1. Fanout模式

Fanout模式的交换机是扇出交换机Fanout Exchange),它会将消息广播给所有绑定到它的队列,而不考虑消息的内容或路由键。

工作原理:
  • 生产者发送消息到Fanout Exchange
  • Fanout Exchange会将消息广播给所有绑定到它的队列,所有绑定的队列都会收到这条消息。
  • 消费者监听绑定的队列,处理收到的消息。
特点:
  • 没有路由键:消息不需要路由键,所有绑定的队列都会接收到消息。
  • 广播机制:消息会被广播到所有与交换机绑定的队列,而不管消息内容。
应用场景:
  • 广播系统消息:适合需要通知多个服务模块或系统节点的场景。
  • 日志系统:将日志消息广播到多个日志处理服务。
exchange_type = 'fanout'
exchange = channel.exchange_declare(exchange='logs', exchange_type=exchange_type)

2. Direct模式

Direct模式使用直连交换机Direct Exchange),通过消息的**路由键(Routing Key)**来精确匹配队列。如果生产者的消息路由键和队列绑定的路由键相同,消息就会被分发到该队列。

工作原理:
  • 生产者发送带有路由键的消息到Direct Exchange
  • Direct Exchange根据消息的路由键,将消息精确地分发给绑定了相同路由键的队列。
  • 消费者监听对应的队列,处理符合路由键的消息。
特点:
  • 精确路由:消息根据路由键精确匹配队列。
  • 一对一或多对一:不同队列可以绑定不同的路由键,确保只有匹配的队列收到消息。
应用场景:
  • 日志系统:将不同级别的日志(info、error、warning)发送到不同的日志处理队列。
  • 分布式任务:根据任务类型(如task_type_1task_type_2)精确分发任务
exchange_type = 'direct'
exchange = channel.exchange_declare(exchange='direct_logs', exchange_type=exchange_type)# Binding with specific routing key
channel.queue_bind(exchange='direct_logs', queue='error_logs', routing_key='error')

3. Topic模式

Topic模式使用主题交换机Topic Exchange),允许使用通配符进行消息路由。消息的路由键由一个点分隔的字符串组成,队列可以通过通配符绑定到交换机,实现模糊匹配。

工作原理:
  • 生产者发送带有路由键的消息到Topic Exchange,路由键由点分隔的多个单词组成,例如"logs.info", "user.create", "order.payment.success".
  • 队列绑定到Topic Exchange时,可以使用通配符匹配多个路由键:
    • *匹配一个单词。
    • #匹配零个或多个单词。
  • 消费者监听队列,接收符合通配符规则的消息。
特点:
  • 模糊匹配:消息根据路由键的模式进行模糊匹配。
  • 灵活路由:支持复杂的路由需求,允许将相似类别的消息路由到同一个队列。
应用场景:
  • 消息分类处理:适合需要对复杂系统中的消息进行分类的场景,比如基于用户操作类型、订单状态等。
  • 多模块事件处理:可以为不同的模块创建灵活的订阅机制。
exchange_type = 'topic'
exchange = channel.exchange_declare(exchange='topic_logs', exchange_type=exchange_type)# Binding queue with topic patterns
channel.queue_bind(exchange='topic_logs', queue='system_logs', routing_key='logs.*')
channel.queue_bind(exchange='topic_logs', queue='all_logs', routing_key='#')

4. 头部模式

头部模式使用头部交换机Headers Exchange),不同于Direct和Topic模式,它不是通过路由键来路由消息,而是通过消息的头部属性来路由。队列绑定到交换机时会指定一组头部键值对,只有当消息的头部属性匹配这些键值对时,消息才会被路由到相应的队列。

工作原理:
  • 生产者发送带有头部属性的消息到Headers Exchange
  • 队列绑定到Headers Exchange时,会指定匹配条件(例如x-match=all表示所有头部键值对都必须匹配,x-match=any表示只要有一个匹配即可)。
  • 交换机根据头部属性将消息分发给符合条件的队列。
特点:
  • 基于头部字段路由:不依赖路由键,消息的头部属性决定消息的路由。
  • 更复杂的路由逻辑:适合需要根据多种属性组合来路由的场景。
应用场景:
  • 消息过滤:适合需要根据消息的多个属性来进行复杂过滤的场景,比如需要根据来源、优先级等多个条件筛选消息。
  • 高度灵活的路由逻辑:当单纯依赖路由键不足以满足需求时,使用头部模式更合适。
exchange_type = 'headers'
exchange = channel.exchange_declare(exchange='header_logs', exchange_type=exchange_type)# Binding queue with header matching criteria
channel.queue_bind(exchange='header_logs', queue='error_logs', arguments={'x-match': 'all', 'type': 'error', 'format': 'json'})


http://www.ppmy.cn/devtools/114408.html

相关文章

3.数据类型

作业系统链接 Python 是一门面向对象友好的语言,支持多种内置数据类型,包括整数(int)、浮点数(float)、布尔值(bool)、字符串(str)、列表(list&am…

教育培训小程序开发,简单实用的入门指南

教育培训小程序可以帮助教育机构和个人老师提供更灵活的在线教学服务,满足学生的学习需求。对于初学者来说,开发一个功能齐全的教育培训小程序并不复杂,只需掌握一些基础的开发知识和工具即可。本文将带你了解如何使用微信小程序开发工具&…

linux入门到实操-4 linux系统网络配置、连接测试、网络连接模式、修改静态IP、配置主机名

教程来源:B站视频BV1WY4y1H7d3 3天搞定Linux,1天搞定Shell,清华学神带你通关_哔哩哔哩_bilibili 整理汇总的课程内容笔记和课程资料(包含课程同版本linux系统文件等内容),供大家学习交流下载:…

Android 系统开发人员的权限说明文档

文档地址:frameworks/base/core/java/android/permission/Permissions.md 大家在这个文档中看到实例:frameworks/base/core/res/AndroidManifest.xml 自己使用工具翻译,里面可能有错误,欢迎指正 正文 This document targets s…

android 老项目中用到的jar包不存在,通过离线的方法加载

1、之前的项目用的jar包,已经不在远程仓库中,只能手工去下载,并且安装。 // implementation com.github.nostra13:Android-Universal-Image-Loader // implementation com.github.lecho:hellocharts-android:v1.5.8 这…

【docker】命令之容器操作

一、前言 在上篇博客介绍了关于如何从应用市场,下载镜像后,对镜像的相关操作了。这篇博客呢我们就要讲解我们把镜像下载下来了,启动这个镜像后,就是我们说的容器了,那么容器的具体操作又有那些呢? 二、容器…

linux-系统管理与监控-磁盘管理

Linux 系统管理与监控:磁盘管理 一、概述 在 Linux 系统中,磁盘管理是系统管理员日常维护的一个重要部分。合理管理和监控磁盘使用情况,可以确保系统的稳定运行,并有效利用存储资源。磁盘管理涉及的内容包括查看磁盘信息、创建和…

面向开发者的LLM入门教程(学习笔记01)

关注B站可以观看更多实战教学视频:hallo128的个人空间 面向开发者的LLM入门教程(学习笔记01) 吴恩达老师的《Prompt Engineering for Developer》课程 一、简介 1.LLM的定义 大语言模型(LLM) 的更强大功能是能通过…

OpenCV结构分析与形状描述符(23)确定一个点是否位于多边形内的函数pointPolygonTest()的使用

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 进行点在轮廓内的测试。 该函数确定点是在轮廓内、轮廓外,还是位于一条边上(或与顶点重合)。它返回正值&…

设计模式(Design Patterns)

设计模式(Design Patterns)是软件开发人员在软件设计过程中面临的一般性问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。设计模式的目的是为了提高代码的可重用性、可维护性、可读性、可靠性以及灵活性。设…

java项目之编程训练系统源码(springboot)

风定落花生,歌声逐流水,大家好我是风歌,混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的编程训练系统。项目源码以及部署相关请联系风歌,文末附上联系信息 。 项目简介: 编程训练系统的主要使用者管…

2024年9月HarmonyOS鸿蒙应用开发者高级认证全新题库(覆盖99%考题)

一个小时通过鸿蒙高级认证 1、在开发 Harmony0S 应用工程时, 随着业务的发展,现在需要创建一个模块, 关于在 DevEco Studio 中创建 Module , 下列选项哪种方式是错误的? 必对 在 hvigor 目录下,单击鼠标右键&#xf…

【HarmonyOS】云开发-云数据库(二)

背景 书接上回,实现了云侧和端侧的云数据库创建、更新、修改等操作。这篇文章实现调用云函数对云数据库进行增删改查。 CloudProgram 项目配置 新建函数 在cloudfunctions目录下点击右键,选择新建Cloud Function,输入query-student-functi…

Android 设计模式

设计模式六大原则 单一职责原则(Single Responsibility Principle, SRP) 每个类应该仅有一个引起它变化的原因。 这意味着一个类只应该专注完成一项任务或功能。 举例 考虑一个 User 类,用于表示用户信息,例如用户名和密码。如…

4. 如何在Java中使用HikariCP或C3P0来管理MySQL数据库连接池?

在Java中使用连接池来管理数据库连接是一种常见的做法,能够显著提高应用程序的性能和资源利用率。HikariCP 和 C3P0 是两种常用的数据库连接池实现。下面将分别介绍如何在Java中使用这两种连接池来管理MySQL数据库连接。 1. 使用HikariCP管理MySQL数据库连接池 1.1 …

亲测有效,长期有效的RTSP流地址公网RTSP地址,各种类型的视频源

我们经常需要做一些实时视频流的测试,但是手边又没有办法及时弄到一个摄像机,我们经常会去搜索一下“公网RTSP地址”,但是大部分现在都失效了,有什么办法能够让我们快速构建一个RTSP流,点几下就能直接用? …

C++核心编程和桌面应用开发 第一天(命名空间 using 内联函数 默认参数 C++和C的不同)

目录 1.C的编程方式 2.双冒号::运算符 3.命名空间 3.1作用 3.2命名空间内的东西 3.3注意事项 4.using的用法 4.1using的声明 4.2using编译指令 5.C相较于C的增强 5.1全局变量检测增强 5.2函数检测增强 5.3类型转换检测增强 5.4结构体增强 5.5三目运算符增强 5.…

Spring Boot-定时任务问题

Spring Boot 定时任务问题及其解决方案 1. 引言 在企业级应用中,定时任务是一项常见需求,通常用于自动化执行某些操作,如数据备份、日志清理、系统监控等。Spring Boot 提供了简洁易用的定时任务机制,允许开发者通过简单的配置来…

笔试强训day15

平方数 牛妹是一个喜欢完全平方数的女孩子。 牛妹每次看到一个数 x,都想求出离 x 最近的完全平方数 y。 每次手算太麻烦,所以牛妹希望你能写个程序帮她解决这个问题。 形式化地讲,你需要求出一个正整数 y,满足 y 可以表示成 a2a^…

网页打开时,下载的文件xhr类型有什么作用?

网页打开时下载的文件xhr类型主要用于与服务器交互数据,实现网页的动态更新和内容局部加载。‌ XMLHttpRequest(XHR)对象是浏览器内置的一个功能强大的Web API,它允许网页通过JavaScript向服务器发出请求并处理响应,而…