HelloCoder HelloCoder
首页
《Java小白求职之路》
《小白学Java》
计算机毕设
  • 一些免费计算机资源
  • 脚手架工具
  • 《从0到1学习Java多线程》
  • 《从0到1搭建服务器》
随笔
关于作者
首页
《Java小白求职之路》
《小白学Java》
计算机毕设
  • 一些免费计算机资源
  • 脚手架工具
  • 《从0到1学习Java多线程》
  • 《从0到1搭建服务器》
随笔
关于作者
  • 《PureJavaCoderRoad》

    • 导读

    • Java基础

    • Java进阶

    • Java高阶

    • 开发辅助工具

    • 计算机网络

    • 数据库

    • JavaEE

    • 中间件

      • MQ

        • Kafka的入门
        • RocketMQ的入门
        • 消息队列入门
      • Nginx

      • Redis

    • 架构

    • 建议

  • PureJavaCoderRoad
  • 中间件
  • MQ
码农阿雨
2022-05-26
目录
1、消息中间件是什么?
1.1、ActiveMQ
1.2、RabbitMQ
1.3、 RocketMQ
1.4、KafKa
2、消息中间件有什么用
2.1、解耦
2.2、削峰
2.3、顺序消息
2.4、分布式事务消息
3、消息队列通信的模式
3.1、点对点模式
3.2、发布订阅模式

消息队列入门

最近部门架构要升级消息队列,原有的MetaQ要换成RocketMQ。

说来可笑,写了这么久代码,我从来没接触过MQ这一块,借此机会记录一下学习MQ的过程。

既然要学习,那必须要知道以下这几个问题:

  • 是什么
  • 有什么用
  • 怎么用

# 1、消息中间件是什么?

消息队列(Message Queue,简称 MQ)。是基于队列与消息传递技术,在网络环境中为应用系统提供同步或异步、可靠的消息传输的支撑性软件系统。

中间件的意思就是相当于一个中介,实际上就是生产者要给消费者发送消息,但是不是直接通知,而是借住消息中间件去通知。

消息中间件具有低耦合、可靠投递、广播、流量控制、最终一致性等一系列功能,也成为异步RPC的主要手段之一。

目前市面上优秀的消息中间件有很多,比如:

  • ActiveMQ
  • RabbitMQ
  • RocketMQ
  • Kafka

# 1.1、ActiveMQ

ActiveMQ 是由 Apache 出品的一款开源消息中间件,基于JMS,旨在为应用程序提供高效、可扩展、稳定、安全的企业级消息通信。

JMS即Java消息服务(Java Message Service)应用程序接口,是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。

它的设计目标是提供标准的、面向消息的、多语言的应用集成消息通信中间件。所以ActiveMQ支持多种语言的客户端和协议。

# 1.2、RabbitMQ

由 Erlang 语言开发的基于 AMQP 协议的消息队列。轻量级,快速,部署使用方便,带有可视化的后台管理界面。

AMQP :Advanced Message Queue,高级消息队列协议。它是应用层协议的一个开放标准,为面向消息的中间件设计,基于此协议的客户端与消息中间件可传递消息,并不受产品、开发语言等条件的限制。

ActiveMQ和RabbitMQ都是老牌的消息中间件。

优点:可以保证数据不丢失,也能保证高可用性。支持高级功能,如死信队列、消息重试等。

缺点:吞吐量比较低,一般就是每秒几万的级别,而且消息堆积量太高就会影响整体性能。erlang语言编写,很难扩展。

# 1.3、 RocketMQ

RocketMQ 是阿里巴巴一个开源的消息队列,使用 Java 实现。前身是MetaQ,后来随着业务的激增,借鉴了 Kafka 的设计并做了很多改进,于是就出现了RocketMQ,现阿里已经将RocketMQ 捐赠给Apache基金会,意味着它将开源和有活跃的社区维护。

天生为金融互联网领域而生,对于可靠性要求很高的场景,尤其是电商里面的订单扣款,以及业务削峰,在大量交易涌入时,后端可能无法及时处理的情况。

优点:几乎同时解决了kafka和RabbitMQ的缺陷吞吐量高,单机可以达到10WQPS,高可用,性能高,也支持延迟消息、事务消息、消息回溯、死信队列等。消息积压也可以很多。

缺点:官方文档比较简单,社区活跃度没有RabbitMQ高。云上版本比开源版本强,所以要用好,基 本上都需要定制。

# 1.4、KafKa

Kafka是Scala和Java开发的,对批处理和异步处理做了大量的设计,因此Kafka可以得到非常高的性能,尤其是大数据和云计算领域。

它的异步消息的发送和接收是三个中最好的,但是跟RocketMQ拉不开数量级,每秒处理几十万的消息。如果是异步消息,并且开启了压缩,Kafka最终可以达到每秒处理2000w消息的级别。

Kafka需要配合zookeeper进行元数据管理。

优点:吞吐量大,在常规机器配置下,单机可以达到几十万的QPS,非常强悍。性能高,基本发消息都是毫秒级。可用性高,支持集群,部分机器可以宕机。

缺点:丢数据,kafka收到消息后会写入一个磁盘缓冲区,并没有直接落地到硬盘,所以要是机器本身故障了,可能会导致磁盘缓冲区里的数据丢失;功能比较单一; 一般适用于日志分析场景;kafkaStrem流式计算。

⏬

以上总结就是:

RabbitMQ:轻量级、性能较好,功能完备,适合中小公司。

RocketMQ:为金融而生,消息可靠性强,易维护。

KafKa:为大数据而生,适合大数据收集、日志收集业务,高吞吐。

# 2、消息中间件有什么用

阿里的RocketMQ开发文档有写到MQ的用法,我借用它们的场景应用和图片,来介绍一下MQ的作用。

# 2.1、解耦

  • 未解耦前,有一天大佬叫我接入A系统,然后我就在代码里面调用了A,接下来大佬又叫我接入B、C系统,我又改了代码;忽然有一天,大佬说A系统不需要接入了,我又改了代码把它注释。

    //    不需要调用A系统了,注释
    //    service.informA(message);
        service.informB(message);
        service.informC(message);
    

    如此反复,实在麻烦。

使用MQ,我就可以把消息交给mq去处理了,不用每次都要改我的代码了。

如果是在淘宝这种核心交易系统,每笔交易订单数据的产生会引起几百个下游业务系统的关注,包括物流、购物车、积分、阿里妈妈、流计算分析等等,整体业务系统庞大而且复杂,架构设计稍有不合理,将直接影响主站业务的连续性;

通过 MQ 的异步化设计,即便下游子系统(如物流、积分等)出现不可用甚至宕机,都不会影响到核心交易系统的正常运转;而且通过 MQ 的异步化设计,也能随时接入新的系统,适应业务的变化。

# 2.2、削峰

诸如秒杀、抢红包、企业开门红等大型活动时皆会带来较高的流量脉冲,或因没做相应的保护而导致系统超负荷甚至崩溃,或因限制太过导致请求大量失败而影响用户体验,削峰填谷是解决该问题的最佳方式;

通过 MQ 超高性能的消息处理能力可以承接流量脉冲而不被击垮,在确保系统可用性同时,因快速有效的请求响应而提升用户的体验。

可以把请求丢到MQ、服务器处理完了再去取请求。

# 2.3、顺序消息

比如证券交易过程时间优先原则,交易系统中的订单创建、支付、退款等流程,航班中的旅客登机消息处理等等。与FIFO原理类似,MQ提供的顺序消息即保证消息的先进先出;

# 2.4、分布式事务消息

阿里巴巴的交易系统、支付红包等场景需要确保数据的最终一致性,大量引入 MQ 的分布式事务,既可以实现系统之间的解耦,又可以保证最终的数据一致性;

# 3、消息队列通信的模式

# 3.1、点对点模式

这个模型的特点是发送到队列的消息被一个且只有一个消费者进行处理。

生产者将消息放入消息队列后,由消费者主动的去拉取消息进行消费。

但是消息队列是否有消息需要消费,在消费者端无法感知,所以在消费者端需要额外的线程去监控。

# 3.2、发布订阅模式

发布订阅模式是一个基于消息送的消息传送模型,改模型可以有多种不同的订阅者。生产者将消息放入消息队列后,队列会将消息推送给订阅过该类消息的消费者(类似微信公众号)。

由于是消费者被动接收推送,所以无需感知消息队列是否有待消费的消息!但是consumer1、consumer2、consumer3由于机器性能不一样,所以处理消息的能力也会不一样,但消息队列却无法感知消费者消费的速度!所以推送的速度成了发布订阅模模式的一个问题!假设三个消费者处理速度分别是8M/s、5M/s、2M/s,如果队列推送的速度为5M/s,则consumer3无法承受!如果队列推送的速度为2M/s,则consumer1、consumer2会出现资源的极大浪费!


参考:

  • https://www.jianshu.com/p/2838890f3284

  • 这四种消息队列的使用可以参考一下这位大佬的博客:https://www.jianshu.com/p/79ca08116d57

  • 阿里云官方的RocketMQ介绍视频,建议0.5倍速看::https://aliware-images.oss-cn-hangzhou.aliyuncs.com/mq/%E6%B6%88%E6%81%AF%E9%98%9F%E5%88%97RocketMQ%E7%89%88%E7%AE%80%E4%BB%8B.mp4

阅读全文
×

(为防止恶意爬虫)
扫码或搜索:HelloCoder
发送:290992
即可永久解锁本站全部文章

解锁
上次更新: 2025-02-21 06:04:57
最近更新
01
《LeetCode 101》
02-21
02
IDEA、Golang、Pycharm破解安装
02-21
03
《LeetCode CookBook》
02-21
更多文章>
Theme by Vdoing | Copyright © 2020-2025 码农阿雨
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式