RabbitMQ的应用场景以及基本原理介绍
rabbitmq应用实例

rabbitmq应用实例RabbitMQ是一个流行的开源消息中间件,它可以帮助我们简化分布式系统之间的通信,并提高系统的可靠性。
以下是RabbitMQ的应用实例:1. 分布式任务队列在一个大型的分布式系统中,任务通常会被分配到多个节点进行并行处理。
在这种情况下,我们可以使用RabbitMQ来实现一个分布式的任务队列。
例如,一个电商网站可能需要在每天的晚上对所有商品的价格进行重新计算。
这个任务可能需要数小时才能完成,因此我们可以将这个任务分解成许多小的子任务,并将它们分配给多个节点进行处理。
节点可以使用RabbitMQ从任务队列中获取需要处理的消息,并将处理结果发送回队列中。
2. 日志收集器在一个分布式的系统中,各个节点可能会生成大量的日志文件。
为了方便管理和分析这些日志文件,我们可以使用RabbitMQ来实现一个日志收集器。
例如,一个在线电商网站可能需要追踪用户在网站上的行为。
这个过程会产生大量的日志文件,这些日志文件可能存储在不同的节点上。
我们可以使用RabbitMQ来收集这些日志文件,将它们发送到一个中央的日志处理节点,然后进行统一的处理和分析。
3. 消息推送在一个在线系统中,我们经常需要向用户发送推送通知。
我们可以使用RabbitMQ来实现一个消息推送的系统。
例如,一个在线聊天应用程序可能需要将用户之间的消息发送到相应的用户。
通过使用RabbitMQ,我们可以将消息发送到一个中央的消息队列中,然后从队列中获取消息并将其发送给相应的用户。
4. 事件驱动架构在一个分布式的系统中,我们经常需要使用事件来触发系统内的各个流程。
我们可以使用RabbitMQ来实现一个事件驱动的架构。
例如,在一个电商网站中,当一个用户下单时,我们可以使用RabbitMQ来发布一个订单事件。
这个事件可以触发其他部分的系统响应,例如库存管理系统可以更新库存,财务系统可以生成账单等。
总之,RabbitMQ是一个功能强大的消息中间件,可以帮助我们有效地组织分布式系统之间的通信。
rabbitmq运行机制和原理

rabbitmq运行机制和原理RabbitMQ是一个开源的消息代理软件,它支持多种消息协议。
RabbitMQ使用AMQP(Advanced Message Queuing Protocol)协议来进行消息处理。
它通常用于构建异步通信架构和分布式系统。
本文将对RabbitMQ的运行机制和原理进行详细阐述。
1. 客户端连接RabbitMQ面向TCP连接,客户端使用TCP连接进行与RabbitMQ服务器的通信。
客户端使用AMQP协议与RabbitMQ交换消息,AMQP协议定义了消息如何格式化,通过哪些路由来传递。
2. 交换机当客户端向RabbitMQ发送消息时,它需要指定消息的目标。
目标由交换机和路由键两部分组成。
交换机的作用是将消息路由到一个或多个队列中。
在RabbitMQ中,有四种交换机类型:直接交换机(direct exchange)、分发交换机(fanout exchange)、主题交换机(topic exchange)和标头交换机(headers exchange)。
3. 队列队列是RabbitMQ中的基本消息存储区。
当消息进入队列时,它是没有路由键的,队列会将消息放置到与消费者预订队列相对应的队列中。
队列中的消息只能被一个消费者消费,这是因为消费者通常需要对消息进行修改或处理。
4. 绑定绑定是交换机和队列之间的关系。
在RabbitMQ中,当消息进入交换机时,必须指定一个路由键。
交换机使用该键将消息传递到一个队列中。
一个交换机可以绑定到多个队列,一个队列也可以绑定到多个交换机。
5. 生产者和消费者生产者负责将消息发送到RabbitMQ服务器,消费者则从RabbitMQ服务器读取消息并进行处理。
生产者和消费者必须处理RabbitMQ中的连接、交换和队列等信息。
6. 消息确认RabbitMQ提供了两种消息确认模式:一种是自动确认模式,另一种则是显式确认模式。
在自动确认模式下,消费者消费消息后,服务器就会立即将其标记为已确认。
java rabbitmq延时队列的实现原理和应用实例

java rabbitmq延时队列的实现原理和应用实例RabbitMQ 是一个开源的消息代理软件,它允许在应用程序之间发送和接收消息。
RabbitMQ 支持多种消息协议,如 AMQP、MQTT、STOMP 等,并且可以与许多编程语言集成,包括 Java。
延时队列是一种特殊类型的队列,其中的消息只有在指定的延迟时间过后才能被消费。
这在处理一些需要延迟处理的任务时非常有用,例如处理日志文件、周期性任务等。
以下是 RabbitMQ 实现延时队列的原理和应用实例:实现原理RabbitMQ 的延时队列是通过 RabbitMQ 的插件"rabbitmq_delayed_message_exchange" 来实现的。
这个插件在RabbitMQ 中创建了一个特殊的交换器类型,称为 "delayed message exchange"。
这个交换器的工作原理是:当一个消息被发布到这个交换器时,RabbitMQ 会先保存这个消息,并设置一个延迟时间。
在延迟时间过后,RabbitMQ 会将这个消息发送到绑定的队列中。
应用实例以下是一个简单的 Java 应用实例,演示了如何使用 RabbitMQ 的延时队列:1. 首先,需要在 RabbitMQ 中安装"rabbitmq_delayed_message_exchange" 插件。
这可以通过在RabbitMQ 的命令行界面运行以下命令来完成:```shellrabbitmq-plugins enable rabbitmq_delayed_message_exchange```2. 在 Java 应用中,需要添加 RabbitMQ 的依赖库。
这可以通过 Maven 或Gradle 来完成。
以下是一个 Maven 的示例:```xml<dependency><groupId></groupId><artifactId>amqp-client</artifactId><version></version></dependency>```3. 在 Java 代码中,创建一个 ConnectionFactory 对象,并设置RabbitMQ 服务器的地址:```javaConnectionFactory factory = new ConnectionFactory(); ("localhost");```4. 创建一个 Connection 对象,并创建一个 Channel 对象:```javaConnection connection = ();Channel channel = ();```5. 创建一个 DelayedMessageExchange 对象,并设置它的名称和类型:```javaDelayedMessageExchange exchange = new DelayedMessageExchange("delayed-exchange", "x-delayed-message");```6. 创建一个 QueueingConsumer 对象,并设置它的回调函数:```javaQueueingConsumer consumer = new QueueingConsumer(channel); (new DefaultConsumerCallback() {public void handleDelivery(String consumerTag, Envelope envelope, properties, byte[] body) throws IOException {long delay = ("x-delay"); // 获取延迟时间(毫秒)("Received delayed message after " + delay + " ms: " + new String(body, "UTF-8")); // 输出消息内容}});```。
rabbitmq知识点

rabbitmq知识点
RabbitMQ是一种开源的消息代理软件,用于在应用程序之间传递消息。
RabbitMQ是一种可靠、可扩展、易于部署的消息系统,可以用于处理高容量的数据流,并支持多种协议。
以下是关于RabbitMQ 的一些知识点:
1. RabbitMQ的工作原理
RabbitMQ使用AMQP(高级消息队列协议)来进行消息传递。
它包含一个消息发布者、一个消息代理(RabbitMQ服务器)和一个或多个消息消费者。
发布者将消息发送到消息代理,代理将消息存储在一个队列中,等待消费者来消费它。
2. RabbitMQ的应用场景
RabbitMQ在异步通信场景中应用广泛,如:分布式系统、微服务架构、多语言环境、消息队列和任务队列等场景。
3. RabbitMQ的重要概念
RabbitMQ中的重要概念包括:消息、生产者、消费者、交换机、队列、绑定、路由键等。
4. RabbitMQ的可靠性保证
RabbitMQ具有可靠性保证,可以通过消息的确认、持久化等机制来确保消息不会丢失或重复消费。
5. RabbitMQ的高可用性
RabbitMQ支持集群部署,可以实现高可用性和负载均衡,提高系统的稳定性和可用性。
6. RabbitMQ的性能优化
在使用RabbitMQ时需要注意性能优化,如:使用消息压缩、消息批量发送、消息预取等措施来提高RabbitMQ的性能。
7. RabbitMQ的安全性
RabbitMQ支持SSL和TLS等安全机制,可以确保消息传递的安全性和可靠性。
以上是关于RabbitMQ的一些知识点,希望对大家有所帮助。
rabbitmq延迟队列原理

rabbitmq延迟队列原理RabbitMQ延迟队列原理随着消息队列的应用越来越广泛,我们可以看到越来越多的情况需要我们使用延迟队列来解决问题。
RabbitMQ是一个主流的开源消息队列,在RabbitMQ中我们也可以使用延迟队列来完成一些需求。
本文主要介绍RabbitMQ延迟队列的原理。
一、什么是延迟队列?延迟队列即在消息发送过程中,可以指定消息的生存时间TTL,当TTL时间到达时,消息才会被消费。
这样可以将消息暂时保存在队列中,确保队列中的消息在一定时间后才会被消费。
二、如何实现延迟队列?在RabbitMQ中,实现延迟队列有两种方式:1. 使用x-delayed-message插件RabbitMQ提供了一个称为延迟插件(x-delayed-message)的插件,该插件可用于实现延迟队列。
该插件提供了一个专用的x-delayed-message交换机类型,它可以按照指定的时间对消息进行延迟处理。
2. 使用消息TTL和DLXRabbitMQ中生产消息时可以设置TTL(Time To Live),表示消息的生存时间。
当消息的生存时间到达后,消息会被队列从队列中删除。
我们也可以使用死信交换机(Dead Letter Exchange,DLX),将已经存在一定时间的消息转移到另一个队列中,以实现消息的延迟处理。
三、延迟队列的实现机制使用插件方式:1. 安装插件使用rabbitmq-plugins命令安装插件,例如:rabbitmq-plugins enable rabbitmq_delayed_message_exchange2. 创建延迟交换机创建x-delayed-message类型的延迟交换机,例如:channel.exchangeDeclare("delayed_exchange", "x-delayed-message", true, false, new HashMap<String, Object>() {{put("x-delayed-type", "direct");}});3. 创建队列创建一个普通的队列,例如:channel.queueDeclare("delayed_queue", true, false, false, null);4. 绑定交换机和队列将队列绑定到延迟交换机上,例如:channel.queueBind("delayed_queue", "delayed_exchange", "delayed_queue", new HashMap<String, Object>() {{put("x-delay", 5000);}});使用TTL和DLX方式:1. 创建队列创建一个普通的队列,例如:channel.queueDeclare("queue", true, false, false, new HashMap<String, Object>() {{put("x-dead-letter-exchange", "dlx_exchange");put("x-dead-letter-routing-key", "dlx_routing_key");}});2. 创建DLX创建一个DLX,将队列绑定到该DLX上,例如:channel.exchangeDeclare("dlx_exchange", "direct", true, false,null);channel.queueDeclare("dlx_queue", true, false, false, null); channel.queueBind("dlx_queue", "dlx_exchange","dlx_routing_key", null);3. 发送消息发送一个带有TTL属性的消息到队列中,例如:AMQP.BasicProperties.Builder builder = newAMQP.BasicProperties.Builder();builder.expiration("5000");channel.basicPublish("", "queue", builder.build(), "Hello, RabbitMQ!".getBytes());四、延迟队列的应用场景1. 订单支付超时在电商平台的订单系统中,如果用户在规定时间内未完成支付,系统需要取消该订单。
rabbitmq 知识点总结

rabbitmq 知识点总结RabbitMQ 知识点总结RabbitMQ 是一个开源的消息中间件,它实现了高级消息队列协议(AMQP),主要用于应用程序之间的异步消息传递。
本文将对RabbitMQ 的相关知识点进行总结,包括基本概念、主要特性、使用场景以及与其他消息队列系统的比较等。
一、基本概念1. 消息队列:消息队列是一种存储消息的容器,应用程序可以通过消息队列进行异步通信,发送方将消息放入队列,接收方从队列中获取消息进行处理。
2. 生产者:生产者是消息的发送方,将消息发送到队列中。
3. 消费者:消费者是消息的接收方,从队列中获取消息并进行处理。
4. 队列:队列是消息的存储空间,消息按照先进先出(FIFO)的顺序进行存储和处理。
二、主要特性1. 可靠性:RabbitMQ 提供了多种机制来保证消息的可靠性,如消息持久化、消息确认机制等。
2. 灵活的路由:RabbitMQ 支持多种路由方式,如直连路由、主题路由、扇型路由等,可以根据需求灵活地进行消息路由。
3. 高并发:RabbitMQ 采用多线程模型,可以支持高并发的消息处理。
4. 可扩展性:RabbitMQ 支持集群部署,可以通过增加节点来实现系统的水平扩展。
5. 消息确认机制:RabbitMQ 提供了消息确认机制,可以确保消息被消费者正确接收,避免消息丢失或重复消费的问题。
三、使用场景1. 异步任务处理:将耗时的任务放入消息队列中,由消费者异步处理,提高系统的并发能力。
2. 应用解耦:通过消息队列实现应用之间的解耦,提高系统的可维护性和可扩展性。
3. 流量削峰:当系统并发请求过多时,可以将请求放入消息队列中,由消费者按照系统处理能力进行消费,避免系统崩溃或响应变慢。
4. 日志收集:将系统日志通过消息队列发送到日志处理系统,实现日志的集中存储和分析。
5. 分布式系统:在分布式系统中,可以使用 RabbitMQ 进行消息传递和协调。
四、与其他消息队列系统的比较1. ActiveMQ:RabbitMQ 相对于 ActiveMQ 来说,性能更高、可靠性更好,而且支持更多的特性和协议。
2021-04-25RabbitMQ七种队列模式应用场景案例分析(通俗易懂)

RabbitMQ 七种队列模式应用场景案例分析(通俗易懂)七种模式介绍与应用场景简单模式(Hello World)做最简单的事情,一个生产者对应一个消费者,RabbitMQ相当于一个消息代理,负责将A的消息转发给B应用场景:将发送的电子邮件放到消息队列,然后邮件服务在队列中获取邮件并发送给收件人工作队列模式(Work queues)在多个消费者之间分配任务(竞争的消费者模式),一个生产者对应多个消费者,一般适用于执行资源密集型任务,单个消费者处理不过来,需要多个消费者进行处理应用场景:一个订单的处理需要10s,有多个订单可以同时放到消息队列,然后让多个消费者同时处理,这样就是并行了,而不是单个消费者的串行情况订阅模式(Publish/Subscribe)一次向许多消费者发送消息,一个生产者发送的消息会被多个消费者获取,也就是将消息将广播到所有的消费者中。
应用场景:更新商品库存后需要通知多个缓存和多个数据库,这里的结构应该是:•一个fanout类型交换机扇出两个个消息队列,分别为缓存消息队列、数据库消息队列•一个缓存消息队列对应着多个缓存消费者•一个数据库消息队列对应着多个数据库消费者路由模式(Routing)有选择地(Routing key)接收消息,发送消息到交换机并且要指定路由key ,消费者将队列绑定到交换机时需要指定路由key,仅消费指定路由key的消息应用场景:如在商品库存中增加了1台iphone12,iphone12促销活动消费者指定routing key为iphone12,只有此促销活动会接收到消息,其它促销活动不关心也不会消费此routing key的消息主题模式(Topics)根据主题(Topics)来接收消息,将路由key和某模式进行匹配,此时队列需要绑定在一个模式上,#匹配一个词或多个词,*只匹配一个词。
应用场景:同上,iphone促销活动可以接收主题为iphone的消息,如iphone12、iphone13等远程过程调用(RPC)如果我们需要在远程计算机上运行功能并等待结果就可以使用RPC,具体流程可以看图。
rabbitmq应用实例

rabbitmq应用实例RabbitMQ应用实例RabbitMQ是一种开源的消息代理软件,广泛应用于分布式系统中,用于在不同应用程序之间传递消息。
它采用AMQP协议,提供了可靠的消息传递机制,能够确保消息的可靠性和顺序性。
下面我们来看几个RabbitMQ的应用实例。
1. 订单处理系统假设有一个电商网站,用户下单后需要进行订单处理。
在这个过程中,需要将订单信息传递给库存系统、支付系统和物流系统等。
这时就可以利用RabbitMQ来实现不同系统之间的消息传递。
当用户下单时,订单系统将订单信息发送到RabbitMQ,其他系统订阅相应的消息队列,从而实现订单信息的同步处理。
2. 日志收集系统在一个分布式系统中,各个节点会产生大量的日志信息。
为了方便管理和分析这些日志,可以使用RabbitMQ来搭建日志收集系统。
每个节点将日志信息发送到RabbitMQ的消息队列中,然后日志收集服务订阅这些消息队列,将日志信息汇总到中心服务器进行存储和分析。
3. 实时数据处理系统在一些实时数据处理场景中,比如金融交易系统、在线游戏等,需要对数据进行实时处理和分发。
RabbitMQ可以作为数据流处理的中间件,将数据发送到不同的处理节点进行处理。
通过RabbitMQ的消息队列机制,可以实现数据的实时传输和处理,确保系统的高可用性和可靠性。
4. 任务调度系统在一些任务调度场景中,比如定时任务、异步任务等,可以使用RabbitMQ来实现任务的调度和执行。
任务调度系统将任务信息发送到RabbitMQ的消息队列中,工作节点订阅消息队列并执行相应的任务。
通过RabbitMQ的消息确认机制,可以确保任务的可靠执行,避免任务丢失或重复执行的情况。
总结通过以上几个应用实例,我们可以看到RabbitMQ在分布式系统中的重要作用。
它不仅可以实现不同系统之间的消息传递,还可以提高系统的可靠性和可扩展性。
因此,在设计分布式系统时,可以考虑使用RabbitMQ来解决消息传递的问题,提升系统的性能和稳定性。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
RabbitMQ 的应用场景以及基本原理介绍1. 背景RabbitMQ 是一个由erlang 开发的AMQP(Advanved Message Queue) 的开源实现。
2. 应用场景2.1 异步处理场景说明:用户注册后,需要发注册邮件和注册短信,传统的做法有两种1. 串行的方式;2.并行的方式(1) 串行方式:将注册信息写入数据库后,发送注册邮件,再发送注册短信, 以上三个任务全部完成后才返回给客户端。
这有一个问题是,邮件,短信并不是必须的,它只是一个通知,而这种做法让客户端等待没有必要等待的东西.(2) 并行方式:将注册信息写入数据库后,发送邮件的同时,发送短信, 以上三个任务完成后,返回给客户端,并行的方式能提高处理的时间。
假设三个业务节点分别使用50ms, 串行方式使用时间150ms, 并行使用时间100ms 。
虽然并性已经提高的处理时间,但是,前面说过,邮件和短信对我正常的使用网站没有任何影响,客户端没有必要等着其发送完成才显示注册成功,英爱是写入数据库后就返回.(3) 消息队列引入消息队列后,把发送邮件,短信不是必须的业务逻辑异步处理由此可以看出,引入消息队列后,用户的响应时间就等于写入数据库的时间+写入消息队列的时间(可以忽略不计),引入消息队列后处理后,响应时间是串行的3 倍,是并行的2 倍。
2.2 应用解耦场景:双11 是购物狂节,用户下单后,订单系统需要通知库存系统,传统的做法就是订单系统调用库存系统的接口这种做法有一个缺点:当库存系统出现故障时,订单就会失败。
(这样马云将少赚好多好多钱八八)订单系统和库存系统高耦合引入消息队列订单系统:用户下单后,订单系统完成持久化处理,将消息写入消息队列,返回用户订单下单成功。
库存系统:订阅下单的消息,获取下单消息,进行库操作。
就算库存系统出现故障,消息队列也能保证消息的可靠投递不会导致消息丢失(马云这下高兴了).流量削峰流量削峰一般在秒杀活动中应用广泛场景:秒杀活动,一般会因为流量过大,导致应用挂掉,为了解决这个问题,一般在应用前端加入消息队列。
作用:1. 可以控制活动人数,超过此一定阀值的订单直接丢弃(我什么秒杀一次都没有成功过呢AA)为2. 可以缓解短时间的高流量压垮应用(应用程序按自己的最大处理能力获取订单)1. 用户的请求,服务器收到之后,首先写入消息队列,加入消息队列长度超过最大值,则直接抛弃用户请求或跳转到错误页面.2. 秒杀业务根据消息队列中的请求信息,再做后续处理.3. 系统架构几个概念说明:Broker: 它提供一种传输服务,它的角色就是维护一条从生产者到消费者的路线,保证数据能按照指定的方式进行传输,Exchange :消息交换机,它指定消息按什么规则,路由到哪个队列。
Queue: 消息的载体,每个消息都会被投到一个或多个队列。
Binding: 绑定,它的作用就是把exchange 和queue 按照路由规则绑定起来.Routing Key: 路由关键字,exchange 根据这个关键字进行消息投递。
vhost: 虚拟主机,一个broker 里可以有多个vhost ,用作不同用户的权限分离。
Producer: 消息生产者,就是投递消息的程序.Consumer: 消息消费者,就是接受消息的程序.Channel: 消息通道,在客户端的每个连接里,可建立多个channel.4. 任务分发机制4.1Round-robin dispathching 循环分发RabbbitMQ 的分发机制非常适合扩展,而且它是专门为并发程序设计的,如果现在load 加重,那么只需要创建更多的Consumer 来进行任务处理。
4.2Message acknowledgment 消息确认为了保证数据不被丢失,RabbitMQ 支持消息确认机制,为了保证数据能被正确处理而不仅仅是被Consumer 收到,那么我们不能采用no-ack ,而应该是在处理完数据之后发送ack.在处理完数据之后发送ack, 就是告诉RabbitMQ 数据已经被接收,处理完成,RabbitMQ 可以安全的删除它了.如果Consumer 退出了但是没有发送ack, 那么RabbitMQ 就会把这个Message 发送到下一个Consumer ,这样就保证在Consumer 异常退出情况下数据也不会丢失.RabbitMQ 它没有用到超时机制.RabbitMQ 仅仅通过Consumer 的连接中断来确认该Message 并没有正确处理,也就是说RabbitMQ 给了Consumer 足够长的时间做数据处理。
如果忘记ack, 那么当Consumer 退出时,Mesage 会重新分发然后RabbitMQ 会占用越来越多的内存.5. M essage durability 消息持久化要持久化队列queue 的持久化需要在声明时指定durable=True;这里要注意,队列的名字一定要是Broker 中不存在的,不然不能改变此队列的任何属性.队列和交换机有一个创建时候指定的标志durable,durable 的唯一含义就是具有这个标志的队列和交换机会在重启之后重新建立, 它不表示说在队列中的消息会在重启后恢复消息持久化包括 3 部分1. exchange 持久化, 在声明时指定durable => truehannel.ExchangeDeclare(ExchangeName, "direct", durable: true, autoDelete: false, arguments: null);// 声明消息队列,且为可持久化的12.queue 持久化, 在声明时指定durable => truechannel.QueueDeclare(QueueName, durable: true, exclusive: false, autoDelete: false, arguments: null);// 声明消息队列,且为可持久化的13. 消息持久化,在投递时指定delivery_mode => 2(1 是非持久化). channel.basicPublish("", queueName,MessageProperties.PERSISTENT_TEXT_PLAIN, msg.getBytes()); 1 如果exchange 和queue 都是持久化的, 那么它们之间的binding 也是持久化的,如果exchange 和queue 两者之间有一个持久化,一个非持久化, 则不允许建立绑定.注意:一旦创建了队列和交换机,就不能修改其标志了,例如, 创建了一个non-durable 的队列, 然后想把它改变成durable 的,唯一的办法就是删除这个队列然后重现创建。
6. F air dispath 公平分发你可能也注意到了, 分发机制不是那么优雅, 默认状态下,RabbitMQ 将第n 个Message 分发给第n 个Consumer 。
n 是取余后的, 它不管Consumer 是否还有unacked Message ,只是按照这个默认的机制进行分发.那么如果有个Consumer 工作比较重, 那么就会导致有的Consumer 基本没事可做, 有的Consumer 却毫无休息的机会那么,Rabbit 是如何处理这种问题呢?通过basic.qos 方法设置prefetch_count=1 ,这样RabbitMQ 就会使得每个Consumer 在同一个时间点最多处理一个Message ,换句话说,在接收到该Consumer 的ack 前,它不会将新的Message 分发给它channel.basic_qos(prefetch_count=1) 1 注意,这种方法可能会导致queue 满。
当然,这种情况下你可能需要添加更多的Consumer ,或者创建更多的virtualHost 来细化你的设计。
7. 分发到多个Consumer7.1Exchange 先来温习以下交换机路由的几种类型:Direct Exchange: 直接匹配,通过Exchange 名称+RountingKey 来发送与接收消息.Fanout Exchange: 广播订阅, 向所有的消费者发布消息, 但是只有消费者将队列绑定到该路由器才能收到消息,忽略Routing Key.Topic Exchange :主题匹配订阅, 这里的主题指的是RoutingKey,RoutingKey 可以采用通配符,如:*或#,RoutingKey 命名采用.来分隔多个词,只有消息这将队列绑定到该路由器且指定RoutingKey 符合匹配规则时才能收到消Headers Exchange: 消息头订阅,消息发布前,为消息定义一个或多个键值对的消息头,然后消费者接收消息同时需要定义类似的键值对请求头:(如:x-mactch=all 或者x_match=any) ,只有请求头与消息头匹配, 才能接收消息, 忽略RoutingKey.默认的exchange: 如果用空字符串去声明一个exchange ,那么系统就会使用”amq.direct ”这个hange,我们创建一个queue 时,默认的都会有一个和新建queue 同名的routingKey 绑定到这个默认的exchange 上去channel.BasicPublish("", "TaskQueue", properties, bytes);1因为在第一个参数选择了默认的exchange ,而我们申明的队列叫TaskQueue ,所以默认的,它在新建一个也叫TaskQueue 的routingKey ,并绑定在默认的exchange 上,导致了我们可以在第二个参数routingKey 中写TaskQueue ,这样它就会找到定义的同名的queue ,并把消息放进去。
如果有两个接收程序都是用了同一个的queue 和相同的routingKey 去绑定direct exchange 的话,分发的行为是负载均衡的,也就是说第一个是程序1 收到,第二个是程序2 收到,以此类推。
如果有两个接收程序用了各自的queue ,但使用相同的routingKey 去绑定direct exchange 的话,分发的行为是复制的,也就是说每个程序都会收到这个消息的副本。
行为相当于fanout 类型的exchange 。
下面详细来说:7.2 Bindings 绑定绑定其实就是关联了exchange 和queue ,或者这么说:queue 对exchange 的内容感兴趣,exchange 要把它的Message deliver 到queue 。