工作中常用得消息中间件基本有rocetmq(阿里系),activtiMq(性能似乎相比较差),rabbitMq,kafka(主要事面向大数据,高吞吐量方面)
1.概念:
RabbitMQ是由Erlang语言开发的开源消息队列系统,基于AMQP协议来实现。AMQP的主要特征是面向消息、队列、路由(包括点对点和发布/订阅)、可靠性、安全。AMQP协议更多用在企业系统内,对数据一致性、稳定性和可靠性要求很高的场景,对性能和吞吐量的要求还在其次.
在rabbitMq中,队列是一个无限制得缓冲区,你可以存储很多信息,前提是你的机器拥有足够得存储空间.
2.为何使用队列:
消息队列主要用于解决程序之间得通信问题,在分布式系统中,当应用达到一个量级得时候,应用之间得通信问题就显得尤为重要,
而消息队列恰恰为我们解决了这一问题;
通过运用消息队列,主要可以解决:
1.同步变异步
2.解耦和
3.流量削峰
没有使用消息队列:
使用消息队列:
3.主要组成部分:
1.provide 生产者:
发送消息得程序
2.consumer消费者:
接受消息得程序
4. 原理图:
1.Message: 消息,消息是不具名得,它由消息头和消息体组成,消息体是不透明得,消息头由一系列属性构成,包括 routing-key(路由键)、priority(相对于其他消息的优先 权)、delivery-mode(指出消息可能持久性存储)等。
2.publisher: 消息发送方
3.consumenr:消息接收方
4.Exchange:交换器, 用来接收生产者发送的消息并将这些消息路由给服务器中的队列。 三种常用的交换器类型
1. direct(发布与订阅 完全匹配) 2. fanout(广播) 3. topic(主题,规则匹配)
5.Binding: 绑定 : 用于消息队列和交换器之间的关联。一个绑定就是基于路由键将交换器和消息 队列连接起来的路由规则,所以 可以将交换器理解成一个由绑定构成的路由表。
6.Queue : 消息队列。用来保存消息直到发送给消费者。它是消息的容器,也是消息的终点。一 个消息可投入一个或多个队列。消息一直在队列里面,等待消费者链接到这个队列将其取走.
7.Rounting_key: 路由键,RabbitMQ 决定消息该投递到哪个队列的规则。 队列通过路由键绑定到交换器。 消息发送到 MQ 服务器时,消息将拥有一个路由键,即便是空的,RabbitMQ 也会将其 和绑定使用的路由键进行匹配。 如果相匹配,消息将会投递到该队列。 如果不匹配,消息将会进入黑洞。
8.链接。指 rabbit 服务器和服务建立的 TCP 链接。
9.Channel : 信道。Channel 中文叫做信道,是 TCP 里面的虚拟链接。例如:电缆相当于 TCP,信道是 一个独立光纤束,一条 TCP 连接上创建多条信道是没有问题的。 2,TCP 一旦打开,就会创建 AMQP 信道。 3,无论是发布消息、接收消息、订阅队列,这些动作都是通过信道完成的,信道相对于直接使用tcp传输信息,效率更高.
10.Virtual host: 虚拟主机, 表示一批交换器,消息队列和相关对象。虚拟主机是共享相同的身份认证 和加密环境的独立服务器域。每个 vhost 本质上就是一个 mini 版的 RabbitMQ 服务器,拥有 自己的队列、交换器、绑定和权限机制。vhost 是 AMQP 概念的基础,必须在链接时指定, RabbitMQ 默认的 vhost 是/,一个用户就是一个virtual host
11.Borker:表示消息队列服务器实体。
5.交换器和消息对列得关系:
交换器是通过路由键和队列绑定在一起的,如果消息拥有的路由键跟队列和交换器的 路由键匹配,那么消息就会被路由到该绑定的队列中。 也就是说,消息到队列的过程中,消息首先会经过交换器,接下来交换器在通过路由 键匹配分发消息到具体的队列中。 路由键可以理解为匹配的规则。
6.为何使用信道传输数据而不是TCP:
1. TCP 的创建和销毁开销特别大。创建需要 3 次握手,销毁需要 4 次分手。
2. 如果不用信道,那应用程序就会以 TCP 链接 Rabbit,高峰时每秒成千上万条链接 会造成资源巨大的浪费,而且操作系统每秒处理 TCP 链接数也是有限制的,必定造成性能 瓶颈。
3. 信道的原理是一条线程一条通道,多条线程多条通道同用一条 TCP 链接。一条 TCP 链接可以容纳无限的信道,即使每秒成千上万的请求也不会成为性能的瓶颈。
7.三种交换器工作模式讲解:
1.direct模式:
发布/订阅,完全匹配模式. 消息携带着 交换器exchange和路由键rounting_key 发送到MQ服务器, mq服务器通过消息头携带得消息从该交换器中通过路由键获取消息接受得队列,将消息发送给该队列.
2.topic模式:
主题,规则匹配, topic模式与direct模式相差不大,direct主要是完全匹配,而topic则是部分匹配,这里得匹配是针对于路由键.
ex: 消费端创建了队列,queue_log_*
消息头中配置得路由键可以为queue_log_info,queue_log_error,queue_log_debug,,只匹配路由键头部分,后面不管.那么三个消息都可以接收到
3.fanout模式:
广播模式,广播下,发送端和消费端只需要配置exhcange就可以,不需要再配置 队列名称和路由键名称
8.消息确认ACK机制
默认开启
1.什么是消息确认ACK机制:
如果再处理消息过程中,消费者服务器在处理消息时出现异常,那可能这条正在处理得消息就没有完成信息消费,数据就会丢失.
为了确保数据不会丢失,rabbitmq 支持消息确认-ACK机制
2. 如果MQ服务收到消费端得确认, 则会从队列中删除这条消息,反之,则不会删除,集群情况下会推送给在线得其他消费者.这种机制保证了在消费服务异常时候不会丢失任何消息.
注意:如果忘记了ACK,后果则会很严重,消息会一直分发,导致rabbitmq占用内存越来越多(提一句,rabbitmq也是可以存储到硬盘得,似乎好像) ,长时间下来,这个"内存泄漏"是很严重得
解决:消费方开始重试,并设置重试次数.
欢迎指正错误,下篇讲解rabbitmq如何整合spring boot