【RabbitMQ】RabbitMQ的公平转发和持久化

本文探讨了 RabbitMQ 中消息持久化的方法及其重要性,并介绍了如何通过 basicQos 方法实现消息的公平转发,确保消息均衡地分发给各个消费者。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题:公平转发

 

         目前消息转发机制是平均分配,这样就会出现俩个消费者,奇数的任务很耗时,偶数的任何工作量很小,造成的原因就是近当消息到达队列进行转发消息。并不在乎有多少任务消费者并未传递一个应答给RabbitMQ。仅仅盲目转发所有的奇数给一个消费者,偶数给另一个消费者。

         为了解决这样的问题,我们可以使用basicQos方法,传递参数为prefetchCount= 1。这样告诉RabbitMQ不要在同一时间给一个消费者超过一条消息。

         换句话说,只有在消费者空闲的时候会发送下一条信息。

调度分发消息的方式,也就是告诉RabbitMQ每次只给消费者处理一条消息,也就是等待消费者处理完毕并自己对刚刚处理的消息进行确认之后,才发送下一条消息,防止消费者太过于忙碌,也防止它太过去清闲。

intprefetchCount = 1;  

 channel.basicQos(prefetchCount);



问题:持久化:


          消息持久化在消息声明和通道发布的时候来声明他为持久化,同时在消费端声明的时候也需要声明为持久化。

          没有持久化,重新启动RabbitMQ,发现没有了。

          持久化之后,重新启动RabbitMQ,发现是有的,执行消费者,可以获取该消息。

    1. package cn.itcast.rabbitmq.durable;  
    1.   
    1. import com.rabbitmq.client.ConnectionFactory;  
    2. import com.rabbitmq.client.Connection;  
    3. import com.rabbitmq.client.Channel;  
    4. import com.rabbitmq.client.QueueingConsumer;  
    1.   
    1. public class ClientReceive1  
    1. {  
    2.     public static final String queue_name = "my_queue";  
    3.     public static final boolean autoAck = false;  
    4.     public static final boolean durable = true;  
    5.   
    6.     public static void main(String[] args) throws java.io.IOException,  
    7.         java.lang.InterruptedException  
    8.     {  
    9.         ConnectionFactory factory = new ConnectionFactory();  
    10.         factory.setHost("localhost");  
    11.         factory.setPort(5672);  
    12.         // 设置账号信息,用户名、密码、vhost  
    13.         factory.setVirtualHost("/taotao");  
    14.   
    15.     factory.setUsername("taotao");  
    16.     factory.setPassword("taotao");  
    17.     Connection connection = factory.newConnection();  
    18.     Channel channel = connection.createChannel();  
    19.     channel.queueDeclare(queue_name, durable, falsefalsenull);  
    20.     System.out.println("Wait for message");  
    21.     channel.basicQos(1); // 消息分发处理  
    22.     QueueingConsumer consumer = new QueueingConsumer(channel);  
    23.     channel.basicConsume(queue_name, autoAck, consumer);  
    24.     while (true)  
    25.     {  
    26.         Thread.sleep(500);  
    27.         QueueingConsumer.Delivery deliver = consumer.nextDelivery();  
    28.         String message = new String(deliver.getBody());  
    29.         System.out.println("Message received:" + message);  
    30.         channel.basicAck(deliver.getEnvelope().getDeliveryTag(), false);  
    31.     }  
    32.     }  
    33. } 
    34.  

     



代码是 从world中粘贴过来的,格式有点不好,请谅解!

RabbitMQ 的数据持久化机制主要涵盖三个方面:交换器的持久化、队列的持久化以及消息的持久化[^1]。为了确保数据在 RabbitMQ 服务重启或异常情况下不会丢失,需要对这些部分进行合理配置。 ### 交换器的持久化 交换器的持久化可以通过在创建交换器时设置 `durable=true` 来实现。默认情况下,RabbitMQ 创建的交换器是持久化的[^2]。以下是一个使用 RabbitMQ 的 AMQP 0-9-1 协议创建持久化交换器的示例: ```python channel.exchange_declare(exchange='my_exchange', exchange_type='direct', durable=True) ``` ### 队列的持久化 队列的持久化同样通过设置 `durable=true` 来实现。这意味着即使 RabbitMQ 服务重启,队列的元数据仍然存在,但需要注意的是,队列的持久化并不意味着队列中的消息也会被持久化。要持久化消息,还需要额外的配置。以下是一个创建持久化队列的示例: ```python channel.queue_declare(queue='my_queue', durable=True) ``` ### 消息的持久化 消息的持久化需要在发送消息时设置 `delivery_mode=2`,这表示消息会被写入磁盘而不是仅保存在内存中。这样即使 RabbitMQ 服务重启,消息也不会丢失。以下是一个发送持久化消息的示例: ```python channel.basic_publish( exchange='my_exchange', routing_key='my_routing_key', body='Hello World!', properties=pika.BasicProperties(delivery_mode=2) ) ``` ### 数据一致性与可靠性 为了进一步提高系统的容错能力数据一致性,可以启用消息确认机制。生产端(producer)消费端(consumer)都可以通过确认机制来确保消息的可靠传输处理[^3]。此外,还可以配置镜像队列(mirror queue)来提高消息的可靠性,但这可能会导致性能下降[^4]。 ### 总结 配置 RabbitMQ 的数据持久化机制涉及交换器、队列消息的持久化设置。通过合理配置这些参数,并结合消息确认机制镜像队列,可以显著提高系统的可靠性数据一致性。
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值