消息发布的基本流程
producer -> exchange -> (需要通过指定 binding key 将exchange和queue 绑定) -> queue -> consumer
生产者不会将消息直接发送到queue,而是仅仅发送到exchange。再由excharge根据自己类型,binding key 绑定到的queue,以及消息的routing key,最终路由到queue。消费者监听特定queue,获取到消息
消息组成
载荷(payLoad)其实就是应用业务的消息
标签(label)包含消息投递给谁,如exchage、rountingKey等信息
也是发送消息的三大必要参数
绑定 binding
将exchange和queue通过binding key 联系起来,为queue接收消息做好准备。但是消息最终能否到达以及以分发到达queue的形式,还和消息携带的rounting key 和exchage的类型有关
交换器 exchange类型
fanout
消息广播到绑定队列,只要队列绑定了交换器,与routingKey就无关了
direct
binding key = routing key 消息就会发送到发送到queue
topic
规则匹配:* . #
header
使用消息header代替routing key起到路由作用
default
由rabbitmq自动创建,不能指定exchange名字,mq自动将queue的name作为binding key 和default exchange 绑定,相当于简化的direct配置。使用场景:直接指定消息rounting key为 queue的名字
在connection建立channel的优势
一旦通过帐号密码验证,就可以和rabbitmq建立connection(tcp连接),一个connection中可以建立无数独立的channel进行通信。因为tcp连接非常耗费资源,这种模式节约tcp连接,提高了rabbit并发性。
注意:对消息的publish、consume、get、ack、nack、confirm、handleReturn 以及对exchange、binding、queue的申明等都是在某个channel实现的,即channel是AMQT应用层相关的概念
connection、channel、exchange、queue关联关系
4.1 publisher和consumer可以创建多个connection(TCP连接)
4.2 一个connection可以创建多个channel
4.3 channel上可以任意申明exchange、binding、queue。但是申明出来的exchange、binding、queue和channel并非这个channel的附属资源,而是消息服务器上的资源,可以被所有的connection和channel使用。简单说,channel1发送消息到queue1,如果channel2监听queue1,那么channel2会获取到消息。
应该由消费者还是生产者申明队列
建议同时由消费者和生产者声明队列,如果仅仅由消费者创建队列,如果生产者的发送的消息的路由不存在,发送时不会报错,但是这个消息就掉入黑洞了(永远消失了)。