工作中使用的是RabbitMQ,需要对其进行熟悉。使用之前,弄清楚它是什么东西,解决什么问题。

场景

一些不必实时执行的任务

开发中,有一些任务并无须实时执行,比如:

  • 会员更新个人信息,更新会员信息之余,需写一笔日志记录到日志表
  • 会员升级了,更新会员等级表,而后需发送一封邮件通知会员

如上,保存日志表、发送邮件等任务的实时性并不强,在系统繁忙时有可能阻塞,堵塞容易导致任务失败。

如果我们把它们放入队列中,轮候执行,减低耦合的同时,是不是也缓解了系统压力。

发布和订阅

系统开发中,缓存的运用缓解了数据库原始数据读的压力。一般来说,系统有多份缓存。如果数据库记录发生更新,需要通知各缓存更新最新记录时,队列发布和订阅模式就发挥作用了。

角色介绍

生产者

生产:将消息发送到队列。发送消息的程序,称为生产者。

队列

生产者发送的消息到达队列,队列是一个缓冲区,暂存消息,消息最终会转发给消费者。
可以想象队列就是邮局,只不过邮局处理的是信件,RabbitMQ处理的是二进制的消息。

消费者

消费,从队列中获取消息,并处理消息。消费消息的程序,称为消费者。

交换器

交换器是介于生产者、队列之间,交换器按“路由策略”将消息路由到队列中,而路由策略有几种:directfanouttopicheaders
简要介绍前两个:

  • direct,将消息发布到名称与路由键匹配的队列中。
  • fanout,将消息发布到与此交换器绑定的队列中。

消息的流向

消息的流向:生产者>交换器>队列>消费者。

模式

任务队列(一个消息对应一个消费者)

任务队列,为了避免实时执行资源密集型的任务,我们把要做的任务,封装成消息放入队列,工作线程在后台运行并执行这些任务。

发布和订阅

在发布/订阅模式中,有一个生产者和两个消费者,生产者发送A消息,两个消费者均需接受到消息。

其他

声明队列的时机

生产者向队列发送消息,消费者监听队列等待消息,所以,在发送消息和消费消息前要声明队列。

大多数情况,我们不能确定生产者还是消费者谁先启动,所以,我们在两者中都作声明,RabbitMQ允许对相同队列相同参数作重复声明,即对于二次声明动作不做操作。
如果对同一队列名不同参数作二次声明,会返回错误。

消息确认机制

为了保证消息不丢失,RabbitMQ有消息确认机制,消息确认机制默认是开启的。
当消费者接收消息并处理完毕,需发送一个确认给RabbitMQ,RabbitMQ就会从队列中删除此消息。

RabbitMQ允许消费者处理消息任意长的时间,只有消费者退出了,RabbitMQ才会将消息重新轮候,不存在超时重新轮候的情况。

如果忘了确认,或确认过程中失败了,消息会在消费者退出后,RabbitMQ才将消息重新轮候。RabbitMQ会因不能释放未确认的消息而消耗更多空间,如何查看未确认的消息,请搜索messages_unacknowledged。

消息持久化

如果消费者宕机,我们通过消息确认机制寻回消息,如果RabbitMQ宕机,为了避免丢失消息,我们要设置消息持久化:

  • 声明队列是持久的
  • 标记消息是持久的

注意:此方法严格来说不能完全保证消息不会丢失,仍存在很短的时间间隙于RabbitMQ接收了消息但未写磁盘。如果需要更强的机制保证,要使用publisher confirms(本文不作讨论)。

消息分发

默认情况下,RabbitMQ采用循环的方式将消息发送给消费者。
有时,每个消息对系统的消耗不同,有些消息很快处理,有些则需花相当一段时间,所以,我们经常用basicQos(int n)方法告诉RabbitMQ不要同时分配多于n个消息给同一消费者。比如设置basicQos(1),就是在消费者未确认消息前,不要给它分配下一个消息。

参考的优秀文章

【RabbitMQ】RabbitMQ的一些基础概念的更多相关文章

  1. RabbitMQ学习总结(1)-基础概念

    1. 概念 1.1 AMQP协议 AMQP,即Advanced Message Queuing Protocol,一个提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,为面向消 ...

  2. RabbitMQ基础概念详细介绍

    http://blog.csdn.net/column/details/rabbitmq.html 转至:http://www.ostest.cn/archives/497 引言 你是否遇到过两个(多 ...

  3. RabbitMQ学习总结(1)——基础概念详细介绍

    一.基础概念详细介绍 1.引言 你是否遇到过两个(多个)系统间需要通过定时任务来同步某些数据?你是否在为异构系统的不同进程间相互调用.通讯的问题而苦恼.挣扎?如果是,那么恭喜你,消息服务让你可以很轻松 ...

  4. RabbitMQ 入门之基础概念

    什么是消息队列(MQ) 消息是在不同应用间传递的数据.这里的消息可以非常简单,比如只包含字符串,也可以非常复杂,包含多个嵌套的对象.消息队列(Message Queue)简单来说就是一种应用程序间的通 ...

  5. RabbitMQ基础概念及使用

    RabbitMQ RabbitMQ是什么? RabbitMQ是一个在AMQP基础上完整的,可复用的企业消息系统.他遵循Mozilla Public License开源协议.MQ全称为Message Q ...

  6. RabbitMQ 基础概念进阶

    上一篇 RabbitMQ 入门之基础概念 介绍了 RabbitMQ 的一些基础概念,本文再来介绍其中的一些细节和其它的进阶的概念. 一.消息生产者发送的消息不可达时如何处理 RabbitMQ 提供了消 ...

  7. rabbitmq(一)-基础入门

    原文地址:https://www.jianshu.com/p/e186a7fce8cc 在学东西之前,我们先有一个方法论,知道如何学习.学习一个东西一般都遵循以下几个环节: xxx是什么,诞生的原因, ...

  8. 快速入门系列--WCF--01基础概念

    转眼微软的WCF已走过十个年头,它是微软通信框架的集大成者,将之前微软所有的通信框架进行了整合,提供了统一的应用方式.记得从自己最开始做MFC时,就使用过Named Pipe命名管道,之后做Winfo ...

  9. ELK&ElasticSearch5.1基础概念及配置文件详解【转】

    1. 配置文件 elasticsearch/elasticsearch.yml 主配置文件 elasticsearch/jvm.options jvm参数配置文件 elasticsearch/log4 ...

  10. .NET 环境中使用RabbitMQ RabbitMQ与Redis队列对比 RabbitMQ入门与使用篇

    .NET 环境中使用RabbitMQ   在企业应用系统领域,会面对不同系统之间的通信.集成与整合,尤其当面临异构系统时,这种分布式的调用与通信变得越发重要.其次,系统中一般会有很多对实时性要求不高的 ...

随机推荐

  1. 使用css使textbox输入内容自动变大写

    <style type="text/css"> input[type="text"] { text-transform:uppercase; } & ...

  2. Java 的静态代理 动态代理(JDK和cglib)

    转载:http://www.cnblogs.com/jqyp/archive/2010/08/20/1805041.html JAVA的动态代理 代理模式 代理模式是常用的java设计模式,他的特征是 ...

  3. mybatis---实现关联表查询

    推荐学习博客: 1.http://www.cnblogs.com/xdp-gacl/p/4264440.html 2.http://www.cnblogs.com/yaobolove/p/544404 ...

  4. [CC]点云密度计算

    包括两种计算方法:精确计算和近似计算(思考:local density=单位面积的点数 vs  local density =1/单个点所占的面积) 每种方法可以实现三种模式的点云密度计算,CC里面的 ...

  5. 关于使用FusionCharts生成图表时出现invalid xml data错误提示的解决方法

    FusionCharts的确功能是够强大的.收集的功能估计更强大.在初次使用时,对着手册,一步一步操作,就是生成图表工具不成功.一直报"Invalid xml data"错误.后面 ...

  6. 查看 Apache并发请求数及其TCP连接状态

    查看 Apache并发请求数及其TCP连接状态 (2011-06-27 15:08:36) 服务器上的一些统计数据: 1)统计80端口连接数 netstat -nat|grep -i "80 ...

  7. ASCII码表(二进制 十进制 十六进制)

    css里,允许使用转义字符\+ascii16进制形式; 例如: e的ascii 16进制是65,我们就写为\65 expression -> expr\65ssion 二进制 十进制 十六进制 ...

  8. php开发客服系统(持久连接+轮询+反向ajax 转载 http://www.tuicool.com/articles/2mU7v2R)

    php开发客服系统( 下载源码 ) 用户端(可直接给客户发送消息) 客服端(点击用户名.即可给该用户回复消息) 讲两种实现方式: 一:iframe + 服务器推技术comet(反向ajax,即服务器向 ...

  9. Generate Ubuntu Install Media On Mac

    Opps, my computer system was broken again... Let's repire it. Introduction The system of my PC is br ...

  10. 补全Gemfile缺少到javascript gem

    如果缺少某个gem,查看并修改Gemfile文件 第一步要先修改源 source 'https://ruby.taobao.org' 下面补全这两个gem gem 'execjs' gem 'ther ...