消息队列MQ使用详解

 更新时间:2024年10月12日 11:00:36   作者:Lvan的前端笔记  
消息队列(MQ)是一种基于“先进先出”原则的数据结构,广泛应用于分布式系统中,主要用于应用解耦、异步消息处理和流量削峰,消息队列中间件通过允许生产者发送消息到队列,消费者从队列中拉取消息或订阅消息,实现高效、可扩展和最终一致性的系统架构

什么是消息队列MQ

MQ(Message Queue)消息队列,是基础数据结构中“先进先出”的一种数据结构。指把要传输的数据(消息)放在队列中,用队列机制来实现消息传递——生产者产生消息并把消息放入队列,然后由消费者去处理。

消费者可以到指定队列拉取消息,或者订阅相应的队列,由MQ服务端给其推送消息。

作用

消息队列中间件是分布式系统中重要的组件,主要解决应用解耦,异步消息,流量削锋等问题,实现高性能,高可用,可伸缩和最终一致性架构。

  • 解耦:一个业务需要多个模块共同实现,或者一条消息有多个系统需要对应处理,只需要主业务完成以后,发送一条MQ,其余模块消费MQ消息,即可实现业务,降低模块之间的耦合。
  • 异步:主业务执行结束后从属业务通过MQ,异步执行,减低业务的响应时间,提高用户体验。
  • 削峰:高并发情况下,业务异步处理,提供高峰期业务处理能力,避免系统瘫痪。

缺点

1、系统可用性降低。依赖服务也多,服务越容易挂掉。需要考虑MQ瘫痪的情况

2、系统复杂性提高。需要考虑消息丢失、消息重复消费、消息传递的顺序性

3、业务一致性。主业务和从属业务一致性的处理

主要产品

主要的 MQ 产品包括:RabbitMQ、ActiveMQ、RocketMQ、ZeroMQ、Kafka、IBM WebSphere 等。

比较火的是 RocketMQ 和 Kafka。

分别应用在 web 和大数据

举例

1、例一

一个实际的使用消息队列(MQ)的例子是电商网站的订单处理系统。在电商网站中,用户下单后需要经过一系列的处理流程,包括订单验证、库存检查、支付处理、物流跟踪等。这些处理流程需要多个模块之间进行协作,而且每个模块都需要处理大量的订单数据。

为了解决这些问题,可以使用消息队列系统来实现订单处理流程的异步处理。具体来说,可以将订单数据发送到一个订单处理队列中,然后由不同的模块从队列中获取订单数据进行处理。这样就可以将订单数据的发送和接收者进行解耦,实现了系统的高可靠性、可伸缩性和可维护性。

举个例子,当用户下单后,订单系统会将订单数据发送到订单处理队列中,然后库存系统会从队列中获取订单数据进行库存检查,支付系统会从队列中获取订单数据进行支付处理,物流系统会从队列中获取订单数据进行物流跟踪等。这些模块之间可以并行处理订单数据,而且每个模块都可以独立地进行扩展和升级,从而实现了系统的高可用性和可伸缩性。

另外,由于电商网站的订单数据量可能非常大,使用消息队列可以实现削峰填谷,平滑处理订单请求,从而保证系统的可用性和稳定性。此外,使用消息队列还可以实现订单数据的缓存和延迟处理,以提高系统的性能和吞吐量。

总之,使用消息队列可以使得电商网站的订单处理系统更加高效、可靠和可维护,是现代电商系统中必不可少的技术。

例二

在线游戏中的多人游戏场景同步。在多人游戏中,多个玩家之间需要实时同步游戏场景的状态,包括角色位置、状态、动作等,同时还需要处理玩家之间的交互、碰撞等复杂场景逻辑。

为了实现这样的实时场景同步,可以使用消息队列来处理游戏场景事件的分发和处理。具体来说,可以将游戏场景中的事件(如玩家移动、攻击、技能释放等)封装成消息,然后通过消息队列进行广播,让所有参与游戏的客户端都能够接收到相应的消息,并根据消息内容来更新本地的游戏状态。

使用消息队列的好处在于,它可以将游戏场景事件的发送和接收者进行解耦,从而提高系统的可扩展性和可维护性。同时,由于消息队列可以处理大量的消息,还可以应对高并发的场景,并且能够削峰填谷,提高系统的稳定性和可用性。

在多人游戏中,使用消息队列还可以实现一些高级功能,比如实现延迟同步、反作 弊等。比如,可以将游戏场景中的事件缓存到消息队列中,并设置一定的延迟时间后再进行处理,以确保所有玩家都能够接收到相同的游戏状态。此外,还可以使用消息队列来监控和过滤玩家的行为,以检测和防范作弊行为。

综上所述,使用消息队列可以实现多人游戏场景的实时同步,并提高系统的可扩展性、可维护性和稳定性,是现代游戏开发中的重要技术。

例三

用户注册后,需要发注册邮件和注册短信,传统的做法有两种

  • 1.串行的方式;
  • 2.并行的方式 ;
  • 3.消息队列

(1)串行方式:将注册信息写入数据库后,发送注册邮件,再发送注册短信,以上三个任务全部完成后才返回给客户端。这有一个问题是,邮件,短信并不是必须的,它只是一个通知,而这种做法让客户端等待没有必要等待的东西。

(2)并行方式:将注册信息写入数据库后,发送邮件的同时,发送短信,以上三个任务完成后,返回给客户端,并行的方式能提高处理的时间。

(3)消息队列
引入消息队列后,把发送邮件,短信不是必须的业务逻辑异步处理。

例四:流量削峰

秒杀活动,一般会因为流量过大,导致应用挂掉,为了解决这个问题,一般在应用前端加入消息队列。

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

发布订阅 vs MQ

发布订阅模式和消息队列(MQ)都是在分布式系统中广泛使用的消息传递机制,它们都具有将发送者和接收者解耦的优点。

虽然这两种模式在某些方面相似,但它们也有一些重要的区别。

谁负责管理消息?

  • 在发布订阅模式中,消息的发送者不需要知道消息的接收者,而是将消息发送到一个主题(Topic),然后所有订阅该主题的订阅者都会接收到该消息。主题的管理通常由发布者负责。
  • 在消息队列中,消息的发送者将消息发送到队列中,然后订阅该队列的订阅者会按照队列中的消息顺序进行消费。队列的管理通常由消息队列系统负责。

消息如何分发?

  • 在发布订阅模式中,消息是通过主题进行分发的,所有订阅该主题的订阅者都会接收到相同的消息。这种方式可以使得多个订阅者同时接收到同一份消息。
  • 在消息队列中,消息是通过队列进行分发的,每个消息只会被一个订阅者接收。这种方式可以确保每个订阅者都能够接收到所有消息,但是无法让多个订阅者同时接收到同一份消息。

如何处理消息丢失?

  • 在发布订阅模式中,如果某个订阅者没有及时接收到消息,它将无法再次获取到该消息。这可能会导致消息丢失。
  • 在消息队列中,消息通常会被持久化到磁盘上,以确保即使在消息消费者宕机的情况下,消息也不会丢失。如果某个消费者无法消费某个消息,该消息将被保留在队列中,直到可以被正确地处理为止。

用例场景

  • 发布订阅模式通常适用于一些事件驱动的应用场景,例如消息推送、实时数据处理等。
  • 消息队列则适用于一些流量高、性能稳定的场景,例如电商交易、订单处理、日志处理等。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • SpringBoot Profile多环境配置方式

    SpringBoot Profile多环境配置方式

    这篇文章主要介绍了SpringBoot Profile多环境配置方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-06-06
  • IntelliJ IDEA2020.1版本更新pom文件自动导包的方法

    IntelliJ IDEA2020.1版本更新pom文件自动导包的方法

    这篇文章主要介绍了IntelliJ IDEA2020.1版本更新pom文件自动导包的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-06-06
  • Java取整与四舍五入

    Java取整与四舍五入

    本文详细讲解了Java取整与四舍五入,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-12-12
  • Tomcat+Eclipse乱码问题解决方法与步骤

    Tomcat+Eclipse乱码问题解决方法与步骤

    乱码问题是大家在日常开发过程中经常会遇到的问题,由于各自环境的不同,解决起来也费时费力,本文主要介绍一般性乱码问题的解决方法与步骤,开发工具采用Eclipse+Tomcat,统一设置项目编码UTF-8为例,感兴趣的朋友跟随小编一起看看吧
    2023-08-08
  • 简介Java编程中的Object类

    简介Java编程中的Object类

    这篇文章主要介绍了简介Java编程中的Object类,是Java入门学习中的基础知识,需要的朋友可以参考下
    2015-09-09
  • Springboot允许logger.debug输出日志方式

    Springboot允许logger.debug输出日志方式

    这篇文章主要介绍了Springboot允许logger.debug输出日志方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-06-06
  • Java数组(Array)最全汇总(上篇)

    Java数组(Array)最全汇总(上篇)

    这篇文章主要介绍了Java数组(Array)最全汇总(上篇),本文章内容详细,通过案例可以更好的理解数组的相关知识,本模块分为了三部分,本次为上篇,需要的朋友可以参考下
    2023-01-01
  • 聊聊SpringCloud中的Ribbon进行服务调用的问题

    聊聊SpringCloud中的Ribbon进行服务调用的问题

    SpringCloud-Ribbon是基于Netflix Ribbon实现的一套客户端负载均衡的工具。本文给大家介绍SpringCloud中的Ribbon进行服务调用的问题,感兴趣的朋友跟随小编一起看看吧
    2022-01-01
  • Spring Cloud接口突然变慢的解决方案

    Spring Cloud接口突然变慢的解决方案

    在Spring Cloud项目中,接口突然变慢可能是由多种原因造成的,本文给大家介绍了一些可能的原因以及相应的解决方案,通过代码示例给大家讲解的非常详细,需要的朋友可以参考下
    2024-01-01
  • Java集合之Disruptor操作示例

    Java集合之Disruptor操作示例

    这篇文章主要为大家介绍了Java集合之Disruptor操作示例介绍,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-08-08

最新评论