【Go】RabbitMQ消息队列

作者:wallace-lai
发布:2023-07-25
更新:2023-07-25

消息队列基本概念

MQ的优势和劣势

优势:
(1)应用解耦
(2)异步提速
(3)削峰填谷

劣势:
(1)系统可用性降低
MQ本身宕机会造成系统不可用,因此整个系统可用性会降低

(2)系统复杂度提高
如何保证消息没有被重复消费?如何处理消息丢失?如何保证消息顺序性?私以为这些复杂性问题应该是MQ本身应该处理好的,而不能将问题抛出提升整个系统的复杂性

(3)一致性问题
这属于分布式系统中老生常谈的问题了

使用RabbitMQ

RabbitMQ简介

AMQP,即Advanced Message Queuing Protocol(高级消息队列协议),是一个应用层的网络协议的开放标准,专为消息中间件设计。基于此协议的客户端与消息中间件可传递消息,并不受客户端/中间件不同产品,不同开发语言的限制。

AMQP协议中规定的几类角色如上图所示。

(1)Publisher:消息生产者

(2)Exchange:消息交换机,交换机通过路由(Routers)将消息发送给对应的队列(Queue)

(3)Queue:存储消息的队列

(4)Consumer:消息消费者

2007年,Rabbit技术公司基于AMQP标准开发的RabbitMQ 1.0发布。RabbitMQ采用Erlang语言开发。Erlang是一种专门为高并发和分布式系统设计的语言,在电信领域使用广泛。

RabbitMQ中的概念

(1)Broker:接收和分发消息的应用,RabbitMQ Server就是Message Broker

(2)Virtual host:出于多租户和安全因素设计,把AMQP的基本组件划分到一个虚拟的分组中,类似网络中的namespace概念。当多个不同用户使用同一个RabbitMQ Server提供的服务时,可以划分出多个vhost,每个用户在自己的vhost创建exchange和queue等

(3)Connection:Publisher / Consumer和broker之间的TCP连接

(4)Channel:Channel是在Connection内部建立的逻辑连接,如果应用程序支持多线程,通常每个thread创建单独的channel进行通讯,AMQP method包含了channel id帮助客户端和message broker识别channel,所以channel之间是完全隔离的。channel作为轻量级的connection极大减少了操作系统建立TCP connection的开销

(5)Exchange:message到达broker的第一站,根据分发规则,匹配查询表中的routing key,分发消息到queue中去。场景的类型有:direct(点对点)、topic(发布订阅)、fanout(广播)

(6)Queue:消息最终被送到这里等待consumer取走

(7)Binding:exchange和queue之间的虚拟连接,binding中可以包含routine key。binding信息被保存到exchange的查询表中,用于message的分发依据

RabbitMQ简介

RabbitMQ提供了6中工作模式:

(1)简单模式

(2)work queues

(3)publish/subscribe

(4)routing

(5)Topics

(6)RPC