上一篇记录了一下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. SQL Server中是否可以准确获取最后一次索引重建的时间?

    在SQL Server中,我们能否找到索引的创建时间?最后一次索引重建(Index Rebuild)的时间? 最后一次索引重组(INDEX REORGANIZE)的时间呢?  答案是我们无法准确的找到 ...

  2. c/c++ 网络编程 陈硕老师视频理解之ttcp

    ttcp 是干啥的:测试2台机器间的网络传输性能 wiki 功能如下图: 对应的视频是: 4.回顾基础的Sockets API.mkv 5.TTCP代码概览.mkv 6.使用TTCP进行网络传输性能测 ...

  3. 解决 win10飞行模式 无限自动开关 无法关闭

    驱动问题,名为“Insyde Airplane Mode HID Mini-Driver”的驱动,这个驱动是专门用来快捷管理飞行模式的. 卸载完成后重启,无限开关飞行模式问题得到解决!

  4. Daily Life 01

    2019-03-03 我不擅于用文字记录自己的生活,因为很长时间一个人习惯了随意简单的生活,觉得很多事留给回忆就好,另一方面文笔不好,怕自己流出的文字不有趣,过于流水.有看过一些身边人写的随记,都有写 ...

  5. ASP.Net Core on Linux (CentOS7) 共享第三方依赖库部署

    背景: 这周,心情来潮,想把 Aries 开发框架 和 Taurus 开发框架 给部署到Linux上,于是开始折腾了. 经过重重非人的坑,终于完成了任务: Aries on CentOS7:mvc.a ...

  6. 以Windows服务方式运行ASP.NET Core程序

    我们对ASP.NET Core的使用已经进行了相当一段时间了,大多数时候,我们的Web程序都是发布到Linux主机上的,当然了,偶尔也有需求要发布到Windows主机上,这样问题就来了,难道直接以控制 ...

  7. .NET Core 2.1来了!

    太棒了! .NET Core 2.0正式发布至今已经过去了大半年,这大半年说长不长说短不短,这段时间里,我是充分地体会到了微软的诚意,那就是认认真真打造一个优秀的开源平台.这大半年的时间里,微软一直在 ...

  8. redis发布订阅Java代码实现

    Redis除了可以用作缓存数据外,另一个重要用途是它实现了发布订阅(pub/sub)消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息. 为了实现redis的发布订阅机制,首先要打开re ...

  9. 【Python实践-1】求一元二次方程的两个解

    知识点: import sys, sys模块包含了与Python解释器和它的环境有关的函数. “sys”是“system”的缩写.sys.exit() 中途退出程序, (注:0是正常退出,其他为不正常 ...

  10. 死磕 java集合之ConcurrentHashMap源码分析(三)

    本章接着上两章,链接直达: 死磕 java集合之ConcurrentHashMap源码分析(一) 死磕 java集合之ConcurrentHashMap源码分析(二) 删除元素 删除元素跟添加元素一样 ...