Round-robin dispatching

默认情况下,RabbitMQ按顺序分发消息给下一个消费者。平均每个消费者会得到相同数量的消息。

Message acknowledgment

为了确保消息不丢失,RabbitMQ支持消息确认。消费者通过发送确认来告诉RabbitMQ已经收到消息,并且已经处理完成,而且RabbitMQ可以删除它了。

如果一个消费者在发确认之前就已经死了,那么RabbitMQ认为消息没有被处理完,并且会将它重新加入队列中。这个时候如果有另一个消费者在线的话,将把这个消息重新投递给另一个消费者。用这种方式可以确保消息不丢失。

一个常见的错误是忘记确认,这样后果会很严重。这种情况下,客户端退出的时候消息会重新投递,这样的话,RabbitMQ需要消耗更多的内存,因为它不能释放这些没有被确认的消息。

Message durability

我们已经学习了怎样确保即使消费者死了消息也不丢失。但是,如果RabbitMQ服务器停止了,消息仍然会丢失。

当RabbitMQ服务器退出或者宕机的时候,它将忘记队列和消息。为了确保消息不被丢失,有两件事情是必须的:队列和消息都要持久化。

首先,我们需要确保RabbitMQ从来不会丢失队列。为此,我们需要这样做:

这段代码没写错,但问题是已经有一个队列叫"hello"了,并且没有被持久化。RabbitMQ不允许你用不同的参数重新定义一个已经存在的队列。

消息持久化是通过MessageProperties的值设为PERSISTENT_TEXT_PLAIN来做的

注意:

  标记消息为持久化并不能完全保证消息不会丢失。即使,我们告诉RabbitMQ要将消息保存到磁盘上,但是在window上仍然有一段很短的时间,当RabbitMQ接受了消息但还没来得及保存。RabbitMQ不会对每一条消息做fsync(2),它可能只是保存在缓存里面而没有真的保存到磁盘上。这种持久化不够健壮,但对于一些简单的任务来说是足够了。如果需要更强壮的保证,你可以使用publisher confirms(发布确认)

Fair dispatch

你可能已经注意到,消息分发并不是按照我们想的那样进行的。RabbitMQ只是将第n条消息发给第n个消费者。为了改变这种默认的行为,可以用basicQos方法将prefetchCount设为1。这将告诉RabbitMQ一次给出的消息不能超过1条。换句话说,这样的话RabbitMQ不会分发一个消息直到这个消费者已经处理完成并确认了前一条消息。代替,它会将消息分发给下一个空闲的消费者。

小结:

1、为了保证即使消费者死了消息也不会丢失,需要消费者手动确认

2、为了保证即使即使RabbitMQ服务器宕机了消息也不丢失,需要持久化消息的队列。但这种方式也不能完全保证消息不丢失,因为有可能RabbitMQ并不是每收到一条消息就做一次fsync(2)操作,也许只是将消息保存在缓存中,这个时候如果宕机,则消息会丢失。

3、为了更进一步的保证即使服务器宕机了也不丢消息,需要发布消息的时候也予以确认

4、发布消息确认+队列、消息持久化+消费消息确认

5、默认情况下,RabbitMQ分发消息的时候不管消费者有没有确认之前的消息,不管发给消费者的消息有多少没有确认,反正收到一个消息就发一个。这就可能造成有的消费者很忙,有的很闲。为了避免这个问题,可以将basicQos都设为1,这样就可以兼顾到消费者处理的情况了。

参考  http://www.rabbitmq.com/tutorials/tutorial-two-java.html

Work Queues的更多相关文章

  1. [LeetCode] Implement Stack using Queues 用队列来实现栈

    Implement the following operations of a stack using queues. push(x) -- Push element x onto stack. po ...

  2. Ring buffers and queues

    Ring buffers and queues The data structure is extremely simple: a bounded FIFO. One step up from pla ...

  3. RabbitMQ官方中文入门教程(PHP版) 第二部分:工作队列(Work queues)

    工作队列 在第一篇教程中,我们已经写了一个从已知队列中发送和获取消息的程序.在这篇教程中,我们将创建一个工作队列(Work Queue),它会发送一些耗时的任务给多个工作者(Works ). 工作队列 ...

  4. Java for LeetCode 225 Implement Stack using Queues

    Implement the following operations of a stack using queues. push(x) -- Push element x onto stack. po ...

  5. RabbitMQ(二) -- Work Queues

    RabbitMQ(一) -- Work Queues RabbitMQ使用Work Queues的主要目的是为了避免资源使用密集的任务,它不同于定时任务处理的方式,而是把任务封装为消息添加到队列中.而 ...

  6. Implement Stack using Queues

    Implement the following operations of a stack using queues. push(x) -- Push element x onto stack. po ...

  7. the OS maintains a number of queues

    COMPUTER ORGANIZATION AND ARCHITECTURE DESIGNING FOR PERFORMANCE NINTH EDITION To do its job, the OS ...

  8. (leetcode)Implement Stack using Queues

    Implement the following operations of a stack using queues. push(x) -- Push element x onto stack. po ...

  9. iOS 并发编程之 Operation Queues

    现如今移动设备也早已经进入了多核心 CPU 时代,并且随着时间的推移,CPU 的核心数只会增加不会减少.而作为软件开发者,我们需要做的就是尽可能地提高应用的并发性,来充分利用这些多核心 CPU 的性能 ...

  10. (easy)LeetCode 225.Implement Stack using Queues

    Implement the following operations of a stack using queues. push(x) -- Push element x onto stack. po ...

随机推荐

  1. java Quartz任务调度器

    1.quarz对java1.5实现的简单调度做了封装 /**     * quartz对任务调度进了高度抽象: 1调度器:2任务:3触发器     * Job接口(任务):定义需要调度的任务     ...

  2. 【转】Android总结篇系列:Activity生命周期

    [转]Android总结篇系列:Activity生命周期 Android官方文档和其他不少资料都对Activity生命周期进行了详细介绍,在结合资料和项目开发过程中遇到的问题,本文将对Activity ...

  3. nohup 运行后台程序

    写了个程序,大概就是日志文件快写满的时候自动删日记.然后 java -jar  log_delete.jar  &  跑起来.过两天ps发现程序没有了, 网上一查明白是因为:通过终端(shel ...

  4. ORA-01017 invalid username/password;logon denied

    一般来说这个是密码丢失问题,但也许是因为你的用户名或密码写错啦,所以先检查下用户名和密码,觉得没错的话就去查看 sqlnet.ora (在 安装盘下面的:oracle\product\11.2.0\d ...

  5. ubuntu18.04时区设置

    1.运行命令 sudo tzselect 2.选择大区 选择亚洲Asia,继续选择中国China,最后选择北京Beijing 3.建立软链 ln -sf /usr/share/zoneinfo/Asi ...

  6. extjs__(grid Panel绑定数据)

    1.修改面板名称 双击My Panel  就可以进行修改 2拖入一个grid  panel绑定数据 3.创建一个model  只是为了创建一个模型  相当于java中的模型层  只是数据的一个标准 4 ...

  7. c++实现对windwos 下socket 的封装(实现封包及拆包处理)

    SuperSocket.h #pragma once #include<string> #include<iostream> #include <WINSOCK2.H&g ...

  8. MFC编程汇总

    1.visual2017专业版MFC编程环境搭建及第一个MFC程序的创建 2.通过MFC设计一个简单的计价程序 3.控件——静态空间.编辑框控件.命令按钮.复选框和单选控件 4.控件添加——静态控件. ...

  9. div+css+position实现简单的纵向导航栏

    完成效果: 这应该是很简单的纵向导航栏了. OK,进入正题 首先,我们看上面的效果图可以分析得出,要实现这个效果需要用到的技术点 1.hover 2.position 3.布局 我认为在这个效果的实现 ...

  10. Linux时间戳转换成BCD码(转载)

    #include <stdio.h> #include <stdlib.h> #include <time.h> #include <math.h> / ...