[置顶] [1]AMQP(高级消息队列协议) ----入门

标签: AMQPQPIDRabbitMQActiveMQ高级消息队列协议
1979人阅读 评论(0) 收藏 举报
分类:

接触AMQP协议已经有一段时间了,这个协议比想象的中的要复杂一些,特别是针对AMQP-1-0以前的版本。具体的概念,网上可以搜索到很多的资料,本文借花献佛,让读者对AMQP协议有一个大概的了解。重点是在后续章节的关于一些遇到的技术难点的解决方案的分享。


最新的AMQP协议是1.0,但是以前还包括其他版本的协议

Final Specification by AMQP Working Group:


AMQP 1.0 Final, as contributed to OASIS.

Older Specifications:
AMQP version 0-10 by the AMQP Working Group

AMQP version 0-9-1 by the AMQP Working Group

AMQP version 0-9 by the AMQP Working Group

AMQP version 0-8 by the AMQP Working Group

AMQP的全称是Advanced Message Queuing Protocol,翻译过来就是高级消息队列协议。简单来说,AMQP是一个厂商中立、语言无关的Message Broker规范。(具体请参考http://blog.csdn.net/anyaas/article/details/17637141)

AMQP规范中有几个核心的概念:

  • Message
  • Virtual Host
  • Exchange
  • Queue
  • Binding
  • Routing Key
  • Binding Key
  • Exchange Type
  • Publisher/Producer
  • Subscriber/Consumer
  • Connection
  • Channel

Virtual Host

每个Message Broker由一个或 Virtual Host构成;可以类比一下理机和虚拟机。Virtual Host相当于一个独立的名称空间,它有属于自己的Exchange、Queue以及的一些相关对象。不同Virtual Host之间的Exchange可以重名。Queue只能和相同Virtual Host中的Exchange进行绑定。


Exchange

每个Virtual Host包含0或多个Exchange。Exchange负责把Message转发到Queue。每个Exchange可以有0或者多个Queue。每个Queue只能监听1个Exchange。

Queue

Queue即消息队列,负责存储Exchange转发过来的Message。注意,是Queue,所以Message是First-In-First-Out。


Binding

Binding指的是Exchange根据规则作出消息转发决策的过程。Message到达Exchange,Exchange此时并不知道Message应该被转发到哪些Queue,然后Exchange根据规则对Message进行Binding决策,Binding完成之后,Exchange根据Binding的结果将Message转发到正确的Queues。


Routing Key

每个Message一般来说必须指定一个Routing Key,Exchange根据Message的Routing Key进行Binding,然后完成Message的转发。


Binding Key

每个Queue一般来说必须指定一个Binding Key。 Binding的过程其实就是根据一定的规则判定Message的Routing Key是否与Queue的Binding Key匹配,如果匹配,则转发Message到Queue。如果Message的Routing Key与多个Queue的Binding Key匹配,则所有匹配的Queue都会收到该Message。


Exchange Type

Exchange Type决定了Binding的匹配规则。AMQP支持三种Exchange Type:

  • Direct Exchange
  • Topic Exchange
  • Fanout Exchange

如果你熟悉网络中单播、组播、广播的概念的话,你可以简单理解为:Direct Exchange就是单播,Topic Exchange就是组播,Fanout Exchange就是广播。


Connection

Publisher/Producer与Virutal Host 或 Subscriber/Consumer与Virtual Host之间的TCP连接。


Channel

通过多路复用技术,多个Channel共享同一个Connection。Message通过Channel在Publisher/Producer、Virutal Host、Subscriber/Consumer之间传递。


比较常见的第三方的实现有:

(1) Qpid

Qpid 是 Apache 开发的一款面向对象的消息中间件,它是一个 AMQP 的实现,可以和其他符合 AMQP 协议的系统进行通信。Qpid 提供了 C++/Python/Java/C# 等主流编程语言的客户端库,Qpid 提供了很多额外的 HA 特性,非常适于集群环境下的消息通信。

虽然QPID 有0.9 和1.0的版本,而且1.0的版本有Exchange的功能

因为QPID在我们的plugin只支持1.0的版本,所以在plugin的设计上,Sender activity没有Exchange 属性

它提供了 C++ 和 Java 两个版本的 broker服务端,并支持多种语言的客户端。C++版本的服务器端具备高性能/低消耗以及RDMA支持;而Java版本的服务器则支持JMS。Qpid 还提供了一些额外的特性:

采用 Corosync 来保证了集群环境下的 Fault-tolerant 特性
支持 XML 类型的 Exchange,当消息格式为 XML 时,可以利用 Xquery 进行过滤
支持 plugin,用户可以方便地增加新的功能,比如新的 exchange 类型
提供了安全认证特性,任何 producer/consumer 需要和 broker 通信时,都需要提供身份认证。QPID 的安全认证使用 SSL 协议。
授权协议: Apache
开发语言: Java C/C++
操作系统: 跨平台
官网:http://qpid.apache.org 

比较好的博客有:

https://www.ibm.com/developerworks/cn/opensource/os-cn-qpid1/
http://blog.sina.com.cn/s/blog_5bce66f00101htgr.html

(2) RabbitMQ

RabbitMQ是基于ErLang语言开发的,官方RabbitMQ下载地址:http://www.rabbitmq.com/download.html,选择相应的系统版本,进行下载。Erlang版本的选择尽量选择最新版本即可。

比较好的博客有:

http://jaeger.blog.51cto.com/11064196/1762756(经典)
http://www.voidcn.com/blog/Olaking/article/p-3890458.html
https://geewu.gitbooks.io/rabbitmq-quick/content/RabbitMQ%E4%BB%8B%E7%BB%8D.html


Rabbit in action 中文版可以从下面下载到

http://book.51cto.com/art/201510/495741.htm


(3)ActiveMQ

ActiveMQ是Apache软件基金下的一个开源软件,它遵循JMS1.1规范(Java Message Service),是消息驱动中间件软件(MOM)。它为企业消息传递提供高可用,出色性能,可扩展,稳定和安全保障。ActiveMQ使用Apache许可协议。因此,任何人都可以使用和修改它而不必反馈任何改变。这对于商业上将ActiveMQ用在重要用途的人尤为关键。MOM的工作是在分布式的各应用之间调度事件和消息,使之到达指定的接收者。所以高可用,高性能,高可扩展性尤为关键。

ActiveMQ的目标是在尽可能多的平台和语言上提供一个标准的,消息驱动的应用集成。ActiveMQ实现JMS规范并在此之上提供大量额外的特性。这些额外的特性也会在这本书中详细阐述。

官方网站
http://activemq.apache.org/


ActiveMQ in action 中文版
http://download.csdn.net/detail/jacky68147527/5925161


如何使用安装ActiveMQ?
H:\amqp\apache-activemq-5.13.3\data


如何配置AMQP
http://activemq.apache.org/amqp.html






1
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:384648次
    • 积分:6322
    • 等级:
    • 排名:第4065名
    • 原创:227篇
    • 转载:0篇
    • 译文:5篇
    • 评论:157条
    博客专栏