编辑
2024-07-24
计算机技术
00
请注意,本文编写于 142 天前,最后修改于 135 天前,其中某些信息可能已经过时。

目录

基本流程
交换器(exchange)
通道(channel)
确认机制(confirm)
事务(transactions)
队列(queue)
优先级

基本流程

  1. 客户端建立ampq连接
  2. 获取一个用于通信的channel
  3. 创建exchange
  4. 创建queue
  5. 绑定queue和exchange以及key
  6. 生产者指定exchange和key发布消息,消息进入queue
  7. 消费者指定queue接收消息

交换器(exchange)

用于路由消息,分为外部交换器和内部交换器。只有外部交换器才能直接接受 客户端的消息发布。内部交换器主要是在交换器与交换器之间工作,把某个交换器的消息路由到其他交换器上,由此来实现复杂的路由规则。

创建或者使用一个交换器

func (ch *Channel) ExchangeDeclare(name, kind string, durable, autoDelete, internal, noWait bool, args Table) error { if err := args.Validate(); err != nil { return err } return ch.call( &exchangeDeclare{ Exchange: name, //交换器的名称,如果已存在就不会创建,而是直接使用 Type: kind, //交换机类型,direct/topic/fanout等,或者第三方插件提供的类型,如x-delayed-message,表示延迟交换机 Passive: false, Durable: durable, //是否持久化,持久化会保存在磁盘上,重启后交换机依然存在 AutoDelete: autoDelete, //是否自动删除,exchange从创建直到还没有绑定任何queue之时,不会自动删除。但是一旦绑定了queue,当绑定的queue都被删除或者都被解除绑定后,exchange会自动删除 Internal: internal, //是否为内部交换机,如果是内部交换机,则不会直接接收客户端发送的消息。内部交换机主要用于实现复杂的消息路由匹配。在交换机与交换机之间工作(在交换机与交换机之间转发消息,情况较少),或者在交换机与队列之间工作(内部交换机可以直接绑定队列,把普通交换机传递来的消息,直接路由到内部交换机绑定的队列,然后等待消费者消费,情况较多)。 NoWait: noWait, //是否不等待服务器的确认(相当于是否进行异步操作,为true时将进行异步操作,不会等待资源创建成功,即使创建失败也不会及时通过返回值告知,需要通过其他机制来捕捉错误,为false时,会等待服务器创建成功或失败后,才会返回值,可以直接获取到结果) Arguments: args, //额外参数,常见的如下 //"alternate-exchange":指定一个备用交换机,如果消息不能路由到绑定队列,则转发到备用交换机。(当队列已经满了,或者队列不存在,或者交换机没有匹配的路由键,就会出现消息不能路由到绑定队列) //"x-dead-letter-exchange":指定交换机的死信交换机,当消息在队列中因为达到最大长度,或者TTL到期等原因变成死信时,会被路由到这个交换机 //"x-dead-letter-routing-key":指定死信重新投递到死信交换机时使用的路由键,来路由到对应的队列中 //"x-delayed-type":指定延迟交换机中实际使用的交换机类型,如direct/topic/fanout等,需要依赖rabbitmq_delayed_message_exchange插件, 消息在延迟交换机中等待时间到期后,就会根据实际的类型,把消息路由到队列中。 //"x-match":用于指定在Headers交换机中匹配逻辑,也就是指定消息在路由到目标队列时的匹配逻辑,可以是any(任意一个键值对匹配)或者all(必须全部匹配),header交换机的路由键为空(即使有也会被忽略),完全依赖消息头进行路由。 }, &exchangeDeclareOk{}, ) }

通道(channel)

在客户端与rabbitmq服务器之间的一条通信路径,属于虚拟连接,多个channel可以复用一个TCP连接,可以降低系统资源的消耗。在高吞吐量的应用中,管理大量的网络连接需要消耗大量的系统资源,而创建多个channel则更为轻量级。

确认机制(confirm)

channel提供了发布确认机制,保证了消息成功传递到rabbitmq服务器。

事务(transactions)

channel提供了事务机制,在一个事务中所发布的消息,要么全部成功,要么全部失败。确保了数据的一致性,但是会影响性能,如果对性能要求比较高,一般还是使用确认机制。

队列(queue)

优先级

队列可以通过指定"x-max-priority"属性的值,开启优先级最大支持的范围是0到255,一般设置支持最大优先级为10就可以了,否则会导致系统资源浪费。只有当队列中消息出现积压时(也就是存在消息阻塞),高优先级的会优先被消费。如果没有积压消息,仍旧是按照FIFO顺序被消费。

本文作者:枣子

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!