原文链接
一、什么是AMQP协议?
AMQP全称:Advanced Message Queuing Protocol(高级消息队列协议)。是应用层协议的一个开发标准,为面向消息的中间件设计。
基于此协议的客户端与消息中间件可以传递消息,不受客户端/中间件的不同产品、不同开发语言等限制。底层是由Erlang(爱冷)语言开发的,典型的支持者有RabbitMQ、ActiveMQ。
二、AMQP生产者流转过程
1、生产者和Broker(节点)建立连接,遵循某种协议;
生产者将ip、端口、用户名、密码等信息打包在Protocol Header(协议头)中,向Broker(节点)发起连接请求,两者建立连接
2、开启信道(channel)
3、发送消息
4、释放资源
面试题:RibbitMQ为什么基于channel(信道)处理消息,而不是基于连接处理消息呢?
一个应用有多个线程需要从rabbitmq中消费,或是生产消息,那么必然会建立很多个connection ,也就是多个tcp连接,对操作系统而言,建立和销毁tcp连接是很昂贵的开销,如果遇到使用高峰,性能瓶颈也随之显现,rabbitmq采用类似nio的做法,连接tcp连接复用,不仅可以减少性能开销,同时也便于管理。
每个线程都把持一个信道,所以信道复用了TCP连接。
一个connection(连接)中,有多个channel(信道)
三、AMQP消费者流转过程
1、与生产者类似,建立连接
2、开启channel信道
3、接收消息
4、消息推送
5、发送确认
消费者确认分两种:自动确认、手动确认
参考连接
这里有一个“可靠消费”的问题:
自动消费:当Broker往消费者发送消息时,使用“即发即完”方式的话,当消费者还未收到消息,TCP连接已经断掉,这样消费者没有收到消息,而在Broker节点(也就是RibbitMQ服务器)认为消费者已经消费了;这被认为是不安全的
手动消费:(Basic Ack)开启手动回复Ack,服务器等消费者回复确认消费是否成功
6、释放资源
RabbitMQ的核心组成部分
RabbitMQ的核心组成部分