现在的位置: 首页 > 综合 > 正文

RabbitMQ概念笔记

2013年10月07日 ⁄ 综合 ⁄ 共 2287字 ⁄ 字号 评论关闭

- 交换器(Exchange),它是发送消息的实体。

- 队列(Queue),这是接收消息的实体。

- 绑定器(Bind),将交换器和队列连接起来,并且封装消息的路由信息。

交换器也有一些性质:

- 持久性:如果启用,交换器将会在协商器重启前都有效。

- 自动删除:如果启用,那么交换器将会在其绑定的队列都被删除掉之后自动删除掉自身。

- 惰性:如果没有声明交换器,那么在执行到使用的时候会导致异常,并不会主动声明。

 拥塞控制

在给出的例子中,对消息的使用永远看做是一个订阅。那么考虑到了拥塞控制吗?规范制定了QoS23特性,限制了通过一个通道发送到一个消费者的消息总量。很不幸的是,这个特性在当前RabbitMQ的版本中还不支持(计划在1.6),但是在原则上是应该被AMQP API支持的。

作为一个替代方案,客户端可以选择从队列中取出消息而不是通过订阅。当使用这种方法的时候,拥塞控制可以手动地实现。

AMQP当中有四个概念非常重要:虚拟主机(virtual host),交换机(exchange),队列(queue)和绑定(binding)。一个虚拟主机持有一组交换机、队列和绑定。为什么需要多个虚拟主 机呢?很简单,RabbitMQ当中,用户只能在虚拟主机的粒度进行权限控制。因此,如果需要禁止A组访问B组的交换机/队列/绑定,必须为A和B分别创 建一个虚拟主机。每一个RabbitMQ服务器都有一个默认的虚拟主机“/”。如果这就够了,那现在就可以开始了。

  • 队列是由消费者(Consumer)通过程序建立的,不是通过配置文件或者命令行工具。
  • 交换机可以理解成具有路由表的路由程序
    • 每个交换机在自己独立的进程当中执行,因此增加多个交换机就是增加多个进程,可以充分利用服务器上的CPU核以便达到更高的效率。
  • 交换机当中有一系列的绑定(binding),即路由规则(routes)

交换机类型

  • Fanout Exchange – 不处理路由键。你只需要简单的将队列绑定到交换机上。一个发送到交换机的消息都会被转发到与该交换机绑定的所有队列上。很像子网广播,每台子网内的主机都获得了一份复制的消息。Fanout交换机转发消息是最快的。
  • Direct Exchange – 处理路由键。需要将一个队列绑定到交换机上,要求该消息与一个特定的路由键完全匹配。这是一个完整的匹配。如果一个队列绑定到该交换机上要求路由键 “dog”,则只有被标记为“dog”的消息才被转发,不会转发dog.puppy,也不会转发dog.guard,只会转发dog。
  • Topic Exchange – 将路由键和某模式进行匹配。此时队列需要绑定要一个模式上。符号“#”匹配一个或多个词,符号“*”匹配不多不少一个词。因此“audit.#”能够匹配到“audit.irs.corporate”,但是“audit.*” 只会匹配到“audit.irs”。

持久化
队列和交换机有一个创建时候指定的标志durable。durable的唯一含义就是具有这个标志的队列和交换机会在重启之后重新建立,它不表示说在队列当中的消息会在重启后恢复。

消息持久化,当你将消息发布到交换机的时候,可以指定一个标志“Delivery Mode”(投递模式)。根据你使用的AMQP的库不同,指定这个标志的方法可能不太一样。简单的说,就是将 Delivery Mode设置成2,也就是持久的(persistent)即可。一般的AMQP库都是将Delivery Mode设置成1,也就是非持久的。
消息持久化流程
    将交换机设成 durable。
    将队列设成 durable。
    将消息的 Delivery Mode 设置成2 。

如果你绑定了一个 durable的队列和一个durable的交换机,RabbitMQ会自动保留这个绑定。类似的,如果删除了某个队列或交换机(无论是不是 durable),依赖它的绑定都会自动删除。

RabbitMQ 不允许你绑定一个非坚固(non-durable)的交换机和一个durable的队列。反之亦然。要想成功必须队列和交换机都是durable的。

一旦创建了队列和交换机,就不能修改其标志了。例如,如果创建了一个non-durable的队列,然后想把它改变成durable的,唯一的办法就是删除这个队列然后重现创建。

使用RabbitMQ

1,  获取Conection
2,  获取Channel
3,  定义Exchange,Queue
4,  使用一个RoutingKey将Queue Binding到一个Exchange上
5,  通过指定一个Exchange和一个RoutingKey来将消息发送到对应的Queue上,
6,  接收方在接收时也是获取connection,接着获取channel,然后指定一个Queue直接到它关心的Queue上取消息,它对Exchange,RoutingKey及如何binding都不关心,到对应的Queue上去取消息就OK了

  • Connection

    • 连接,与rabbitmq server建立的一个连接,由ConnectionFactory创建,虽然创建时指定 了多个server address,但每个connection只与一个物理的server进行连接,此连接是基于Socket进行连接的,这个可以相似的理解为像一个DB Connection。
  • Channel
    • 建立在connection基础上的一个通道,相对于connection来说,它是轻量级的。可以这样理解,它就像是hibernate里面的session一样,相对于DB Connection来说,session就是一个轻量级的东西。

抱歉!评论已关闭.