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. nodeJS接入微信公众平台开发

    一.写在前面的话   Node.js是一个开放源代码.跨平台的JavaScript语言运行环境,采用Google开发的V8运行代码,使用事件驱动.非阻塞和异步输入输出模型等技术来提高性能,可优化应用程 ...

  2. ----关于JS中迭代的三个“FOR”----

    for each...in 使用一个变量迭代一个对象的所有属性值,对于每一个属性值,有一个指定的语句块被执行. 一些对象的内置属性是无法被遍历到的,包括所有的内置方法,例如String对象的index ...

  3. thinkphp 5 使用oss

    简单的tp5中上传到 图片到oss我本地开发环境为:WAMP;php版本:5.6.19TP版本:5.1.13 1.使用composer 安装 composer require aliyuncs/oss ...

  4. mui getJSON实现jsonp跨域

    //刚开始做APP的时候,后台给的方式是jsonp,然后就百度mui框架的jsonp跨域,看了好多文章,都说可以支持,但是大部分都是直接把别人复制来的,都不知道是不是真的能支持,做好打包完的时候,下载 ...

  5. [ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.2:compile (default-compile) on project taotao-manager-pojo: Compilation failure

    运行maven项目时报错 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.2:compi ...

  6. Java项目下的classpath路径包括哪里

    https://my.oschina.net/zjllovecode/blog/916927 classpath指的是.classpath下kind="src" 的路径

  7. SQL Server数据库设置自动备份策略

    一. 简单介绍 SQL Server自带的维护计划是一个非常有用的维护工具,能够完成大部分的数据库的维护任务. 数据库的备份也是日常工作中非常重要的一个环节.备份的方法非常的多. 今天给大家介绍最简单 ...

  8. Eclipse搭建服务器,实现与Android的简单通信

    ---恢复内容开始--- 目标:实现客户端(Android App)与服务器(PC)的简单通信 相关准备:eclipse_mars.tomcat8.Android Studio 实现: 1.java环 ...

  9. codefores 1066 E. Binary Numbers AND Sum

    这个题吧 你画一下就知道了 就拿这个例子来讲 4 5100110101 对于b串的话第5位只会经过a串的第4位,b串的第4位会经过a串的第3位和第4位.....b串的第1和第2位会经过a串的每一位 由 ...

  10. Shell文件权限-1