上一篇记录了一下AMQP协议,RabbitMQ是一个Erlang开发的AMQP协议的开源实现。这一篇简单的介绍一下RabbitMQ的基本原理。

一、RabbitMQ的特点

  1、可靠性:RabbitMQ可以通过持久化、传输确认及发布确认来保证可靠性。

  2、扩展性:多个RabbitMQ节点可以组成一个集群,也可以根据实际业务情况动态地扩展集群中节点。

  3、多种协议:RabbitMQ除了原生支持AMQP协议,还支持STOMP,MQTT等多种消息中间件协议。

  4、管理界面:RabbitMQ提供了一个易用的用户界面,使得用户可以监控和管理消息、集群中的节点。

  5、多语言客户端:RabbitMQ几乎支持所有常用语言,比如Jav a、Python、Ruby、PHP、C#、JavaScript。

二、RabbitMQ的优点

  1、 解耦:Rabbitmq中间件减少了应用程序之间的强依赖,举个例子:电商后台要删除某个产品,除了要delete数据库数据,还要通知CMS,如果通知CMS的操作使用RabbitMQ那么,电商后台删除产品的应用程序就不需要等待CMS响应。

  2、存储:消息中间件支持数据持久化。如果通知CMS失败,那么通知信息会被持久化,直到能够通知到CMS为止。
  3、扩展性:消息中间件解耦了应用的过程,所以提供消息入队和处理的效率是很容易的,只需要增加处理流程就可以了。
  4、削峰:对于突发的大访问压力,使用消息中间件采用队列的形式可以减少突发访问压力,不会因为突发的超时负荷要求而崩溃。
  5、可恢复性:消息中间件降低了进程间的耦合性,当一个处理消息的进程挂掉后,加入消息中间件的消息仍然可以在系统恢复后重新处理
  6、顺序保证:RabbitMQ就是消息队列的实现,消息队列的特点就是先进先出,所以有顺序保证。

  7、异步通信:通过把把消息发送给消息中间件,消息中间件并不立即处理它,后续在慢慢处理。

三、RabbitMQ的原理

  1、RabbitMQ中设计的名词解释

    (1)Producer(生产者):生产者和消费者都是RabbitMQ的客户端,生产者就是为了生产消息。

    (2)Consumer(消费者):生产者和消费者都是RabbitMQ的客户端,消费者就是数据的接收方,消费者从queue中取数据。

    (3)Broker:RabbbitMQ消息队列代理服务器实体。

    (4)Vhost(虚拟主机):一个Broker里可以开设多个vhost,用作不同用户的权限分离。

    (5)Message:传输的消息体,由payload和label组成,payload是传输的消息数据,label是exchange的名字,作为tag。

    (6)Exchanges:Producer发送的消息会通过Exchange根据相应的规则分发到queue。

    (7)Binding(绑定):指定交换器和队列之间的关系,就是把exchange和queue按照路由规则绑定起来。

    (8)Queue:用来存储消息的地方,由Consumer进行消费,消费之后queue的这个消息就被删除掉了。

    (9)Routing Key(路由关键字):exchange根据Routing Key将消息投放到相应队列。

    (10)Connection:Producer和Consumer这两个客户端都是通过TCP连接到某个虚拟主机。

    (11)Channel(消息通道):包含了大量的API可用于编程。在客户端的每个连接里,可建立多个channel,每个channel代表一个会话任务。也就是说,一般情况是程序起始建立TCP连接,第二步就是建立这个Channel。目的是保持长连接,减少tcp创建的性能损耗。

    (12)ConnectionFactory:连接工厂类,可以创建一个连接。

    (13)Acknowledged(ack):Consumer将消息消费完毕后给server的回执确认,Server确认后会把消息从queue中删除。

    (14)Direct:Exchange的一种类型,如果 routing key 匹配, 那么Message就会被传递到相应的queue中。

    (15)Fanout: Exchange的一种类型,所有与exchange关联的queue都会被传递。

    (16)Topic: Exchange的一种类型,按照routingkey规则匹配的queue 。

  2、RabbitMQ流程图(来自于百度图片)

    

  3、RabbitMQ原理描述    

    假设Producer1和Consumer1注册了相同的Broker,Exchange和Queue。Producer1发送的消息最终会被Consumer1消费。基本的通信流程如下:    

      (1)Producer1生产消息,发送给服务器端的Exchange

      (2)Exchange收到消息,根据Routing Key,将消息转发给匹配的Queue1

  •  (3)Queue1收到消息,将消息发送给订阅者Consumer1
    (4)Consumer1收到消息,发送ACK给队列确认收到消息
    (5)Queue1收到ACK,删除队列中缓存的此条消息

  4、注意事项

    Consumer收到消息时需要显式的向Rabbit Broker发送ack消息或者Consumer订阅消息时设置auto_ack参数为true。在通信过程中,队列对ACK的处理有以下几种情况:

    (1)如果Consumer接收了消息,发送ack,Rabbitmq会删除队列中这个消息,发送另一条消息给Consumer。

    (2)如果Cosumer接受了消息, 但在发送ack之前断开连接,Rabbitmq会认为这条消息没有被Deliver,在Consumer在次连接的时候,这条消息会被Redeliver。

    (3)如果Consumer接受了消息,但是程序中有Bug,忘记了ack,Rabbitmq不会重复发送消息。

    (4)Rabbitmq2.0.0和之后的版本支持Consumer通过设置Requeue参数中的reject为true 拒绝某条消息,那么Rabbitmq将会把消息发送给下一个注册的Consumer。

四、RabbitMQ的应用场景  

  RabbitMQ的集中典型应用可以参考RabbitMQ的几种典型使用场景

RabbitMQ框架构建系列目录

RabbitMQ框架构建系列(二)——RabbitMQ基础知识介绍的更多相关文章

  1. RabbitMQ框架构建系列(一)——AMPQ协议

    一.MQ 在介绍RabbitMq之前,先来说一下MQ.什么是MQ?MQ全称为Message Queue即消息队列,就是一个消息的容器, MQ是消费-生产者模型的一个典型的代表,一端往消息队列中不断写入 ...

  2. flask系列二之基础知识

    一.调试模式(debug模式) 1.设置debug模式 在app.run()中传入关键字参数debug,app.run(debug=Ture),就设置当前项目为debug模式.如下所示: # 从fla ...

  3. IOS基于XMPP协议开发--XMPPFramewok框架(一):基础知识

    最近蘑菇街团队的TT的开源,使我对im产生了兴趣,然后在网上找到了XMPPFramework进行学习研究, 并写了以下系列教程供大家参考,有写的不对的地方,请大家多多包涵指正. 目录索引 IOS基于X ...

  4. Spring Ioc源码分析系列--Ioc的基础知识准备

    Spring Ioc源码分析系列--Ioc的基础知识准备 本系列文章代码基于Spring Framework 5.2.x Ioc的概念 在Spring里,Ioc的定义为The IoC Containe ...

  5. Mina 系列(二)之基础

    Mina 系列(二)之基础 Mina 使用起来多么简洁方便呀,就是不具备 Java NIO 的基础,只要了解 Mina 常用的 API,就可以灵活使用并完成应用开发. 1. Mina 概述 首先,看 ...

  6. Nginx基础知识介绍

    Nginx基础知识介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Nginx概述 Nginx是免费的.开源的.高性能的HTTP和正向/反向代理服务器.邮件代理服务器.以及T ...

  7. Swift Playgrounds for mac基础知识介绍

    Swift Playgrounds是一款适用于iPad和Mac的革命性应用程序,它使Swift学习变得互动而有趣.它不需要编码知识,因此非常适合刚开始的学生.使用Swift解决难题,以掌握基本知识.S ...

  8. TCP_Wrappers基础知识介绍

    1. TCP_Wrappers基础知识介绍 TCP_Wrappers是在 Solaris, HP_UX以及 Linux中广泛流行的免费软件.它被设计为一个介于外来服务请求和系统服务回应的中间处理软件. ...

  9. RabbitMQ入门学习系列(二),单生产者消费者

    友情提示 我对我的文章负责,发现好多网上的文章 没有实践,都发出来的,让人走很多弯路,如果你在我的文章中遇到无法实现,或者无法走通的问题.可以直接在公众号<爱码农爱生活 >留言.必定会再次 ...

随机推荐

  1. Devops step by step

    接着上次分享的devops历程[Followme Devops实践之路], 大家希望能够出一个step by step手册, 那今天我就来和手把手来一起搭建这么一套环境, 演示整个过程! 实验环境需要 ...

  2. Quartz实现分布式可动态配置的定时任务

    关键词: 1. 定时任务 2. 分布式 3. 可动态配置触发时间 一般通过Quartz实现定时任务很简单.如果实现分布式定时任务需要结合分布式框架选择master节点触发也可以实现.但我们有个实际需求 ...

  3. PHP全栈学习笔记16

    <?php $fileName = "php大师.test.php"; //补充程序,显示文件名(不包括扩展名) $start = strrpos($fileName, &q ...

  4. spark 机器学习基础 数据类型

    spark的机器学习库,包含常见的学习算法和工具如分类.回归.聚类.协同过滤.降维等使用算法时都需要指定相应的数据集,下面为大家介绍常用的spark ml 数据类型.1.本地向量(Local Vect ...

  5. 【Python语言】--Crontab结合Python脚本实现将日志每天写入到文件中

    一.前述 实际工作中将Python脚本每天定时写入到日志文件中的使用场景还是蛮多的,有很多种方法可以实现这种效果.本文选择一种方式实现,特将实现细节做如下分享,不当之处烦请指正. 二.具体 1.pyt ...

  6. python接口自动化(七)--状态码详解对照表(详解)

    简介 我们为啥要了解状态码,从它的作用,就不言而喻了.如果不了解,我们就会像个无头苍蝇,横冲直撞.遇到问题也不知道从何处入手,就是想找别人帮忙,也不知道是找前端还是后端的工程师. 状态码的作用是:we ...

  7. 【Android Studio安装部署系列】三十、从Android studio2.2.2升级到Android studio3.0之路

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 Android Studio 3.0的新功能 https://mp.weixin.qq.com/s/2XmVG4mKEDX6-bvZ ...

  8. 将svg文件化成字体图标的步骤

     一 前提摘要     有一个活就是按照需求在现有的项目中新增几个项目和修改几个项目,是很简单的,但当中遇到了一个小问题,就是tabs中图标选中和被选中的颜色问题,如果是新开发的,目前掌握的有两种办法 ...

  9. 用消息队列和socket实现聊天系统

    前言:最近在学进程间通信,所以做了一个小项目练习一下.主要用消息队列和socket(UDP)实现这个系统,并数据库存储数据,对C语言操作不熟悉的可以参照我的这篇博客:https://www.cnblo ...

  10. Docker最全教程——数据库容器化之持久保存数据(十一)

    上一节我们讲述了SQL Server容器化实践(注意,SQL Server现在也支持跨平台),本节将讲述如何持久保存数据,并且接下来将逐步讲解其他数据库(MySql.Redis.Mongodb等等)的 ...