1. Connection: 就是一个TCP的链接。Producer和Consumer都是经过TCP链接到RabbitMQ Server的。tcp
2.信道(channel):性能
why?为何须要信道, 而不是使用tcp链接到mq?spa
全部线程只使用一条TCP链接以知足性能上的需求. 线程启动后, 会在当前的链接上建立一条信道, 也就得到了Rabbitmq上的私密通讯路径, 而不会给操做系统的TCP栈形成额外的负担.操作系统
因此说, channel是创建在上述的TCP链接中。数据流动都是在Channel中进行的。线程
TCP链接就像是光缆, 而信道就像一条条独立的光纤束.3d
TCP链接就像是光缆, 而信道就像一条条独立的光纤束.blog
3.消息路由(AMQP的消息路由有三部分组成:交换器[exchange],绑定[binding],队列[queue])队列
消息发送到交换器, 经过必定的路由规则发送到对应的queue中, 后由监听的consumer消费路由
4.交换器字符串
共有四种类型:direct,topic,fanout,headers.
A.derect类型:basic_publish($msg,"exchange_name","queue_name");第一个参数是消息内容,第二个参数是交换器,第三个是路由键,就是你申明的queue的名称.交换器若是参数为空, 则会选择空白字符串名称的默认交换器.
B.fanout类型:当你发送一条msg到fanout类型的交换器上, 它会把消息投递到附加在此交换器上的全部队列.
C.topic模式:任何发送到Topic Exchange的消息都会被转发到全部关联RouteKey中指定“topic”的队列上上
这种模式下须要RouteKey,客户端要提早绑定Exchange与Queue。
若是Exchange没有发现可以与RouteKey匹配的Queue,则会抛弃此消息。
客户端在进行绑定时,要提供一个该队列“感兴趣”的主题,如“#.log.#”表示该队列关心全部涉及log的消息(一个RouteKey为”MQ.log.error”的消息会被转发到该队列)。
“#”表示0个或若干个关键字,“”表示一个关键字。如“log.”能与“log.warn”匹配,没法与“log.warn.timeout”匹配;可是“log.#”能与上述二者匹配。