说说MQ在你项目中的应用(一)

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
日志服务 SLS,月写入数据量 50GB 1个月
简介: 本文总结了消息队列(MQ)在项目中的应用,主要围绕异步处理、系统解耦和流量削峰三大功能展开。通过分析短信通知和业务日志两个典型场景,介绍了MQ的实现方式及其优势。短信通知中,MQ用于异步发送短信并处理状态更新;业务日志中,Kafka作为高吞吐量的消息系统,负责收集和传输系统及用户行为日志,确保数据的可靠性和高效处理。MQ不仅提高了系统的灵活性和响应速度,还提供了重试机制和状态追踪等功能,保障了业务的稳定运行。

看了不少关于MQ的文章,也对MQ的作用做了一些总结。通常来说MQ有三大功能:异步处理、系统解耦和流量削峰。但我觉得这些功能本质上都是围绕着异步这个核心来的,只是针对不同的业务场景做了些调整。

现在市面上常用的MQ中间件,如RabbitMQ、RocketMQ和Kafka,都是大家耳熟能详的。最近,Apache基金会推出的Pulsar也挺火的,口碑不错,只还差一些大项目实战来检验它。

如今,MQ在现在的项目里基本是标配了。这篇文章主要是梳理一下自己所在项目中是怎么用MQ的,复盘一下使用MQ的场景。

一、短信通知

1.1、场景描述

大概的业务场景就是:

系统包含多个微服务,如业务微服务、消息中心等。业务微服务完成相应的业务需要发送信息通知,一般来说第三方的短信服务发送短信是需要一定时间,所以请求过来它会先返回短信回执ID给调用方,后面调用方再通过回执ID来查询短信的发送状态。主要的问题还是在于短信服务不能同步返回短信是否发送成功。

主要要求:

  • 发送短信有可能会失败,需要重试
  • 发送完短信,需要从第三方查询短信状态并更新短信发送状态

1.2、项目实现

项目中的实现流程大概如下:

添加图片注释,不超过 140 字(可选)

  • 业务中心把短信任务发送给消息中心MQ
  • MQ中和任务被成功调用第三方接口如短信接口,后通过ACK去除掉MQ中消息
  • 如果调用第三方接口失败,没有完成应答,消息会重新放回MQ原队列或死重队列进行重试
  • 消息中心提供各种消息发送的功能,短信、邮件、钉钉等等

1.3、实现分解

当然一般来说业务量比较小时可以业务走完就直接顺序调用短信,或者起一个线程异步调用短信也可以。然后通过程序来处理异常与重试。

使用MQ中间件主要是考虑以后业务量大了、并发高了的情况下不解耦出来,对性能的影响。

总结一下,大概有以下的好处:

解耦服务

MQ允许服务之间通过消息进行通信,而不是直接调用,这样可以减少服务间的依赖性,提高系统的灵活性和可维护性。

异步处理

通过MQ,可以实现异步消息传递,使得发送者不需要等待接收者处理完消息。这样可以提高系统的响应速度和吞吐量。

可靠性保证

MQ提供消息持久化、确认机制等功能,确保消息不会因为网络问题或服务故障而丢失。

重试机制

MQ可以实现消息的重试机制,当消息处理失败时,可以重新发送消息,直到成功处理。

状态追踪和监控

MQ可以配合日志和监控系统,追踪消息的状态和系统的健康状况。

二、业务日志

2.1、场景描述

大概的业务场景就是:

整个系统包含两类日志:一种是系统日志,另一种就是业务日志。

系统日志:nginx访问日志、java堆栈日志等

业务日志:谁什么时候登录、退出,谁什么时候使用了什么功能等一些用户行为日志

主要要求:

  • 系统日志,由于分布式系统日志比较分散不便管理与使,需要有一个统一管理日志的地方
  • 业务日志,收集并存储客户端软件及web端软件使用的用户行为日志

2.2、实现分解

项目中的实现流程大概如下:

系统日志

添加图片注释,不超过 140 字(可选)

  • 通过filebeat采集系统日志
  • filebeat把采集的日志输出到kafka
  • logstash订阅kafka里的日志
  • logstash把日志输出到elasticsearch中
  • 运维和开发可以通过kibana搜索分布式节点的日志

使用MQ的作用:

Kafka 作为一个高吞吐量的分布式消息系统,可以作为 Logstash 和数据源(如 Filebeat)之间的缓冲区。这有助于解耦数据的生产者和消费者,允许它们独立扩展和运行。

当 Logstash 处理能力不足或 Elasticsearch 写入压力过大时,Kafka 可以缓冲数据,防止数据丢失,并确保系统的稳定性。

在生产中kafka可以在不同的环节插入到ELK中:

  • Filebeat -> Logstash -> Elasticsearch: 适用于需要对日志数据进行复杂处理后存储的场景。
  • Filebeat -> Kafka -> Logstash -> Elasticsearch: 适用于需要缓冲数据或实现数据流的实时处理的场景。
  • Filebeat -> Kafka -> Elasticsearch: 适用于直接从 Kafka 消费数据并存储的场景,可能不需要 Logstash 的复杂处理。

业务日志

一般系统会记录用户的作为轨迹到数据库,用于用户作为的溯源,这种日志一般不允许丢失。

添加图片注释,不超过 140 字(可选)

业务日志使用kafka的原因基本和系统日志是一致的,系统日志落盘至elasticsearch中,而业务日志落盘到DB中。

2.3、小结:

此场景选择Kafka而非其他消息队列(MQ)解决方案,是基于对系统需求的精准匹配。Kafka作为一款专为处理大规模数据流而设计的消息系统,其卓越的性能表现在每秒能够处理数以万计的消息。这种能力使其成为处理用户行为日志和交易数据等高频次、大规模数据流的理想选择。

用户行为日志和业务数据日志往往伴随着高并发和持续的数据涌入,Kafka的高吞吐量和水平扩展性使其能够轻松应对这些挑战。其分布式架构和持久化存储机制确保了数据的可靠性和系统的稳定性,即使在数据量激增的情况下也能保持高效运行。因此,考虑到Kafka在这些方面的优势,我们决定采用它来满足项目对高吞吐量和数据处理能力的需求。

可以看到下图kafka的吞吐量是非常大的。


添加图片注释,不超过 140 字(可选)


此图来源于confluent.io



相关实践学习
消息队列RocketMQ版:基础消息收发功能体验
本实验场景介绍消息队列RocketMQ版的基础消息收发功能,涵盖实例创建、Topic、Group资源创建以及消息收发体验等基础功能模块。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
目录
相关文章
|
16天前
|
消息中间件 存储 中间件
说说MQ在你项目中的应用(二)商品支付
本文总结了消息队列(MQ)在支付订单业务中的应用,重点分析了RabbitMQ的优势。通过异步处理、系统解耦和流量削峰等功能,RabbitMQ确保了支付流程的高效与稳定。具体场景包括用户下单、支付请求、商品生产和物流配送等环节。相比Kafka,RabbitMQ在低吞吐量、高实时性需求下表现更优,提供了更低延迟和更高的可靠性。
29 0
|
2月前
|
消息中间件 存储 Apache
探索 RocketMQ:企业级消息中间件的选择与应用
RocketMQ 是一个高性能、高可靠、可扩展的分布式消息中间件,它是由阿里巴巴开发并贡献给 Apache 软件基金会的一个开源项目。RocketMQ 主要用于处理大规模、高吞吐量、低延迟的消息传递,它是一个轻量级的、功能强大的消息队列系统,广泛应用于金融、电商、日志系统、数据分析等领域。
115 0
探索 RocketMQ:企业级消息中间件的选择与应用
|
7月前
|
消息中间件 Java RocketMQ
消息队列 MQ产品使用合集之当SpringBoot应用因网络不通而启动失败时,该如何解决
消息队列(MQ)是一种用于异步通信和解耦的应用程序间消息传递的服务,广泛应用于分布式系统中。针对不同的MQ产品,如阿里云的RocketMQ、RabbitMQ等,它们在实现上述场景时可能会有不同的特性和优势,比如RocketMQ强调高吞吐量、低延迟和高可用性,适合大规模分布式系统;而RabbitMQ则以其灵活的路由规则和丰富的协议支持受到青睐。下面是一些常见的消息队列MQ产品的使用场景合集,这些场景涵盖了多种行业和业务需求。
|
5月前
|
消息中间件 存储 传感器
RabbitMQ 在物联网 (IoT) 项目中的应用案例
【8月更文第28天】随着物联网技术的发展,越来越多的设备被连接到互联网上以收集和传输数据。这些设备可以是传感器、执行器或其他类型的硬件。为了有效地管理这些设备并处理它们产生的大量数据,需要一个可靠的消息传递系统。RabbitMQ 是一个流行的开源消息中间件,它提供了一种灵活的方式来处理和转发消息,非常适合用于物联网环境。
223 1
|
5月前
|
消息中间件 开发工具
【Azure Event Hub】原生应用中使用RabbitMQ,是否可以不改动代码的情况下直接转换为使用Event Hub呢?
【Azure Event Hub】原生应用中使用RabbitMQ,是否可以不改动代码的情况下直接转换为使用Event Hub呢?
|
6月前
|
消息中间件 物联网 API
消息队列 MQ使用问题之如何在物联网项目中搭配使用 MQTT、AMQP 与 RabbitMQ
消息队列(MQ)是一种用于异步通信和解耦的应用程序间消息传递的服务,广泛应用于分布式系统中。针对不同的MQ产品,如阿里云的RocketMQ、RabbitMQ等,它们在实现上述场景时可能会有不同的特性和优势,比如RocketMQ强调高吞吐量、低延迟和高可用性,适合大规模分布式系统;而RabbitMQ则以其灵活的路由规则和丰富的协议支持受到青睐。下面是一些常见的消息队列MQ产品的使用场景合集,这些场景涵盖了多种行业和业务需求。
|
7月前
|
数据采集 监控 物联网
MQTT协议在智能制造中的应用案例与效益分析
【6月更文挑战第8天】MQTT协议在智能制造中的应用案例与效益分析
203 1
|
7月前
|
消息中间件 Arthas 监控
消息队列 MQ产品使用合集之每次重置reconsumeTimes就无法达到死信阈值,重试次数是否就要应用方控制
消息队列(MQ)是一种用于异步通信和解耦的应用程序间消息传递的服务,广泛应用于分布式系统中。针对不同的MQ产品,如阿里云的RocketMQ、RabbitMQ等,它们在实现上述场景时可能会有不同的特性和优势,比如RocketMQ强调高吞吐量、低延迟和高可用性,适合大规模分布式系统;而RabbitMQ则以其灵活的路由规则和丰富的协议支持受到青睐。下面是一些常见的消息队列MQ产品的使用场景合集,这些场景涵盖了多种行业和业务需求。
消息队列 MQ产品使用合集之每次重置reconsumeTimes就无法达到死信阈值,重试次数是否就要应用方控制
|
7月前
|
消息中间件 Java Spring
Spring Boot与RabbitMQ的集成应用
Spring Boot与RabbitMQ的集成应用
|
3月前
|
消息中间件 JSON Java
开发者如何使用轻量消息队列MNS
【10月更文挑战第19天】开发者如何使用轻量消息队列MNS
149 6