文章目录
概念
生产者(producer)与消费者(consumer)
生产者创建消息,发布到broke(rabbitmq服务器),消息包含payload(翻译是有效载荷)和lable(标签)。有效载荷其实就是传输的数据,而标签是描述这条消息的。比如含有交换器名称。生成者如何投递消息到broke呢?其实是建立了一个TCP连接。然后创建一个AMQP信道,每个信道都有一个唯一id,通过信道复用TCP连接,类似NIO,信道传输数据到broke,AMQP的命令也是通过信道进行发送。这里可能有人会问,为什么这么麻烦,不直接通过TCP连接传输呢?其实是因为TCP的连接与销毁开销相对太大。还有就是操作系统对于连接数也是有限制的。
消费者用来消费消息,他跟生产者一样通过信道进行交互。消费者可以通过订阅(推模式)或者拉模式获取消息,这个后面会细讲的。
队列(queue)
用来存储消息的,生产者最终投递消息到队列。消费者从队列获取数据。当多个消费者订阅同一个队列,并不是所有的消息都被每一个消费者消费,而是通过轮询只会被消费一次。
交换器(exchange)
生成者并不会把数据直接投递到queue,而是先投递到交换器,然后交换器与队列通过相应的路由规则进行绑定,把消息存放到queue,等待消费。下一篇会详细介绍路由规则以及代码实现。交换器存在有什么意义呢?如果没有交换器则发生一个消息只能发送到一个队里。被订阅到的其中的一个消费者消费,则不能多个消费者消费。并且交换器和路由规则相对队列更加的灵活。
路由键(Routing key)与绑定键(Binding key)
当生产者投递消息的时候会指定路由键,当交换器与队列绑定时会通过绑定键与路由规则匹配路由键,匹配则把消息传到队列中,不匹配可以消息不处理和返回给生产者。
AMQP协议
介绍
AMQP协议的开发其实是与RabbiMQ开发是在同一时间的,当时是RabbitMQ的作者Alexis找到AMQP创始人John O’hara,然后通过AMQP协议进行的实践。前人种树,后人乘凉,在学习技术的同时,我们也应感谢那些开发人员。RabbitMQ就是通过erlang实现AMQP协议的产物。目前支持的是AMQP 0-9-1。可以到RabbitMQ协议参考去了解。
生产者发布过程
消费者消费过程
这个只是推模式消费,还有拉模式和消息拒绝等等,大体相似,可以自行研究。
AMQP协议还有很多命令,比如交换器的声明,解绑,删除等,队列相关的以及事务的,大家可以自己去官网看。
后话
学习了RabbitMQ以及AMQP协议的一些流程,为后面代码实现打下了基础。