工作中使用的是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. LeetCode Add Two Numbers II

    原题链接在这里:https://leetcode.com/problems/add-two-numbers-ii/ 题目: You are given two linked lists represe ...

  2. python引用py文件中文报错

    文件 a.py 中引用文件 b.py 如果文件b.py中包含中文,会报错. 文件hello.py中代码如下: def say_nihao(): print "你好" 文件main. ...

  3. webapi post 请求多个参数

    Some programmers are tring to get or post multiple parameters on a WebApi controller, then they will ...

  4. 分布式集群搭建(hadoop2.6.0+CentOS6.5)

    摘要:之前安装过hadoop1.2.1集群,发现比较老了,后来安装cloudera(hadoop2.6.0),发现集成度比较高,想知道原生的hadoop什么样子,于是着手搭建一个伪分布式集群(三台), ...

  5. tar压缩

    tar 压 缩:tar -jcv -f filename.tar.bz2 要被压缩的文件或目录名称 查 询:tar -jtv -f filename.tar.bz2 解压缩:tar -jxv -f f ...

  6. LCD接口(转载)

    LCD接口分类 1.   I8080接口,我觉得应该就是所谓的8080,通常会用在12864屏上面,且有内部sdram,不需要实时的刷新图片,速度有限制, 支持的数据宽度有8/9/16/18bit,接 ...

  7. java运行环境和运行机制

    先来介绍三个概念: JVM----JAVA virtual machine      java虚拟机:对字节码提供相同的接口,对操作系统提供不同的接口,以适应各个OS JRE----JAVA runt ...

  8. 《zw版·Halcon-delphi系列原创教程》 Halcon分类函数016,xld,xld轮廓

    <zw版·Halcon-delphi系列原创教程> Halcon分类函数016,xld,xld轮廓 为方便阅读,在不影响说明的前提下,笔者对函数进行了简化: :: 用符号“**”,替换:“ ...

  9. MySQL错误:The user specified as a definer (XXX@XXX) does not exist

    今天由于更换服务器,重新再本地备份了数据库,试运行程序报错,如下: MySQL错误:The user specified as a definer (XXX@XXX) does not exist 意 ...

  10. 2.多线程-GCD

    1.基本概念 同步任务:在当前线程按顺序执行,不开启新的线程 异步任务:有开新线程的欲望   串行队列:一个一个执行 并行队列:多个任务同时执行 --------------------------- ...