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. 第二阶段第九次spring会议

    今天我将对软件进行宠物信息的添加. 清屏功能 private void button5_Click(object sender, EventArgs e) { textBox2.Text = &quo ...

  2. Appium+Python自动化 4 -appium元素定位

    appium定位app上的元素方式 在前面文章中有介绍,(通过UIautomator工具查看app元素) appium定位app上的元素,可以通过id,name,class这些属性定位到 1.id 定 ...

  3. mongooDb链接javaapi

    mongodb链接有多种:所以不同链接下的api也不太一样. 1.api比较全面 public void query2(){ String mondburl = Config.getInstance( ...

  4. scrum与第一次teamwork

    一.关于Scrum Scrum是什么?是迭代式增量软件开发过程,通常用于敏捷软件开发,Scrum是一种偏重于过程的敏捷开发的具体方式.Scrum的英文意思是橄榄球运动的一个专业术语,表示“争球”的动作 ...

  5. Python Day 7

    阅读目录 内容回顾: 数据类型相互转换: 字符编码: ##内容回顾 #1.深浅拷贝 ls = [1, 'a', [10]] 值拷贝:直接赋值 ls1 = ls, ls中的任何值发生改变,ls1中的值都 ...

  6. vue脚手架的使用

    npm install -g @vue/cli    --全局环境安装vue/cli vue create <project-name> 在创建项目时你会被提示选取一个 preset.你可 ...

  7. Spring学习-01

    一.Srping 一个轻量级DI.IOC.AOP的容器框架 DI:依赖注入 IOC:控制反转 AOP:面向切面 二.构造器注入 Constructor-arg 属性:index/name/type/r ...

  8. Python 协程 61

    什么是协程 协程,又称微线程,纤程.英文名Coroutine.一句话说明什么是线程:协程是一种用户态的轻量级线程. 协程的特点 协程拥有自己的寄存器上下文和栈.协程调度切换时,将寄存器上下文和栈保存到 ...

  9. switch_root vs pivot_root vs chroot【转】

    1. pivot_root can/should be used together with chroot pivot_root new_root put_old pivot_root moves t ...

  10. vue学习-自动行合并的table

    测试的效果 测试的html源码截图 v-table在tableGroup.js中定义,以下就render方法,行的所有单元格都在tableGrouper.js中处理 render:function(h ...