尝试试用了下rabbitmq ,比activemq 简单很多,客户端API很简洁。
先普及几个概念
AMQP
1.基本概念:
AMQP(消息队列协议,Advanced Message Queuing Protocol)是一种消息协议 ,等同于JMS,但是JMS只是java平台的方案,且只是API级别的一个协议,AMQP是一个跨语言的协议。AMQP允许来自不同供应商的消息生产者和消费者实现真正的互操作扩展,就如同SMTP、HTTP、FTP等协议采用的方式一样。
2.AMQP模型
交换器,队列,消息,绑定
2.1 交换器
交换器是消息送达的实体。他是具名的。
属性:
passive:交换器不在事先被声明,如果其不存在将抛出错误。
durable:该交换器将在broker重启后生效。
auto-delete:该交换器将在没有消息队列绑定时自动删除。一个从未绑定任何队列的交换器不会自动删除。
注意:AMQP 1.0规范将定义可移除的交换器。
2.2 队列
队列是接收消息的实体,具有名字和属性,但没有类型。客户端可以订阅队列以便使broker递送某消息队列的内容到该客户端。另,客户端也可自动到队列取他所感兴趣的消息。
消息确保以它被送往队列时的顺序分发。但在进行某些重新路由的操作如失效处理时,其顺序则不能保证。
属性:
alternate-exchange :当消息被订阅者拒绝或者由于队列被删除而孤立时则被送往此交换器,同时队列中的该消息被删除。
passive :当队列不存在时会抛出一个错误信息,仍然不会被声明。
durable :队列将在broker重启时启动。
exclusive :队列仅服务于一个客户端。
auto-delete :队列在没有活跃订阅者的时候将自动删除。这个类似于具有auto-delete属性的交换器:如果队列上从未有活动的订阅者则不会自动删除。当客户端终结时,exclusive类型的队列则一定会自动删除。
注意:AMQP 1.0中,队列将替代交换器。
2.3 消息
消息是不具名的。它被发布到交换器。它由消息头和消息体组成。消息体是不透明的,而消息头则由一系列的可选属性组成:
routing-key :该域的使用取决于交换器的类型。
immediate :如果至少一个队列可以接收,但却没有订阅者,则该消息将被当作无路由进行处理。
delivery-mode :指出该消息可能需要持久性存储。broker仅对此类消息在被消费前进行最大能力的防丢失措施。如果不能确定broker终结时消息是否投递成功则可能会发生消息被多次投递的情况。不具有这个属性的消息则不会如此。
priority :相对于其他消息的优先权,范围0至9.
expiration :消息在被broker当作不可路由处理前的存续时间,以毫秒为单位。
2.4 绑定
绑定是队列和交换器之间的关系,规定消息如何由交换器到队列。绑定的属性被交换器用来与路由算法匹配。绑定和交换器算法可组合形成各种情形:
Unconditional:绑定无任何属性,交换器请求所有的消息。
Conditional on a fixed string :绑定有一个属性routingkey,请求所有与此标识相符的消息。
Conditional on a pattern match :绑定有一个属性routingkey,请求所有与此标识的模式匹配的消息。可以使用通配符。AMQP实现了主题匹配模式。
Conditional on multiple fixed strings :绑定有一个属性表,请求所有与各个表项匹配的消息。各表项的条件可以是与、或。
Conditional on multiple patterns :绑定有一个属性表,请求所有与各个表项的模式匹配的消息。
Conditional on algorithmic comparison :绑定有一个算术表达式(类似SQL的SELECT WHERE语句),请求所有头部匹配此表达式的消息。
Conditional on content inspection :绑定指定通配符,请求所有消息实际内容与此条件相符的消息。
注意:这些并非全部是标准,取决于具体实现。
3.交换类型及对绑定的影响
以上4个实体形成了AMQP的基本模型。理解消息如何传递到队列的关键在于交换器的类型与路由关键字之间的关系。
当一个消息的路由关键字与绑定中的模式匹配时,交换器会把该消息的拷贝送达队列。如何进行匹配仅依赖于交换器的类型:
direct型 :消息的路由关键字与绑定相同。
fanout型 :总是匹配,即使绑定无关键字。
topic型 :匹配路由关键字属性,字符串的各个部分以'.'分隔。可包含两个特殊字符:'*'表示单个任意词,'#'表示0个或多个词,例如 *.stock.# 匹配usd.stock和eur.stock.db,但不匹配stock.nasdaq。
headers型 :匹配各个键-值对的逻辑组合结果。
其它由供应商自定义的交换器也被允许。
命名队列到命名交换器的绑定具有强大的属性——通过绑定使得这两个实体相互独立。例如,可以将同一个队列通过多个绑定连接到同一个或者多个交换器上。或者,多个消费者可以以相同的参数绑定到同一个队列上,这样每个消费者仅能得到其他消费者没有消费的消息。或者,多个消费者可以声明各自独立的队列但共享同一个绑定,如此,每个消费者都将得到与其他消费者相同的消息。
注意点:
AMQP 1.0规范草案改变了AMQP的模型:移除交换器和绑定的概念,代之以队列和链接。这变将导致2个问题:
1. 发布者需要知道接收者的拓扑,即何种交换器及其类型;
2. 生产者的流控:如果一个交换器对两个不同的队列进行路由,其中一个空闲而另一个近乎满载,那么如何流控进行呢?
tips:
QOS:(Quality of Service)即服务质量。对于网络业务,服务质量包括传输的带宽、传送的时延、数据的丢包率等。在网络中可以通过保证传输的带宽、降低传送的时延、降低数据的丢包率以及时延抖动等措施来提高服务质量。
QoS服务模型
通常QoS提供以下三种服务模型:
1.Best-Effort service(尽力而为服务模型)
Best-Effort服务模型Best-Effort是一个单一的服务模型,也是最简单的服务模型。对Best-Effort服务模型,网络尽最大的可能性来发送报文。但对时延、可靠性等性能不提供任何保证。
Best-Effort服务模型是网络的缺省服务模型,通过FIFO(first in first out 先入先出)队列来实现。它适用于绝大多数网络应用,如FTP、E-Mail等。
2.Integrated service(综合服务模型,简称Int-Serv)
Int-Serv服务模型Int-Serv是一个综合服务模型,它可以满足多种QoS需求。该模型使用资源预留协议(RSVP),RSVP运行在从源端到目的端的每个设备上,可以监视每个流,以防止其消耗资源过多。这种体系能够明确区分并保证每一个业务流的服务质量,为网络提供最细粒度化的服务质量区分。
3.Differentiated service(区分服务模型,简称Diff-Serv)
Diff-Serv服务模型Diff-Serv是一个多服务模型,它可以满足不同的QoS需求。与Int-Serv不同,它不需要通知网络为每个业务预留资源。区分服务实现简单,扩展性较好。