消息队列之RabbitMQ(一) 介绍、核心概念、交换器类型


消息队列之RabbitMQ(一) 介绍、核心概念、交换器类型

背景

博主在介绍 RabbitMQ 之前有必要说说消息队列是什么?

消息是指在应用间传送的数据。消息可以非常简单,比如只包含文本字符串,也可以很复杂,可能包含嵌入对象。

消息队列是一种应用间的通信方式,消息发送后可以立即返回,由消息系统来确保消息的可靠传递。消息发布者(生产者)只管把消息发布到MQ中而不用管谁来取,消息使用者(消费者)只管从MQ中取消息而不管消息是谁发布的。这样发布者和使用者都不用知道对方的存在,这样就形成了应用间的解耦。

目前主流的消息队列是 RabbitMQKafka 。当然 Redis也能当做轻量级的消息队列。

消息队列典型的应用场景

  • 异步处理: 把消息放入消息中间件中,等到需要的时候再去使用。
  • 流量削峰: 例如秒杀活动,在短时间内访问量急剧增加,使用消息队列,当消息队列满了后就拒绝响应,这样就使得系统达到一定并发后不会因为超负载而崩溃。
  • 日志处理: 在分布式系统中,每个节点应用都会产生日志,一旦集群规模庞大。日志系统也将面临大并发的尴尬局面。因此可以在日志收集后推送到队列里,再由日志系统去消费存储。
  • 应用解耦: 假设某个服务A需要给许多个服务(B,C,D)发送消息,当服务B不需要发送消息了,服务A需要修改代码重新部署,新加入一个服务E需要服务A的消息时,也需要修改代码重新部署。这样对于整个系统而言,他的拓展性是十分不足的,但是使用MQ发布订阅模式后,服务A作为生产者,而其他的应用只需作为消费者去消费队列里的消息,这样就会使得应用之间解耦。大大的提高了系统的拓展性。

RabbitMQ

RabbitMQ 是一个开源的消息代理的队列服务器,用来通过普通协议在完全不同的应用之间共享数据。
RabbitMQ 是使用Erlang语言来编写,并且 RabbitMQ 是基于AMQP协议。Erlang于洋在数据交互方面性能优秀,有着和原生Socket一样的延迟,这也是 RabbitMQ 高性能的原因所在。

AMQP协议

AMQP协议是具有现代特征的二进制协议。是一个提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。

常用交换器

交换器,接受消息,按照路由规则将消息路由到一个或者多个队列。如果路由不到,或者返回给生产者,或者直接丢弃。

RabbitMQ 常用的交换器类型由direct、topic、fanout、headers四种。

  1. Direct交换器:该类型的交换器将所有发送到该交换器的消息被转发到RoutingKey指定的队列中,也就是路由到BindKey和RoutingKey完全匹配的队列中

  2. Topic交换器:该类型的交换器将所有发送到Topic Exchange的消息被转发到所有RoutingKey指定的Topic队列上面。交换器会将Routingkey和某Topic进行模糊匹配,其中""用来匹配一个词,"#"用于匹配一个或者多个词。例如"com.#""能匹配到"com.rabbitmq.oa""com.rabbitmq""login."只能匹配到"com.rabbitmq"

  3. Fanout交换器: 该类型不处理RoutingKey,会把所有发送到交换器的消息路由到所有绑定的队列中。优点是转发消息最快,性能最好。

  4. Headers交换器: 该类型交换器不依赖路由规则来路由消息,而是根据消息内容中的headers属性进行匹配。headers类型交换器性能差,在实际中并不常用。

结束语

上面是博主总结的RabbitMQ的基本原理和需要掌握的基础知识,后面将会介绍如何安装以及使用入门。

参考资料:RabbitMQ(一):RabbitMQ快速入门


文章作者: 我若为侠
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 我若为侠 !
 上一篇
MySQL中联合查询的一些优化感悟 MySQL中联合查询的一些优化感悟
MySQL中联合查询的一些优化感悟背景今天博主在left join的SQL语句优化中发现了一个奇怪的现象,随后在网上查阅了相关资料,现在复盘并记录下来。 描述现在有 data_users 以及 data_posts 两张表。 data_us
下一篇 
Docker学习笔记(一)-什么是Docker? Docker学习笔记(一)-什么是Docker?
docker简介docker是什么? Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源。 Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Li
  目录