RocketMq1 简介及应用场景

一、 为什么要使用消息中间件呢?

  • MessageQueue 是一个广泛应用在互联网项目中且非常重要的技术, MessageQueue 通常被用来解决在高并发压力下类似于流量削峰、服务解耦、消息通讯、最终消息一致性等这样的问题。
  • 在认识 MQ-[Message Queue 消息队列]消息中间件的之前,用户对 MQ 没有太直观的感受,MQ-[Message Queue 消息队列] 到底是个什么东西,我需要在项目中使用它吗?使用它不就增加的项目的复杂度吗?
  • 确实,以上问题确实存在,但是在互联网项目中,随着业务的拓展,项目往往面临着越来越高的并发访问,为了解决项目面临的一些问题,项目中不得不引入 MQ 消息中间件。
  • 虽然引入消息中间件不得不让系统处理诸如类似单点故障,数据一致性,接口幂等性等等复杂问题,但是引入 MQ 也是以较小的成本实现提高项目性能的方案之一。
  • 为了让所有人能直观的感受 MQ 消息中间件在应用项目开发中的重大作用,下面我们通过一个小小的实例来进一步详细说明 MQ 在实际的生产环境中到底有什么重大的作用呢?
  • 实例说明:微服务架构下-链式调用

1、链式调用

  • 链式调用是我们在写程序时候的一般流程,为了完成一个整体功能,会将其拆分成多个函数(或子模块),比如模块 A 调用模块 B,模块 B 调用模块 C,模块 C 调用模块 D。但在大型分布式应用中,系统间的 RPC 交互繁杂,一个功能背后要调用上百个接口并非不可能,那么如果有一个服务出现调用阻塞或者任务处理时间较长,都会造成任务阻塞,甚至服务雪崩的可怕后果。
  • 这些接口之间耦合比较严重,每新增一个下游功能,都要对上有的相关接口进行改造;举个例子:假如系统 A 要发送数据给系统 B 和 C,发送给每个系统的数据可能有差异,因此系统 A 对要发送给每个系统的数据进行了组装,然后逐一发送;当代码上线后,新增了一个需求:把数据也发送给 D。此时就需要修改 A 系统,让他感知到 D 的存在,同时把数据处理好给 D。在这个过程中你会看到,每接入一个下游系统,都要对 A 系统进行代码改造,开发联调的效率很低。
    RocketMq1 简介及应用场景_第1张图片
    由于链式调用:某一个服务出现阻塞,导致整个服务不可用(雪崩效应)
  • 产生原因:请求同步阻塞方式
  • 解决方案:异步解耦方式解决,如下图
    RocketMq1 简介及应用场景_第2张图片

2、木桶理论

  • 面对大流量并发时,容易被冲垮。每个接口模块的吞吐能力是有限的,这个上限能力如果堤坝,当大流量(洪水)来临时,容易被冲垮。
  • 存在性能问题。RPC 接口基本上是同步调用,整体的服务性能遵循“木桶理论”,即链路中最慢的那个接口。比如A 调用 B/C/D 都是 50ms,但此时 B 又调用了 E,花费2000ms,那么直接就拖累了整个服务性能。更有甚者拖垮整个系统。

RocketMq1 简介及应用场景_第3张图片

3、服务解耦

根据上述的几个问题,在设计系统时可以明确要达到的目标:

  • 1) 要做到系统解耦,当新的模块接进来时,可以做到代码改动最小;
  • 2) 设置流量缓冲池,可以让后端系统按照自身吞吐能力进行消费,不被冲垮;
  • 3)强弱依赖梳理,将非关键调用链路的操作异步化,提升整体系统的吞吐能力,比如上图中 A、B、C、D 是让用户发起付款,然后返回付款成功提示的几个关键流程,而 E 是通知付款后通知商家发货的模块,那么实质上用户对 E 完成的时间容忍度比较大(比如几秒之后),可以将其异步化。
  • 在现在的系统视线中,MQ 消息队列是普遍使用的,可以完美的解决这些问题的利器。下图是使用了 MQ 的简单架构图,可以看到 MQ 在最前端对流量进行蓄洪,下游的系统A\B\C 只与 MQ 打交道,通过事先定义好的消息格式来解析。
    RocketMq1 简介及应用场景_第4张图片

二、我们要使用那个消息中间呢?

1、主流的 MQ 产品

  • 1)ZeroMQ
  • 2)推特的 Distributedlog
  • 3)ActiveMQ:Apache 旗下的老牌消息引擎
  • 4)RabbitMQ、Kafka:AMQP 的默认实现。
  • 5)RocketMQ
  • 6)Artemis:Apache 的 ActiveMQ 下的子项目
  • 7)Apollo:同样为 Apache 的 ActiveMQ 的子项目的号称下一代消息引擎
  • 8)商业化的消息引擎 IronMQ
  • 9)实现了 JMS(Java Message Service)标准的 OpenMQ
    目前在互联网行业发展下,有多种消息中间件产品被开发出来,且开源

2、几种主要产品对比

特性 ActiveMQ RabbitMQ RocketMQ kafka
开发语言 java erlang java scala
单机吞吐量 万级 万级 10 万级 10 万级
时效性 ms 级 us 级 ms 级 ms 级以内
可用性 高(主从架构) 高(主从架构) 非常高(分布式架构) 非常高(分布式架构)
功能特性 成熟的产品,在很多公司得到应用;有较多的文档;各种协议支持较好 基于 erlang 开发,所以并发能力很强,性能极其好,延时很低;管理界面较丰富 MQ 功能比较完备,扩展性佳 只支持主要的MQ 功能,像一些消息查询,消息回溯等功能没有提供,毕竟是为大数据准备的,在大数据领域应用广。

3、谨慎使用消息中间件

项目引入 RocketMQ 消息中间件或其他的消息中间件产品是否会对整个项目带来风险
呢?

一个使用了 MQ 的项目,如果连这个问题都没有考虑过,就把 MQ 引进去了,那就给
自己的项目带来了巨大的风险。

我们引入一个技术,要对这个技术的弊端有充分的认识,才能做好预防。

那么使用 rocketmq 等消息中间件会给应用项目带来什么样的问题呢?答案有如下几点

  • 系统可用性降低:你想啊,本来其他系统只要运行好好的,那你的系统就是正常的。现在你非要加个消息队列进去,那消息队列挂了,你的系统不是呵呵了。因此,系统可用性降低
  • 系统复杂性增加:要多考虑很多方面的问题,比如一致性问题、如何保证消息不被重复消费,如何保证保证消息可靠传输。因此,需要考虑的东西更多,系统复杂性增大。
  • 既然有这些缺点,那么是不是不敢使用 MQ 了呢?答案很明显,不是,为了提高项目的能,构建松耦合、异步的结构,必须要使用 MQ.
  • 因此这个是一个矛盾的话题,其实也不矛盾,在一些初创型企业或者中小型公司,服务拆分架构没有太多,并发流量也不是很大,很显然没必要引入 mq. 但是在现在互联网的产品开发中,企业往往要求产品快速迭代,实现可持续交付,高扩展性,可持续部署的能力,因此项目架构往往采用 SOA,或微服务架构,那么在引入消息中间件也成为必然。

三、RocketMQ 应用场景

MQ 可应用在多个领域,包括异步通信解耦、企业解决方案、金融支付、电信、电子商务、快递物流、广告营销、社交、即时通信、手游、视频、物联网、车联网等。从应用功能上来讲。

1、异步处理

场景说明:用户注册后,需要发注册邮件和注册短信。传统的做法有两种:

  • 1)串行的方式

  • 2)并行方式

  • a、串行方式,将注册信息写入数据库成功后,发送注册邮件,再发送注册短信。以上
    三个任务全部完成后,返回给客户端。
    RocketMq1 简介及应用场景_第5张图片

  • b、并行方式,将注册信息写入数据库成功后,发送注册邮件的同时,发送注册短信。
    以上三个任务完成后,返回给客户端。与串行的差别是,并行的方式可以提高处理的时间
    RocketMq1 简介及应用场景_第6张图片
    假设三个业务节点每个使用 50 毫秒钟,不考虑网络等其他开销,则串行方式的时间是 150毫秒,并行的时间可能是 100 毫秒。 因为 CPU 在单位时间内处理的请求数是一定的,假设CPU1 秒内吞吐量是 100 次。则串行方式 1 秒内 CPU 可处理的请求量是 7 次(1000/150)。并行方式处理的请求量是 10 次(1000/100)

  • 小结:如以上案例描述,传统的方式系统的性能(并发量,吞吐量,响应时间)会有瓶颈。如何解决这个问题呢?
    引入消息队列,将不是必须的业务逻辑,异步处理。

RocketMq1 简介及应用场景_第7张图片

  • 按照以上约定,用户的响应时间相当于是注册信息写入数据库的时间,也就是 50 毫秒。注册邮件,发送短信写入消息队列后,直接返回,因此写入消息队列的速度很快,基本可以忽略,因此用户的响应时间可能是 50 毫秒。因此架构改变后,系统的吞吐量提高到每秒 20 QPS。比串行提高了 3 倍,比并行提高了两倍。

2、应用解耦

  • 场景说明:用户下单后,订单系统需要通知库存系统。传统的做法是,订单系统调用库存系统的接口
    RocketMq1 简介及应用场景_第8张图片
  • 传统模式的缺点:假如库存系统无法访问,则订单减库存将失败,从而导致订单失败,订单系统与库存系统耦合
    如何解决以上问题呢?引入应用消息队列后的方案。
    RocketMq1 简介及应用场景_第9张图片
  • 订单系统:用户下单后,订单系统完成持久化处理,将消息写入消息队列,返回用户订单下单成功 库存系统:订阅下单的消息,采用拉/推的方式,获取下单信息,库存系统根据下单信息,进行库存操作 假如:在下单时库存系统不能正常使用。也不影响正常下单,因为下单后,订单系统写入消息队列就不再关心其他的后续操作了。实现订单系统与库存系统的应用解耦。

3、流量削锋

流量削锋也是消息队列中的常用场景,一般在秒杀或团抢活动中使用广泛。 应用场景:秒杀活动,一般会因为流量过大,导致流量暴增,应用挂掉。为解决这个问题,一般需要在应用前端加入消息队列。

  • a、可以控制活动的人数
  • b、可以缓解短时间内高流量压垮应用

RocketMq1 简介及应用场景_第10张图片

  • 用户的请求,服务器接收后,首先写入消息队列。假如消息队列长度超过最大数量,则直接抛弃用户请求或跳转到错误页面。 秒杀业务根据消息队列中的请求信息,再做后续处理

4、日志处理

日志处理是指将消息队列用在日志处理中,比如 Kafka 的应用,解决大量日志传输的问题。

RocketMq1 简介及应用场景_第11张图片
日志采集客户端,负责日志数据采集,定时写受写入 消息队列,负责日志数据的接收,存储和转发 日志处理应用:订阅并消费 队列中的日志数据

5、消息通讯

消息通讯是指,消息队列一般都内置了高效的通信机制,因此也可以用在纯的消息通
讯。比如实现点对点消息队列,或者聊天室等 点对点通讯。
RocketMq1 简介及应用场景_第12张图片
客户端 A 和客户端 B 使用同一队列,进行消息通讯。
RocketMq1 简介及应用场景_第13张图片
客户端 A,客户端 B,客户端 N 订阅同一主题,进行消息发布和接收。实现类似聊天室效果。以上实际是消息队列的两种消息模式,点对点或发布订阅模式。模型为示意图,供参考。

6、事务消息

银行 A 银行 B 进行转账,使用 mq 消息中间件来保证不同的系统之间的数据一致性。
RocketMq1 简介及应用场景_第14张图片

你可能感兴趣的:(#,RocketMq,java,spring,微服务,mq)