logo头像
Snippet 博客主题

RabbitMQ概述

本文于515天之前发表,文中内容可能已经过时

之所以今天写RabbitMQ学习专栏,主要是因为自己没有真正的系统学习过。之前工作经历中都是为用MQ而用的MQ,对MQ整个内部机制没有一个深入的了解和系统的学习。比如我们用Spring Cloud Stream或Spring Cloud Bus组件时候,我们会经常碰到MQ。MQ产品市面上有很多种,不同MQ产品有不同的适应场景(领域)。这就和学什么语言一样,不分什么好坏。

在这我要插上一句,在讨论技术选型的时候,我经常听到很多人说哪种技术好,哪种技术坏,哪种技术流行,哪种技术淘汰。其实正解应该是每种技术方案有自己适应领域,存在即合理。面试的时候经常有面试官询问技术方案选型。什么Spring Cloud和Dubbo比(压根就不是一个领域,Spring Cloud是整套的微服务落地方案,Dubbo只是一个具有客户端负载均衡的高性能RPC框架,论功能Dubbo只是Spring Cloud的一个子集),什么Redis和MongoDB比,ES和Solr比,各种MQ的比较,其实我觉得问这些面试题是有局限性的,没有具体业务场景就是无解,具体选型还是要根据当前公司的现有业务和系统现状来选型。我觉得面试官应该先把公司的业务场景说出来,然后应聘者根据公司的业务进行客观性评定。

好了,言归正传,常见的高级的MQ产品有RabbitMQ、Apache ActiveMQ、Apache RocketMQ(Alibaba捐赠)、Apache Kafka(LinkedIn捐赠) 。那么,今天我这里选择RabbitMQ进行学习,其他MQ学习都是相通的,读者可根据自身情况阅读官网文档并进行学习。我这里只是介绍一种学习方式。下面从官方文档以及其他资料给大家进行梳理RabbitMQ系列的知识。

MQ消息队列

MQ概述

消息队列技术是分布式应用间交换信息的一种技术。

消息队列可驻留在内存或磁盘上,队列存储消息直到它们被应用程序读走。

通过消息队列,应用程序可独立地执行。它们不需要知道彼此的位置、或在继续执行前不需要等待接收程序接收此消息。

MQ主要作用是接受和转发消息。你可以想想在生活中的一种场景:当你把信件的投进邮筒,邮递员肯定最终会将信件送给收件人。我们可以把MQ比作 邮局和邮递员。

MQ和邮局的主要区别是,它不处理消息,但是,它会接受数据、存储消息数据、转发消息。

MQ应用场景

  • 应用解耦: 系统异步化改造;

    1. 用户注册后的邮件发送、验证码短信发送;
    2. 分布式延时队列应用,用户下单后,24小时未支付,需要取消订单,我们只需要下单时用MQ发个消息通知一下,客户端延时(下单时间24小时后)执行,消费成功则证明取消订单成功。
  • 异步通知及数据同步: 提升系统性能,保证数据最终一致性;

    1. 用户在管理页面更新数据,通过MQ异步通知,更新缓存、更新ES或Solr索引
  • 应用限流: 可以保证并发场景下系统的稳定性;

    1. 抢票系统,在并发大系统有瓶颈的情况下,可以将请求打到MQ队列依次限流消费。
    2. 分布式日志系统数据很大的时候,MQ作为分布式日志的缓冲层,典型应用就是ELK+Kafaka。
  • 数据分发: 一对多或广播的模式进行数据分发;

    1. 支付完成后,需要及时的通知子系统(进销存系统发货,用户服务积分,发送短信)
  • 分布式事务: 分布式架构的系统可以通过MQ的队列数据进行数据回滚操作

RabbitMQ产品介绍

RabbitMQ产品

打开RabbitMQ官网首页,能看到如下的一句话:

RabbitMQ is the most widely deployed open source message broker.

翻译为:RabbitMQ是部署最广泛的开源消息代理。

RabbitMQ是一个Erlang开发的AMQP(Advanced Message Queuing Protocol )的开源实现。AMQP 的出现其实也是应了广大人民群众的需求,虽然在同步消息通讯的世界里有很多公开标准(如 Cobar)的 IIOP ,或者是 SOAP 等),但是在异步消息处理中却不是这样,只有大企业有一些商业实现(如微软的 MSMQ ,IBM 的 WebSphere MQ 等),因此,在 2006 年的 6 月,Cisco 、Red Hat、iMatix 等联合制定了 AMQP 的公开标准。

RabbitMQ由RabbitMQ Technologies Ltd开发并且提供商业支持的。该公司在2010年4月被SpringSource(VMware的一个部门)收购。在2013年5月被并入Pivotal。其实VMware,Pivotal和EMC本质上是一家的。不同的是,VMware是独立上市子公司,而Pivotal是整合了EMC的某些资源,现在并没有上市。

RabbitMQ产品特性

  • 开源免费;
  • 可伸缩性:集群服务;
  • 消息持久化:从内存持久化消息到硬盘,再从硬盘加载到内存;
  • 多语言多客户端支持,支持Python、Java、Ruby、PHP、C#、JavaScript、Go、Elixir、Objective-C、Swift、Spring AMQP。

RabbitMQ常用模式

打开官方文档,我们眼前一亮,会看到如下6种RabbitMQ的工作模式:

1. “Hello World!”
The simplest thing that does something img Java Spring AMQP
2. Work queues
Distributing tasks among workers (the competing consumers pattern)img Java Spring AMQP
3. Publish/Subscribe
Sending messages to many consumers at onceimg Java Spring AMQP
4. Routing
Receiving messages selectivelyimg Java Spring AMQP
5. Topics
The simplest thing that does something img Java Spring AMQP
6. RPC
Request/reply patternexampleimg Java Spring AMQP

看到上述的6种工作模式,其中我们日常使用最多的是前5种模式,我们列一个学习列表:

  • 简单模式: 一个生产者,一个消费者
  • Work模式: 一个生产者,多个消费者,每个消费者获取到的消息唯一。
  • 订阅模式: 一个生产者发送的消息会被多个消费者获取。
  • 路由模式: 发送消息到交换机并且要指定路由key ,消费者将队列绑定到交换机时需要指定路由key
  • Topic模式: 将路由键和某模式进行匹配,此时队列需要绑定在一个模式上,“#”匹配一个词或多个词,“*”只匹配一个词。
  • RPC远程调用:几乎不用,暂时先不考虑

参考资料

支付宝打赏 微信打赏

请作者喝杯咖啡吧