RabbitMQ AMQP (高级消息队列协议)

AMQP协议是Message Queue消息队列的一种协议,RabbitMQ 是基于AMQP协议实现的一种消息队列框架。
掌握RabbitMQ,必须要对AMQP的协议有所了解,才能使用的得心应手。
本文主要介绍AMQP协议和RabbitMQ的基本概念和架构,详细协议介绍可以参考AMQP的官方协议文档。http://www.amqp.org/


Message Queue 简介

概念

消息队列(Message queue)是一种进程间通信或同一进程的不同线程间的通信方式。消息的发送者和接收者不需要同时与消息队列交互。消息会保存在队列中,直到接收者取回它。

消息队列是分布式系统中重要的组件。

基本组成

producer/publisher: 消息的生产者、发布者
consumer/subscriber: 消息的消费者、订阅者
queue: 消息的缓存者
message: 消息实体
exchange:消息的交换机 (不是必备的)

场景及作用

1、解耦:通过消息队列中间件的引入,降低各模块之间的复杂度,达到解耦的目的。
2、异步:消息异步投递,通过消息队列的引入,有更加灵活的处理方式(主动拉取,服务推送),并且可以堆叠消费者进行并行处理消息。
3、限流:同一时间大规模的消息生成,通过消息中间件进行负载均衡,达到限流的目的。

AMQP简介

Amqp是一个提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。基于此协议的客户端与消息中间件可传递消息,并不受客户端/中间件同产品,不同的开发语言等条件的限制。

模型架构

Amq model:

Publisher 和 Consumer与Server保持连接, Publiser那一侧,只需要与Exchange进行保持连接。Publisher 和 Consumer登录时,需要指定virtual host,virtual host 类似C++的命名空间一样,Exchange和 Message Queue被包含在Virtual host的作用域范围之内。

消息投递:

当Publisher 有消息投递时,需要携带Exchange进行binding需要的routingkey,并且指定message投递到具体Exchange名字。这也就意味着Pushlisher并不直接和Message Queue有关联,消息投递时,只需要跟Exchange那一侧交互即可。 相关投递细节还有消息的持久化,消息投递的确认机制,消息投递的事务的操作等,后续文章会有C的代码实现。

交换机和队列绑定:

交换机与队列通过binding key进行binding, binding key就是路由到具体队列的匹配规则,当有消息进入Exchange时,Exchange会根据消息携带的routing key进行binding, routing key如果符合 binding key的匹配规则,那么消息就会投递到具有binding规则的队列。可以这样理解,routing key是跟消息关联的,binding key是与队列关联的,exchange就是比较这两者的组件。exchange有四种类似:direct topic fanout header

消息消费:

Consumer 通常会创建具体的queue和exchange,然后将其binding,根据不同的业务消费不同的消息。具体其他细节还有消费确认,Qos操作,Cancel,事务操作等。

基础组件

Server
Connection
Channel
Virtual Host
Exchange
Message
Binding
Routing Key
Binding Key
Message Queue
Exchange Type (direct topic fanout)
Producer- Consumer
Publisher- Subscriber (topic Exchange Type)

特性:
Persistent:持久化,需要同时message、 exchange、 queue 支持持久化才能达到持久化的操作
Confirm:发送确认
Quality of Service:消费者可以指定Qos操作,操作预取,节省带宽
Acknowledgements:消费确认
Transaction:事务操作,支持一组消息的发送,和消费,支持回滚操作

AMQP-RabbitMQ

简介

RabbitMQ是实现了高级消息队列协议(AMQP)的开源消息代理软件(亦称面向消息的中间件)。RabbitMQ服务器是用Erlang语言编写的,而群集和故障转移是构建在开放电信平台框架上的。所有主要的编程语言均有与代理接口通讯的客户端库。

模型

RabbitMQ官网有6种使用例子,其他具体场景需要根据自己的业务进行组合取舍

1、hello word

P产生一个hello word的消息,到消息队列,由C消费,这里用了默认的Exchange

2、work queues

P产生一些消息投递到消息队列,由C1, C2分别消费,这里使用了默认的Exchange (direct), C1消费过的消息,不会被C2消费

3、 Publish/Subscribe

发布订阅,使用fanout类型的Exchange, P投递消息到X,X是fanout的类型,分别与两个queue绑定,C1和C2消费一样的消息

4、Routing

灵活的路由,这里使用了direct类型的Exchange,按需binding,按需消费

5、Topic

topic类型的Exchange,组合了具有几个特征集合的消息,进行路由,匹配规则更加灵活

6、Rpc

两个消息队列提供Rpc的功能,客户端投递消息时,需要设置Server端消息投递时需要的Routing key,这样,Server收到消息后,处理完毕,投递返回消息到reply 队列对应的Exchange,然后被Client从reply消费,进而实现Rpc的调用

奈何官方没有C/C++实现,后面我会分享出来我实现上述例子的Demo。

特性

1、持久化、投递确认,消费确认,高可用
2、消息路由灵活,接口使用简单方便
3、集群部署
4、管理方便,有管理后台
5、Erlang编写,高并发支持

参考

https://en.wikipedia.org/wiki/Message_queue
http://www.amqp.org/
http://www.rabbitmq.com/getstarted.html

RabbitMQ AMQP (高级消息队列协议)的更多相关文章

  1. 深入剖析 RabbitMQ —— Spring 框架下实现 AMQP 高级消息队列协议

    前言 消息队列在现今数据量超大,并发量超高的系统中是十分常用的.本文将会对现时最常用到的几款消息队列框架 ActiveMQ.RabbitMQ.Kafka 进行分析对比.详细介绍 RabbitMQ 在 ...

  2. Rabbimq必备基础之对高级消息队列协议AMQP分析及Rabbitmq本质介绍

    MQ的一个产品... [消息队列] 1. MSMQ windows自带的一个服务... [petshop],message存放在文件系统中. 最原始的消息队列... [集群,消息确认,内存化,高可用, ...

  3. EasyNetQ操作RabbitMQ(高级消息队列)

    RabbitMQ是实现了高级消息队列协议(AMQP)的开源消息代理软件(亦称面向消息的中间件).写消息队列的时候用RabbitMQ比较好,但是写的时候需要自己封装下,自己的封装,就需要对RabbitM ...

  4. RabbitMQ协议-AMQP 0-9-1 (高级消息队列协议)

    工作模型 producer:生产者 Connection:TCP长连接,AMQP 0-9-1 连接通常是长期存在的.AMQP 0-9-1 是一个应用层协议,它使用 TCP 进行可靠传输.连接使用身份验 ...

  5. 编译PHP扩展amqp & php消息队列 rabbitmq

    首先介绍下AMQP: AMQP——高级消息队列协议,目前比较有名气的实现大概就是大名鼎鼎的RabbitMQ了. RabbitMQ是一个在AMQP基础上完成的,可复用的企业消息系统.他遵循Mozilla ...

  6. MQ选型对比ActiveMQ,RabbitMQ,RocketMQ,Kafka 消息队列框架选哪个?

    最近研究消息队列,发现好几个框架,搜罗一下进行对比,说一下选型说明: 1)中小型软件公司,建议选RabbitMQ.一方面,erlang语言天生具备高并发的特性,而且他的管理界面用起来十分方便.不考虑r ...

  7. rabbitmq高级消息队列

    rabbitmq使用 什么是消息队列 消息(Message)是指在应用间传送的数据.消息可以非常简单,比如只包含文本字符串,也可以很复杂,可以包含嵌入对象. 消息队列是一种应用间的通信方式,消息发送后 ...

  8. RabbitMQ (十六) 消息队列的应用场景 (转)

    原贴 : http://blog.csdn.net/cws1214/article/details/52922267 消息队列中间件是分布式系统中重要的组件,主要解决应用耦合,异步消息,流量削锋等问题 ...

  9. 第二百九十一节,RabbitMQ多设备消息队列-安装与简介

    RabbitMQ多设备消息队列-安装与简介 RabbitMQ简介 解释RabbitMQ,就不得不提到AMQP(Advanced Message Queuing Protocol)协议. AMQP协议是 ...

随机推荐

  1. idea intellij对Spring进行单元测试

    1.加入Junit4及SpringJUnit4支持 <!-- junit --> <dependency> <groupId>junit</groupId&g ...

  2. Android: Custom View和include标签的区别

    Custom View, 使用的时候是这样的: <com.example.home.alltest.view.MyCustomView android:id="@+id/customV ...

  3. css 特殊使用技巧

    1  border颜色设置 border-color: transparent black black black;   分别设置四条边框的颜色  上边transparent 透明无色 2  阴影 t ...

  4. android-基础编程-democoderjoy-架构篇

    设计这个demo很简单,针对每个控件放到一个listitem中去,主activity继承之listActivity,这样再override其单击效果进入到每个控件. 主界面流程 1.继承 MainAc ...

  5. Shell编程-08-Shell中的循环语句

    目录 while语句 until语句 for语句 select语句 循环中断控制 循环语句总结     循环语句常用于重复执行一条命令或一组命令等,直到达到结束条件后,则终止执行.在Shell中常见的 ...

  6. SSM_CRUD新手练习(1)创建项目

    最近看了SSM框架,网上找了个入门视频的比较简单的小项目熟悉一下框架.现在把整个过程记录下来. 1.创建Maven工程,注意我们选择的是simple project就够了. 这样我们的Maven项目就 ...

  7. Windows 8.1 Update中的小改变

    在Build 2014大会中,发布了Windows 8.1 Update的更新,并将于4月8日通过Windows Update进行推送.但是,在MSDN订阅下载中,带有该更新的镜像已经可以在4月3号放 ...

  8. 无法链接glew的解决办法-编译开源库出现: error LNK2001: 无法解析的外部符号

    无法链接glew的解决办法-编译开源库出现: error LNK2001: 无法解析的外部符号 参考官方配置指南:http://glew.sourceforge.net/install.html 1. ...

  9. GitHub 教程【转】

    @import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/c ...

  10. .net framework 4.5 +steeltoe+ springcloud(三)实现Hystrix断路器

    在基于.net framework的服务客户端实现断路器功能,基本项目创建步骤可以参照我的另一篇发现和调用服务的笔记,地址:http://www.cnblogs.com/troytian/p/8621 ...