RabbitMQ概念笔记

- 交换器(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就是一个轻量级的东西。




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
RabbitMQ是一个开源的消息代理软件,它实现了高级消息队列协议(AMQP)标准,可以在分布式应用中进行消息传递。RabbitMQ支持多种消息协议,包括AMQP、MQTT、STOMP等。下面是RabbitMQ的详细笔记: 1. RabbitMQ的基本概念 RabbitMQ是一个消息代理软件,它有以下几个基本概念: - 生产者(Producer):发送消息的应用程序。 - 消费者(Consumer):接收消息的应用程序。 - 队列(Queue):存储消息的缓冲区。 - 交换机(Exchange):接收生产者发送的消息,并将消息路由到队列中。 - 绑定(Binding):定义交换机和队列之间的关系。 2. RabbitMQ的消息传递模型 RabbitMQ的消息传递模型基于AMQP协议,包括以下几个步骤: - 生产者将消息发送给交换机。 - 交换机根据消息的路由键(routing key)将消息路由到一个或多个队列。 - 消费者从队列中接收消息。 在RabbitMQ中,消息可以按照以下几种方式进行路由: - 直接路由(Direct Exchange):只有指定路由键与绑定的路由键完全匹配的消息才会被路由到对应的队列中。 - 主题路由(Topic Exchange):路由键可以使用通配符进行匹配,例如"queue.*"表示匹配以"queue."开头的任意路由键。 - 广播路由(Fanout Exchange):将消息路由到所有绑定的队列中,无需指定路由键。 3. RabbitMQ的安装和配置 RabbitMQ可以在Linux、Windows和MacOS等操作系统上安装,具体安装方法可以参考官方文档(https://www.rabbitmq.com/download.html)。 安装完成后,需要进行一些基本的配置,包括创建用户和设置权限等。可以使用RabbitMQ的控制台或者命令行工具进行配置。 4. RabbitMQ的使用 使用RabbitMQ需要编写生产者和消费者的代码,并配置交换机、队列和绑定等信息。以下是一个简单的示例: 生产者代码: ```python import pika connection = pika.BlockingConnection(pika.ConnectionParameters('localhost')) channel = connection.channel() channel.exchange_declare(exchange='test_exchange', exchange_type='direct') channel.basic_publish( exchange='test_exchange', routing_key='test_key', body='Hello, RabbitMQ!' ) print("Sent 'Hello, RabbitMQ!'") connection.close() ``` 消费者代码: ```python import pika connection = pika.BlockingConnection(pika.ConnectionParameters('localhost')) channel = connection.channel() channel.exchange_declare(exchange='test_exchange', exchange_type='direct') result = channel.queue_declare(queue='', exclusive=True) queue_name = result.method.queue channel.queue_bind( exchange='test_exchange', queue=queue_name, routing_key='test_key' ) def callback(ch, method, properties, body): print("Received %r" % body) channel.basic_consume(queue=queue_name, on_message_callback=callback, auto_ack=True) print('Waiting for messages...') channel.start_consuming() ``` 以上代码实现了一个直接路由的消息传递模型。生产者将消息发送到名为"test_exchange"的交换机中,路由键为"test_key",消费者从队列中接收消息并打印到控制台中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值