MQ消息路由大揭秘!从菜鸟到高手,一文带你玩转消息传递的‘高速公路’,轻松实现订单秒级响应!

简介: 【8月更文挑战第24天】在现代分布式系统中,消息队列(MQ)作为系统间解耦的核心工具,支持异步处理、负载均衡及高可用性。消息路由是MQ中的关键环节,决定消息从生产者到消费者的路径。主流MQ产品如RabbitMQ、Kafka等采用相似的路由机制,涉及交换器、队列、路由键等概念。常见的路由模式包括直接交换、主题交换及发布/订阅模式。以RabbitMQ为例,通过直接交换模式,可以根据订单类型(如“普通订单”、“紧急订单”)将消息路由至相应的处理队列。这一过程展示了MQ系统如何基于路由键和队列绑定关系实现消息的有效传递。

在现代分布式系统中,消息队列(Message Queue,简称MQ)扮演着至关重要的角色,它不仅是系统间解耦的利器,也是实现异步处理、负载均衡和高可用性的关键组件。而消息的路由,则是MQ系统中一个核心且复杂的议题,它决定了消息如何从生产者到达指定的消费者。今天,我们就来聊聊MQ消息是如何被路由的,并通过一个简化的示例来加深理解。

消息路由的基本概念
消息路由,简而言之,就是确定消息从生产者发送到哪个或哪些消费者的过程。不同的MQ产品(如RabbitMQ、Kafka、ActiveMQ等)有着不同的路由机制,但基本原理相通。这些机制通常依赖于交换器(Exchange)、队列(Queue)、路由键(Routing Key)、主题(Topic)等概念。

路由的几种常见模式
直接交换(Direct Exchange):在这种模式下,消息会被发送到一个具体的队列,这个队列由消息的路由键唯一确定。如果路由键与队列的绑定键完全匹配,消息才会被投递到该队列。
主题交换(Topic Exchange):与直接交换不同,主题交换允许路由键和绑定键进行模式匹配。路由键可以包含多个单词,用.分隔,而绑定键可以包含通配符#(匹配一个或多个单词)和*(匹配一个单词)。
发布/订阅(Pub/Sub):虽然这不是一个具体的路由模式,但发布/订阅模式在消息路由中非常常见。生产者(发布者)将消息发送到一个主题,所有订阅了该主题的消费者都能接收到消息。
示例:RabbitMQ中的直接交换路由
假设我们有一个订单处理系统,订单信息需要通过MQ发送到不同的处理队列中,根据订单类型(如“普通订单”、“紧急订单”)来决定路由到哪个队列。

首先,我们定义两个队列:normal_orders和urgent_orders,分别用于处理普通订单和紧急订单。

bash

声明队列

rabbitmqadmin declare queue --name=normal_orders
rabbitmqadmin declare queue --name=urgent_orders

绑定队列到交换器(这里使用默认的直接交换''),并指定路由键

rabbitmqadmin declare binding source= source_type=direct destination=normal_orders routing_key=normal
rabbitmqadmin declare binding source= source_type=direct destination=urgent_orders routing_key=urgent
然后,生产者发送消息时,根据订单类型设置路由键:

python

假设这是使用pika库的Python代码片段

import pika

connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
channel = connection.channel()

发送普通订单

channel.basic_publish(exchange='', routing_key='normal', body='普通订单信息...')

发送紧急订单

channel.basic_publish(exchange='', routing_key='urgent', body='紧急订单信息...')

connection.close()
这样,MQ系统就会根据路由键将消息路由到相应的队列中,消费者再从各自的队列中取出消息进行处理。

通过上述示例,我们可以看到MQ消息路由的基本流程:生产者发送消息时指定路由键,MQ系统根据路由键和队列的绑定关系,将消息路由到相应的队列,最后由消费者从队列中取出消息进行处理。不同的MQ产品和不同的路由模式,可能会有不同的配置和细节,但基本原理是相通的。

相关实践学习
消息队列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
相关文章
|
3月前
|
机器人 C# 人工智能
智能升级:WPF与人工智能的跨界合作——手把手教你集成聊天机器人,打造互动新体验与个性化服务
【8月更文挑战第31天】聊天机器人已成为现代应用的重要组成部分,提供即时响应、个性化服务及全天候支持。随着AI技术的发展,聊天机器人的功能日益强大,不仅能进行简单问答,还能实现复杂对话管理和情感分析。本文通过具体案例分析,展示了如何在WPF应用中集成聊天机器人,并通过示例代码详细说明其实现过程。使用Microsoft的Bot Framework可以轻松创建并配置聊天机器人,增强应用互动性和用户体验。首先,需在Bot Framework门户中创建机器人项目并编写逻辑。然后,在WPF应用中添加聊天界面,实现与机器人的交互。
98 0
|
6月前
|
消息中间件 Java Unix
MQ产品使用合集之消费订单状态,订单消费待支付消息失败,是否会导致其他订单也没法消费
消息队列(MQ)是一种用于异步通信和解耦的应用程序间消息传递的服务,广泛应用于分布式系统中。针对不同的MQ产品,如阿里云的RocketMQ、RabbitMQ等,它们在实现上述场景时可能会有不同的特性和优势,比如RocketMQ强调高吞吐量、低延迟和高可用性,适合大规模分布式系统;而RabbitMQ则以其灵活的路由规则和丰富的协议支持受到青睐。下面是一些常见的消息队列MQ产品的使用场景合集,这些场景涵盖了多种行业和业务需求。
|
6月前
|
消息中间件 RocketMQ Docker
分布式事物【RocketMQ事务消息、Docker安装 RocketMQ、实现订单微服务、订单微服务业务层实现】(八)-全面详解(学习总结---从入门到深化)
分布式事物【RocketMQ事务消息、Docker安装 RocketMQ、实现订单微服务、订单微服务业务层实现】(八)-全面详解(学习总结---从入门到深化)
92 0
|
6月前
|
消息中间件 数据库 RocketMQ
Springboot+RocketMQ通过事务消息优雅的实现订单支付功能
RocketMQ的事务消息,是指发送消息事件和其他事件需要同时成功或同时失败。比如银行转账, A银行的某账户要转一万元到B银行的某账户。A银行发送“B银行账户增加一万元”这个消息,要和“从A银 行账户扣除一万元”这个操作同时成功或者同时失败。RocketMQ采用两阶段提交的方式实现事务消息。
253 0
|
6月前
|
消息中间件 RocketMQ Docker
分布式事物【RocketMQ事务消息、Docker安装 RocketMQ、实现订单微服务、订单微服务业务层实现】(八)-全面详解(学习总结---从入门到深化)(下)
分布式事物【RocketMQ事务消息、Docker安装 RocketMQ、实现订单微服务、订单微服务业务层实现】(八)-全面详解(学习总结---从入门到深化)
59 0
|
6月前
|
消息中间件 RocketMQ Docker
分布式事物【RocketMQ事务消息、Docker安装 RocketMQ、实现订单微服务、订单微服务业务层实现】(八)-全面详解(学习总结---从入门到深化)(上)
分布式事物【RocketMQ事务消息、Docker安装 RocketMQ、实现订单微服务、订单微服务业务层实现】(八)-全面详解(学习总结---从入门到深化)
205 0
|
消息中间件 NoSQL Java
使用RabbitMQ实现未支付订单在30分钟后自动过期
使用RabbitMQ实现未支付订单在30分钟后自动过期
使用RabbitMQ实现未支付订单在30分钟后自动过期
|
消息中间件 Java Kafka
从零搭建基于SpringBoot的秒杀系统(六):使用RabbitMQ让订单指定时间后失效
消息中间件属于分布式系统中一个子系统,关注于数据的发送和接收,利用高效可靠的异步消息传递机制对分布式系统中的其余各个子系统进行集成。java中常用的消息中间件有ActiveMQ、RabbitMQ、Kafka等等。消息中间件的作用主要有系统解耦、异步调用、流量削峰等等。
从零搭建基于SpringBoot的秒杀系统(六):使用RabbitMQ让订单指定时间后失效
|
消息中间件 Java
Java秒杀系统实战系列~RabbitMQ死信队列处理超时未支付的订单
摘要:本篇博文是“Java秒杀系统实战系列文章”的第十篇,本篇博文我们将采用RabbitMQ的死信队列的方式处理“用户秒杀成功生成订单后,却迟迟没有支付”的情况,一起来见识一下RabbitMQ死信队列在实际业务环境下的强大之处! 内容:对于消息中间件RabbitMQ,Debug其实在前面的篇章中已...
7736 0
|
23天前
|
消息中间件 JSON Java
开发者如何使用轻量消息队列MNS
【10月更文挑战第19天】开发者如何使用轻量消息队列MNS
63 5