RabbitMQ框架构建系列(二)——RabbitMQ基础知识介绍
上一篇记录了一下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框架构建系列(一)——AMPQ协议
一.MQ 在介绍RabbitMq之前,先来说一下MQ.什么是MQ?MQ全称为Message Queue即消息队列,就是一个消息的容器, MQ是消费-生产者模型的一个典型的代表,一端往消息队列中不断写入 ...
- flask系列二之基础知识
一.调试模式(debug模式) 1.设置debug模式 在app.run()中传入关键字参数debug,app.run(debug=Ture),就设置当前项目为debug模式.如下所示: # 从fla ...
- IOS基于XMPP协议开发--XMPPFramewok框架(一):基础知识
最近蘑菇街团队的TT的开源,使我对im产生了兴趣,然后在网上找到了XMPPFramework进行学习研究, 并写了以下系列教程供大家参考,有写的不对的地方,请大家多多包涵指正. 目录索引 IOS基于X ...
- Spring Ioc源码分析系列--Ioc的基础知识准备
Spring Ioc源码分析系列--Ioc的基础知识准备 本系列文章代码基于Spring Framework 5.2.x Ioc的概念 在Spring里,Ioc的定义为The IoC Containe ...
- Mina 系列(二)之基础
Mina 系列(二)之基础 Mina 使用起来多么简洁方便呀,就是不具备 Java NIO 的基础,只要了解 Mina 常用的 API,就可以灵活使用并完成应用开发. 1. Mina 概述 首先,看 ...
- Nginx基础知识介绍
Nginx基础知识介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Nginx概述 Nginx是免费的.开源的.高性能的HTTP和正向/反向代理服务器.邮件代理服务器.以及T ...
- Swift Playgrounds for mac基础知识介绍
Swift Playgrounds是一款适用于iPad和Mac的革命性应用程序,它使Swift学习变得互动而有趣.它不需要编码知识,因此非常适合刚开始的学生.使用Swift解决难题,以掌握基本知识.S ...
- TCP_Wrappers基础知识介绍
1. TCP_Wrappers基础知识介绍 TCP_Wrappers是在 Solaris, HP_UX以及 Linux中广泛流行的免费软件.它被设计为一个介于外来服务请求和系统服务回应的中间处理软件. ...
- RabbitMQ入门学习系列(二),单生产者消费者
友情提示 我对我的文章负责,发现好多网上的文章 没有实践,都发出来的,让人走很多弯路,如果你在我的文章中遇到无法实现,或者无法走通的问题.可以直接在公众号<爱码农爱生活 >留言.必定会再次 ...
随机推荐
- SQL Server中是否可以准确获取最后一次索引重建的时间?
在SQL Server中,我们能否找到索引的创建时间?最后一次索引重建(Index Rebuild)的时间? 最后一次索引重组(INDEX REORGANIZE)的时间呢? 答案是我们无法准确的找到 ...
- c/c++ 网络编程 陈硕老师视频理解之ttcp
ttcp 是干啥的:测试2台机器间的网络传输性能 wiki 功能如下图: 对应的视频是: 4.回顾基础的Sockets API.mkv 5.TTCP代码概览.mkv 6.使用TTCP进行网络传输性能测 ...
- 解决 win10飞行模式 无限自动开关 无法关闭
驱动问题,名为“Insyde Airplane Mode HID Mini-Driver”的驱动,这个驱动是专门用来快捷管理飞行模式的. 卸载完成后重启,无限开关飞行模式问题得到解决!
- Daily Life 01
2019-03-03 我不擅于用文字记录自己的生活,因为很长时间一个人习惯了随意简单的生活,觉得很多事留给回忆就好,另一方面文笔不好,怕自己流出的文字不有趣,过于流水.有看过一些身边人写的随记,都有写 ...
- ASP.Net Core on Linux (CentOS7) 共享第三方依赖库部署
背景: 这周,心情来潮,想把 Aries 开发框架 和 Taurus 开发框架 给部署到Linux上,于是开始折腾了. 经过重重非人的坑,终于完成了任务: Aries on CentOS7:mvc.a ...
- 以Windows服务方式运行ASP.NET Core程序
我们对ASP.NET Core的使用已经进行了相当一段时间了,大多数时候,我们的Web程序都是发布到Linux主机上的,当然了,偶尔也有需求要发布到Windows主机上,这样问题就来了,难道直接以控制 ...
- .NET Core 2.1来了!
太棒了! .NET Core 2.0正式发布至今已经过去了大半年,这大半年说长不长说短不短,这段时间里,我是充分地体会到了微软的诚意,那就是认认真真打造一个优秀的开源平台.这大半年的时间里,微软一直在 ...
- redis发布订阅Java代码实现
Redis除了可以用作缓存数据外,另一个重要用途是它实现了发布订阅(pub/sub)消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息. 为了实现redis的发布订阅机制,首先要打开re ...
- 【Python实践-1】求一元二次方程的两个解
知识点: import sys, sys模块包含了与Python解释器和它的环境有关的函数. “sys”是“system”的缩写.sys.exit() 中途退出程序, (注:0是正常退出,其他为不正常 ...
- 死磕 java集合之ConcurrentHashMap源码分析(三)
本章接着上两章,链接直达: 死磕 java集合之ConcurrentHashMap源码分析(一) 死磕 java集合之ConcurrentHashMap源码分析(二) 删除元素 删除元素跟添加元素一样 ...