上一篇记录了一下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. Windows 10-限制Windows更新上传带宽

    Windows Update Delivery Optimization可帮助您更快,更可靠地获取Windows更新和Microsoft Store应用程序. Windows Update Deliv ...

  2. 如何在你的项目中集成 CAP【手把手视频教程】

    前言 之前录制过一期关于CAP的视频,但是由于当时是直播时录制的视频,背景音比较杂所以质量有点差.这次的视频没有直播,直接录制的,视频质量会好很多,第一遍录制完成之后发现播放到一半没有声音,所以又重新 ...

  3. PHP全栈学习笔记3

    trim()函数,用于去除字符串首尾空格和特殊字符 返回的是去掉的空格和特殊字符后的字符串 string trim(string str [,string charlist]); str 要操作的字符 ...

  4. iFace Chain [ 爱妃链 ] 或将凭借人脸密钥技术成为安全领域最大的赢家

    前段时间iFace Chain [ 中文音译名称: 爱妃链 ] 安全专家揭密了区块链领域,数字资产存放于无信用钱包中的一些风险,并为区块链玩家解密如何安全保护资产私钥,我们再来回顾分析一下目前跑路钱包 ...

  5. jdk安装 java环境配置

    登录http://www.oracle.com,下载JDK(J2SE) JDK 1.0,1.1,1.2,1.3,1.4 1.5 (JDK5.0) à支持注解.支持泛型 1.6(JDK6.0) à Se ...

  6. CentOS7 安装mysql 5.7

    一.安装准备 检查系统中是否安装了mysqlrpm -qa|grep mysql如果有安装mysql,则需要先卸载之前安装的mysqlyum -y remove mysql然后再查看mysql是否都卸 ...

  7. 【Hadoop篇】--Hadoop常用命令总结

    一.前述 分享一篇hadoop的常用命令的总结,将常用的Hadoop命令总结如下. 二.具体 1.启动hadoop所有进程start-all.sh等价于start-dfs.sh + start-yar ...

  8. SQL Server的case when用法

    1.简单sql一例 SELECT top 10 CASE WHEN IDENTITY_ID='1' THEN '管理员' WHEN IDENTITY_ID='5' THEN '学生' ELSE '无' ...

  9. SpringBoot简单打包部署(附工程)

    前言 本文主要介绍SpringBoot的一些打包事项和项目部署以及在其中遇到一些问题的解决方案. SpringBoot打包 在SpringBoot打包这块,我们就用之前的一个web项目来进行打包. 首 ...

  10. Docker最全教程之使用Tencent Hub来完成CI(九)

    使用Tencent Hub来完成CI 关于Tencent Hub Tencent Hub是腾讯出品的DevOps服务.主要提供多存储格式的版本管理,支持Docker Image.Binary.Helm ...