`

RabbitMQ之Work Queues

阅读更多

本文翻译自RabbitMQ官网。

一、工作队列介绍

      上一部分通过简单的代码介绍了通过队列发送和接收消息,这一部分创建一个工作队列来发送和接收耗时的消息。工作队列的主要设计思想是将资源密集型的任务先放进队列中,避免立刻做资源密集型的任务,也就避免了一直等待该任务处理完成造成的堵塞。在短暂的HTTP请求中不可能一直等待复杂的任务处理完成后返回,而是先将消息放入消息队列就可以返回了,消息的处理待消费者从消息队列中取出后再处理,达到了异步的效果。

      在本节中模拟一个复杂的任务,如下所示。

 

 private static void doWork(String msg){
        char[] array = msg.toCharArray();
        for (char ch : array){
            if (ch == '.') {
                try {
                    Thread.sleep(1000);  
                }catch (InterruptedException e){
                    e.printStackTrace();
                }
            }
        }
    }

 当消息中有字符‘.’时,sleep 1ms。

将消费队列改为:task_queue3。

结果如下:

 

producer:jing... quan
before send message:jing... quan
after send message:jing... quan
******time is :******2ms
start consume....
consumer:jing... quan

 二、相关属性设置

       1、消息确认(message acknowledgment):为了防止在消费端挂掉之后消息丢失

       在消费端接收到消息之后,开始处理复杂的任务,如果当某一个消费者在执行任务的过程中突然挂掉了(原因可能是channel被关闭了、连接被关闭了或者是TCP的连接被断掉了)怎么办?消息会不会丢失呢?一旦RabbitMQ发送消息给消费者后,该消息就立刻被从内存中删除掉了,这种情况下,如果某一个消费者挂掉了,那么它正在处理的所有消息就会丢失掉。但是在实际情况中,我们是不希望丢失任何消息的,所以需要使用到RabbitMQ的消息确认属性。消息确认即当消费者已经对某一个特定的消息处理完毕之后它会发给RabbitMQ一个ACK(nowledgment),告知RabbitMQ可以将这段消息删除掉了。如果消费端是在处理消息的过程中挂掉的,那么肯定不会发送给RabbitMQ一个ACK,这个时候RabbitMQ会将消息重新发送给其他未挂掉的消费者。

       在默认情况下,ACK是打开的,可以通过basicConsume来进行设置:

channel.basicConsume(queue, false, this);

 以上情况会将ACK关掉,但是为了防止丢失,还是将其打开:

channel.basicConsume(queue, true, this);

 

      2、 消息的持久性:为了防止在服务器挂掉之后消息丢失

      当RabbitMQ挂掉需要重启时,在默认情况下,它会将其之前创建的channel和message全部删除,这个时候就会造成数据丢失。为了防止这种情况发生,需要做两个方面的设置:a,消息队列的持久性设置;b,消息的持久性设置。

      首先是消息队列的持久性设置:

durable = true;
channel.queueDeclare(queue, durable, exclusive, autoDelete, arguments);

      以上代码在生产者端和消费者端需同时设置。

     然后是消息的持久性设置:

channel.basicPublish("", queue, MessageProperties.PERSISTENT_TEXT_PLAIN, msg.getBytes());

    在发布消息的时候,将消息的属性设置为MessageProperties.PERSISTENT_TEXT_PLAIN

    以上设置就保证了消息的持久性,当Rabbit服务器因为某些原因重启后,还是可以消费到尚未被消费的消息。

 

       3、合理分发

      有这样的情景:两个消费者,一个耗费资源比较小的消息和一个耗费资源比较大的消息,在默认情况下,RabbitMQ会平均将消息分发给两个消费者,这样就容易造成一个消费者一直很忙而另一个消费者比较空闲的情况,这是因为当消息被放入消息队列后RabbitMQ只负责分发,而不关注消费的处理情况,如果进行以下设置:

int prefetchCount = 1;
channel.basicQos(prefetchCount);

 RabbitMQ就会在某一个消费者处理完成前一个消息之后才会给其分发下一个消息,如果该消费者还没有处理完毕,它就会将待处理消息分发给其他消费者。

  • 大小: 4.9 KB
分享到:
评论

相关推荐

    RabbitMQ练习(Work Queues)

    RabbitMQ练习(Work Queues)

    rabbitMQ简单应用pattern1 Work queues 工作队列模式

    在本文中,我们将深入探讨RabbitMQ中的"Work Queues"(工作队列模式),这是一种优化任务处理效率的重要策略。 工作队列模式,也称为负荷分发或批处理队列,其核心思想是通过将大量任务分解为小型可处理单元,然后...

    rabbitMQ安装包.zip

    7. **工作模式(Work Queues)**:一种常见的使用模式,其中多个消费者并行处理来自单一队列的消息,用于负载均衡和任务处理。 为了管理和监控RabbitMQ,我们可以使用RabbitMQ的Web管理界面。默认情况下,该界面在...

    RabbitMQ Server3.13.0

    1. **Work Queues**: 用于负载均衡,多个消费者可以从同一个队列中获取任务进行处理,防止同一任务被重复处理。 2. **Publish/Subscribe**: 通过主题交换机实现广播模式,所有订阅特定主题的消费者都会收到消息。 ...

    rabbitMQ 源代码实例

    8. **Work Queues**:工作队列用于负载均衡,多个消费者可以从队列中取出任务并并行处理。 9. **Message Acknowledgments**:为了确保消息的可靠性,RabbitMQ提供了消息确认机制。消费者在成功处理消息后发送确认,...

    rabbitmq C# 调用测试

    除了基础的发布/消费模型,RabbitMQ还支持许多高级特性,如工作队列(Work Queues)、发布/确认(Publish/Confirm)、死信队列(Dead Letter Queues)和延迟队列(Delayed Queues)。这些特性可以帮助构建更健壮和...

    资源前后端分离式分布式微服务架构项目消息中间件RabbitMQ讲义+源码+视频

    页面发布需求分析 理解 理解Cms页面发布的流程 RabbitMQ介绍 理解 能够...RabbitMQ的常用工作模式 "理解Work queues模式理解Publish/Subscribe模式理解Routing模式理解Topics工作模式"Spring整合RibbitMQ 应用 重点 ...

    rabbitmqdemo

    除了基本的发送和接收消息之外,RabbitMQ 还支持许多高级特性,如工作队列(Work Queues)、发布/订阅模式(Publish/Subscribe)、主题路由(Topic Routing)等。在 "rabbitmqdemo" 中,你可能能够发现这些模式的...

    rabbitmq安装包

    1. **工作队列(Work Queues)**: 用于分配任务到多个工作者,以提高处理效率。 2. **发布/订阅(Publish/Subscribe)**: 让多个消费者可以同时接收消息。 3. **路由(Routing)**: 基于路由键将消息发送到指定...

    rabbitmq-server-3.9.13

    6. **工作队列(Work Queues)**:常用于负载均衡,多个消费者可以从队列中获取任务并并行处理。 此外,RabbitMQ还支持多种插件,如用于监控的Management Plugin,可以提供Web界面来查看服务器状态、队列信息、节点...

    RabbitMQ实战 高效部署分布式消息队列

    1. 工作队列(Work Queues):通过多个消费者并行处理任务,提高系统性能。 2. 消息持久化:通过持久化消息和持久化队列,即使服务器重启,消息也不会丢失。 3. 优先级:队列可以设置消息优先级,优先级高的消息优先...

    RabbitMQ.docx

    2. **Work Queues(工作队列)**:也称为公平分发,用于多消费者场景,确保每个消费者平均分配任务,避免某一个消费者负载过高。 3. **Publish/Subscribe(发布/订阅)**:生产者发布消息到主题(Topic),消费者...

    Laravel开发-rabbitmq-laravel

    安装完成后,确保 RabbitMQ 服务已经启动,并创建你需要的交换机(exchanges)和队列(queues)。 **二、安装 rabbitmq-laravel** 在 Laravel 项目中,你可以使用 Composer 来安装 `rabbitmq-laravel` 包: ```...

    RabbitMQ的五种模式源码+纯手工打的代码

    2. **工作队列(Work Queues)**: 也称为任务队列,多个消费者从同一个队列中获取任务进行处理,可以有效平衡工作负载,避免某个消费者过载。例如,网站后台的图片处理、数据计算等耗时操作可以放入工作队列。 3....

    rabbitMQ 消息队列 Demo

    2. **02WorkQueues(任务队列)** 在这个示例中,多个消费者可以并发地从队列中获取任务进行处理,实现负载均衡。例如,处理一个耗时的任务时,如果有多台服务器(消费者),RabbitMQ会将任务分发给空闲的服务器,...

    RabbitMQ.pdf-详情

    2. **工作队列**(Work Queues):多个消费者,消息被分发给空闲的消费者,保证任务的并行处理。 3. **发布/订阅**:多个生产者和消费者,每个消费者可以订阅多个主题,广播模式。 4. **路由**:根据路由键将消息...

    RabbitMQ详解搭建

    1. **Work Queues(工作队列)** 用于负载均衡,多个消费者同时从队列中取出任务执行。 2. **Publish/Subscribe(发布/订阅)** 生产者发送消息到一个主题交换机,所有订阅该主题的消费者都能收到消息。 3. **...

    RabbitMQ培训PPT

    1. **Work Queues**: 并发处理任务,多个消费者从同一队列中获取任务,提高效率。 2. **Publish/Subscribe模式**: 使用Fanout交换器实现广播消息,所有订阅者都能收到消息。 3. **死信队列**: 错误处理,消息无法...

    RabbitMQ消息中间件视频教程

    它支持多种消息发布订阅模式,包括简单模式(Simple)、工作队列模式(Work Queues)、发布/订阅模式(Publish/Subscribe)、路由模式(Routing)、RPC模式(Remote Procedure Call)、Fanout模式等。RabbitMQ具有高...

    rabbitmq简单demo

    在本"rabbitmq简单demo"中,我们将探讨RabbitMQ的三种主要工作模式:Work Queues、Publish/Subscribe和Routing模式。 ### 1. Work Queues(工作队列) 工作队列模式是最基本的RabbitMQ用法,常用于负载均衡和异步...

Global site tag (gtag.js) - Google Analytics