工作队列-WorkQueue

实现功能:

  将耗时的任务分发给多个工作者

设计思想:

  避免直接去做一件资源密集型的任务,并且还得等它完成。因此将任务安排后再去做。将任务封装为一个消息,发到队列中。一个工作进程将在后台取出任务并最终完成。如果开启多个工作进程,任务将在这个多工作进程间共享

消息分发:

  一、循环分发(Message acknowledement):

    默认情况下,rabbitmq是轮流发消息给下一个消费者,平均每个cusumer接到的消息数量相等。  

   那么问题来了,当一个消息十分耗时,那么获得到这个消息的cusumer,在执行时崩溃导致任务未完成,那么这个消息就丢失了。为了保证出现类似问题,消息不消失。rabbitmq有一个消息确认机制。

  二、消息确认机制(ack):

    rabbitmq支持消息确认,为保证消息永不丢失,cusumer会发送一个确认消息告诉rabbitmq。代表我已接收消息,并处理完成。可以随时删除。

    当一个cusumer在发送确认消息前死亡(连接或通道关闭,tcp连接丢失等),rabbitmq会认为该消息没有被完全处理并将其重新加入队列。如果此时有其他cusumer,rabbitmq很快会重新发送该消息到其他cusumer。通过这个方式保证没有消息丢失,及时某个cusumer意外死亡。

    开启消息确认机制,rabbitmq默认打开。代码:autoAck = true(关掉)/false(打开)

      

  注:对于rabbitmq而言,没有消息超时

  当我们开启消息确认机制之后,可以保证cusumer死亡时不会丢失消息。但当rabbitmq服务关闭或崩溃后,会丢失所有的队列和消息。

  那如何解决因服务关闭或崩溃造成的消息丢失呢?我们需要做三件事情:

  持久化exchange(交换机):声明时指定durable = true

  持久化queue(队列):声明时指定durable = true

  持久化message(消息):在消息投递时指定delivery_mode = 2(1是非持久化)或将MessageProperties的值设置为PERSISTENT_TEXT_PALIN

  注:rabbitmq不允许重新定义已经存在的队列的持久化,如上一章中我们设置的MyQueue队列。如果设置了该队列不持久化,那么我们不能再声明它持久化。不然会报错。我们必须重新声明一个新队列并声明持久化。

以上我们可以做一个小结:

  1、rabbitmq在服务端没有声明队列和消息持久化时,队列和消息存在内存中,服务端宕机后都丢失。

  2、服务端声明持久化,客户端想要接收消息,必须声明queue同时声明持久化,不然客户端执行报错。

  三、公平分发(Fair dispatch):

    在循环分发机制中,可能会发生一个cusumer接收的消息处理非常耗时,而另一个cusumer接收的消息非常快处理完。这会导致有的cusumer很忙有的很闲。

    rabbitmq对此一概不知。因为它只是当消息进入队列就分发出去,并没有查看每个cusumer未返回消息确认的数量。

    为了改变这种情况,rabbitmq提供了公平分发机制。使用basicQos()方法。将其参数prefetchCount设置为1。这样cusumer会告诉rabbitmq,不要同时发多个消息给我。每次只发一个,当我处理完消息并给你确认信息后,再发给我下一个。这时候rabbitmq会查看cusumer返回的确认,寻找空闲的cusumer发送消息。

  注:当所有的cusumer都很忙,队列可能会被装满。这个情况必须留意。要么增加更多cusumer要么采取其他策略。

  

  
    

RabbmitMQ-工作队列及相关概念的更多相关文章

  1. epoll 数据库安装以及相关概念

    epoll select 只能同时处理1024个客户端, 多线程会遇到资源瓶颈,什么才是解决高并发最有效的方式呢 linux中提供了epoll 这种多路复用的IO模型,注意其他平台没有相应的实现 所以 ...

  2. IDDD 实现领域驱动设计-上下文映射图及其相关概念

    上一篇:<IDDD 实现领域驱动设计-理解限界上下文> 距离上一篇有几天时间了,<实现领域驱动设计>第三章的内容都是围绕一个词-上下文映射图,我大概断断续续看了几天,总共看了两 ...

  3. [原创]java WEB学习笔记105:Spring学习---AOP介绍,相关概念,使用AOP,利用 方法签名 编写 AspectJ 切入点表达式

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  4. 工作队列(workqueue) create_workqueue/schedule_work/queue_work

    --- 项目需要,在驱动模块里用内核计时器timer_list实现了一个状态机.郁闷的是,运行时总报错"Scheduling while atomic",网上搜了一下:" ...

  5. 第3.3 案例2: 工作队列 job queue

    第2个案例就是工作队列,典型的点对点的消息,一个Producer发送一个工作消息到队列去,具有Listener类的Consumer能够从工作队列中获得一个工作情况的消息,这个消息被这个消费者消费掉之后 ...

  6. 【译】RabbitMQ:工作队列(Work Queue)

    在第一篇我们写了两个程序通过一个命名的队列分别发送和接收消息.在这一篇,我们将创建一个工作队列在多个工作线程间分发耗时的工作任务. 工作队列的核心思想是避免立刻处理资源密集型任务导致必须等待其执行完成 ...

  7. C#并行编程-相关概念

    菜鸟初步学习,不对的地方请大神指教,参考<C#并行编程高级教程.pdf> 目录 C#并行编程-相关概念 C#并行编程-Parallel C#并行编程-Task C#并行编程-并发集合 C# ...

  8. rabbitmq消息队列——"工作队列"

    二."工作队列" 在第一节中我们发送接收消息直接从队列中进行.这节中我们会创建一个工作队列来分发处理多个工作者中的耗时性任务. 工作队列主要是为了避免进行一些必须同步等待的资源密集 ...

  9. RabbitMQ入门教程——工作队列

    什么是工作队列 工作队列是为了避免等待一些占用大量资源或时间操作的一种处理方式.我们把任务封装为消息发送到队列中,消费者在后台不停的取出任务并且执行.当运行了多个消费者工作进程时,队列中的任务将会在每 ...

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

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

随机推荐

  1. Fiddler查看接口响应时间

    有时候,某些接口访问过慢,我们需要测试接口查看响应时间,从而进行优化.(由于fiddler自带的没有进行响应时间的统计,所以我们需要给他添加新的规则) 首先打开Fiddler,在菜单栏上面找到Rule ...

  2. C#基础(string)

    https://msdn.microsoft.com/zh-cn/library/84787k22(v=vs.110).aspx 1.Compare基本方法 public static int Com ...

  3. Centos7.5调试/etc/sysctl.conf文件导致宕机

    今天安装greenplus数据库,需要调试一个核心文件/etc/sysctl.conf文件,结果导致系统异常宕机,出现的问题就是使用任何命令都不能输出正确的结果,只有这个显示: 不知道是什么原因,ls ...

  4. 如何开启win10的上帝模式

    用了这么久的电脑,小编才知道还有“上帝模式”这一说,原谅小编的孤陋寡闻.翻阅资料才知道,上帝模式简单来说就是一个全能的控制面板,如控制面板的功能.界面个性化.辅助功能选项等方方面面的控制设置,几乎包含 ...

  5. pt-query-digest详解慢查询日志(转)

    一.简介 pt-query-digest是用于分析mysql慢查询的一个工具,它可以分析binlog.General log.slowlog,也可以通过SHOWPROCESSLIST或者通过tcpdu ...

  6. TG可能会用到的动态规划-简易自学

    最新更新 完整校订版见此 戳我阅读 以下为未核对不完整版本. 因版权原因,完整精校版不向所有公众开放. 请从您找到本博客的地址查找附带密码(比如简书分享了本网址,请您从简书分享页底部查询密码),感谢您 ...

  7. 17秋 软件工程 团队第五次作业 Alpha Scrum11

    17秋 软件工程 团队第五次作业 Alpha Scrum11 今日完成的任务 世强:管理员头像图片上传和显示逻辑处理,活动添加及上传图片: 港晨:完成Web界面前后端对接: 树民:标准化后端接口格式: ...

  8. <20180929>任性的甲方

    今天参观了朋友在监督的新项目, 这个项目周期大概在6到9个月,预计本年度11月竣工. 总共大楼有五层, 施工面积在一万平米左右. 位于三楼的机房使用的设备有点高大上,发上来鉴赏一下. 双专线, 第二条 ...

  9. centos7下安装docker(6镜像总结)

    学了很长时间的镜像了,从镜像的分层,缓存的特性,到制作镜像:通过docker commint和docker build创建,再到制作dockerfile以及dockerfile中常用的参数FROM,M ...

  10. request.servervariables参数

    ServerVariables ServerVariables 集合检索预定的环境变量. 语法 Request.ServerVariables (server environment variable ...