RabbitMQ与AMQP协议详解
消息队列的历史
了解一件事情的来龙去脉,将不会对它感到神秘。让我们来看看消息队列(Message Queue)这项技术的发展历史。
Message Queue的需求由来已久,80年代最早在金融交易中,高盛等公司采用Teknekron公司的产品,当时的Message queuing软件叫做:the information bus(TIB)。 TIB被电信和通讯公司采用,路透社收购了Teknekron公司。之后,IBM开发了MQSeries,微软开发了Microsoft Message Queue(MSMQ)。这些商业MQ供应商的问题是厂商锁定,价格高昂。2001年,Java Message queuing试图解决锁定和交互性的问题,但对应用来说反而更加麻烦了。
于是2004年,摩根大通和iMatrix开始着手Advanced Message Queuing Protocol (AMQP)开放标准的开发。2006年,AMQP规范发布。2007年,Rabbit技术公司基于AMQP标准开发的RabbitMQ 1.0 发布。
目前RabbitMQ的最新版本为3.5.7,基于AMQP 0-9-1。
RabbitMQ采用Erlang语言开发。Erlang语言由Ericson设计,专门为开发concurrent和distribution系统的一种语言,在电信领域使用广泛。OTP(Open Telecom Platform)作为Erlang语言的一部分,包含了很多基于Erlang开发的中间件/库/工具,如mnesia/SASL,极大方便了Erlang应用的开发。OTP就类似于Python语言中众多的module,用户借助这些module可以很方便的开发应用。
AMQP messaging 中的基本概念
- Broker: 接收和分发消息的应用,RabbitMQ Server就是Message Broker。
- Virtual host: 出于多租户和安全因素设计的,把AMQP的基本组件划分到一个虚拟的分组中,类似于网络中的namespace概念。当多个不同的用户使用同一个RabbitMQ server提供的服务时,可以划分出多个vhost,每个用户在自己的vhost创建exchange/queue等。
- Connection: publisher/consumer和broker之间的TCP连接。断开连接的操作只会在client端进行,Broker不会断开连接,除非出现网络故障或broker服务出现问题。
- Channel: 如果每一次访问RabbitMQ都建立一个Connection,在消息量大的时候建立TCP Connection的开销将是巨大的,效率也较低。Channel是在connection内部建立的逻辑连接,如果应用程序支持多线程,通常每个thread创建单独的channel进行通讯,AMQP method包含了channel id帮助客户端和message broker识别channel,所以channel之间是完全隔离的。Channel作为轻量级的Connection极大减少了操作系统建立TCP connection的开销。
- Exchange: message到达broker的第一站,根据分发规则,匹配查询表中的routing key,分发消息到queue中去。常用的类型有:direct (point-to-point), topic (publish-subscribe) and fanout (multicast)。
- Queue: 消息最终被送到这里等待consumer取走。一个message可以被同时拷贝到多个queue中。
- Binding: exchange和queue之间的虚拟连接,binding中可以包含routing key。Binding信息被保存到exchange中的查询表中,用于message的分发依据。
典型的“生产/消费”消息模型
生产者发送消息到broker server(RabbitMQ)。在Broker内部,用户创建Exchange/Queue,通过Binding规则将两者联系在一起。Exchange分发消息,根据类型/binding的不同分发策略有区别。消息最后来到Queue中,等待消费者取走。
Exchange类型
Exchange有多种类型,最常用的是Direct/Fanout/Topic三种类型。
Direct (point 2 point 点对点模式)
Message中的“routing key”如果和Binding中的“binding key”一致, Direct exchange则将message发到对应的queue中。Fanout (多播模式)
每个发到Fanout类型Exchange的message都会分到所有绑定的queue上去。Topic (发布-订阅模式)
根据routing key,及通配规则,Topic exchange将分发到目标queue中。
Routing key中可以包含两种通配符,类似于正则表达式:
“#”通配任何零个或多个word
“*”通配任何单个word
这里也推荐给想要了解RabbitMQ的同学一个网站,http://tryrabbitmq.com ,它提供在线RabbitMQ 模拟器,可以帮助理解Exchange/queue/binding概念。
至此,我们对于消息队列的发展,RabbitMQ的产生,以及AMQP协议中的重要概念做了一个完整的介绍。
RabbitMQ与AMQP协议详解相关推荐
- RabbitMq的六种模式分析详解
AMQP 即Advanced Message Queuing Protocol,高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计.消息中间件主要用于组件之间的解耦,消息的发送者无需 ...
- IoT:MQTT协议详解
IoT -- (七)MQTT协议详解 转自:https://blog.csdn.net/anxianfeng55555/article/details/80908795 MQTT是什么? MQTT(M ...
- HTTP协议详解(真的很经典)
转自:http://blog.csdn.net/gueter/archive/2007/03/08/1524447.aspx Author :Jeffrey 引言 HTTP是一个属于应用层的面向对象的 ...
- Http 协议详解笔记
HTTP是一个属于应用层的面向对象的协议,由于其简捷.快速的方式,适用于分布式超媒体信息系统.它于1990年提出,经过几年的使用与发展,得到不断地完善和扩展.目前在WWW中使用的是HTTP/1.0的第 ...
- Http协议 详解(转载)
http://blog.csdn.net/gueter/archive/2007/03/08/1524447.aspx 引言 HTTP是一个属于应用层的面向对象的协议,由于其简捷.快速的方式,适用于分 ...
- ARP协议详解之ARP动态与静态条目的生命周期
ARP协议详解之ARP动态与静态条目的生命周期 ARP动态条目的生命周期 动态条目随时间推移自动添加和删除. q 每个动态ARP缓存条目默认的生命周期是两分钟.当超过两分钟,该条目会被删掉.所以,生 ...
- ARP缓存表的构成ARP协议全面实战协议详解、攻击与防御
ARP缓存表的构成ARP协议全面实战协议详解.攻击与防御 1.4.3 ARP缓存表的构成 在局域网的任何一台主机中,都有一个ARP缓存表.该缓存表中保存中多个ARP条目.每个ARP条目都是由一个IP ...
- HTTP协议详解 转自小坦克
HTTP协议详解 转自小坦克 -- 有些文章是引用别人的,为了方便我以后或不再备注;引用目的是因为直接网摘里面的地址经常被重置,找不到原来的文章 当今web程序的开发技术真是百家争鸣,ASP.NET, ...
- nbns协议_网络协议详解1 - NBNS
NetBIOS 简介 NetBIOS,Network Basic Input/Output System的缩写,一般指用于局域网通信的一套API,相关RFC文档包括 RFC 1001, RFC 100 ...
最新文章
- vmd变分模态分解程序matlab论坛_博士兼职辅导员论坛分享会第三期
- 运行webpack命令每次提示安装webpack-cli
- c语言数组的一维编程,【C语言】转换一维数组
- 关于读取数据库进行数据处理的一些小问题
- 如果你不习惯新版的 Github 的 UI 界面,可以试试这款插件
- 《Linux内核设计与实现》读书笔记(十二)- 内存管理
- 4 angular 重构 项目_c# – 将Angular 4添加到ASP.NETCore项目中
- maven的常见问题_Maven常见问题和陷阱
- Oracle OCM 认证指南
- C++ 容器适配器(stack、queue、priority_queue)
- 漫画 | 如果面试时大家都说真话…
- Luogu2481 SDOI2010 代码拍卖会 DP、组合
- Scrapy 中的 Request 对象和 Respionse 对象
- java爱心效果代码来了
- Altium Designer软件插件之封装神器Altium Library Loader
- apt gives “Unstable CLI Interface” warning
- 软件授权解决方案FlexNet Publisher
- 英语发音规则---s发/s/的读音规则
- 分布式NoSQL列存储数据库Hbase(六)
- 《跃迁——成为高手的技术》:让人生破局
热门文章
- 深入理解JVM(1):类加载器
- 微信小程序全栈开发实践 第二章 微信小程序组件介绍及使用 -- 2.10 image组件,如何实现图片懒加载?
- 把一个数转换成2的幂次方
- java编写2 22 222_Java 基础编程二
- 一份“奇妙”的银行流水
- 基于ESP32的非接触式在线体温簿
- 严重: Context initialization failed,TypeNotPresentExcepti解决:struts注释annotation加载错误
- 求一个矩阵的逆矩阵(用伴随矩阵求)
- 漫步微积分九——乘法和除法法则
- Wifi 的Log分析