用于路由消息,分为外部交换器和内部交换器。只有外部交换器才能直接接受 客户端的消息发布。内部交换器主要是在交换器与交换器之间工作,把某个交换器的消息路由到其他交换器上,由此来实现复杂的路由规则。
创建或者使用一个交换器
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{}, ) }
在客户端与rabbitmq服务器之间的一条通信路径,属于虚拟连接,多个channel可以复用一个TCP连接,可以降低系统资源的消耗。在高吞吐量的应用中,管理大量的网络连接需要消耗大量的系统资源,而创建多个channel则更为轻量级。
channel提供了发布确认机制,保证了消息成功传递到rabbitmq服务器。
channel提供了事务机制,在一个事务中所发布的消息,要么全部成功,要么全部失败。确保了数据的一致性,但是会影响性能,如果对性能要求比较高,一般还是使用确认机制。
队列可以通过指定"x-max-priority"属性的值,开启优先级最大支持的范围是0到255,一般设置支持最大优先级为10就可以了,否则会导致系统资源浪费。只有当队列中消息出现积压时(也就是存在消息阻塞),高优先级的会优先被消费。如果没有积压消息,仍旧是按照FIFO顺序被消费。
本文作者:枣子
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!