java消息队列应用场景是什么

一、什么是队列

队列(queue)是一种常见的数据结构,其最大的特点就是先进先出(first in first out),作为最基础的数据结构,队列应用很广泛。比如火车站排队买票等等。可以用下图表示队列:

java消息队列应用场景是什么

其中a1、a2、an表示队列中的数据。数据从队尾入队列,然后从队头出队列。

二、什么是消息队列

消息队列(Message Queue)是一种使用队列(Queue)作为底层存储数据结构,可以用于解决不同进程与应用程序之间通讯的分布式消息容器,也可以称为消息中间件。

目前比较常用的消息队列有ActiveMQ、RabbitMQ、Kafka、RocketMQ、Redis等。

立即学习“Java免费学习笔记(深入)”;

java消息队列应用场景是什么

消息队列和队列有什么区别呢?

唯一的区别在于入队列的时候称为生产者,出队列的时候称为消费者。

三、消息队列应用场景

消息队列应用场景非常广泛,下面我们列举比较常见的几个场景

1、分布式场景

1.1、异步处理

一般我们写的程序都是按照顺序执行的(即同步的方式)。比如电商系统中订单的例子,其执行顺序如下:

用户提交订单。订单完成以后增加积分。发生积分变动的短信通知。

可以用下面的流程图表示:

java消息队列应用场景是什么

如果按照上面的顺序执行,假如每个服务都需要花费一秒,那么客户端就要花费3秒的时间。对于用户来说,3秒的时间显然是不能忍受的,那么我们该如何解决呢?我们可以使用异步的方式来解决这个问题,看下面一张流程图:

java消息队列应用场景是什么

按照这种方式,积分服务和短信服务使用线程异步的方式进行操作,那么客户端只需要花费1秒的时间就可以完成了。但是,这种异步的方式会带来另外的问题:并发量降低。因为积分服务和短信服务都需要在订单服务里面开启线程,开启的线程多了,会导致客户端访问订单服务的并发量降低,可能导致客户端提交订单的实际时间会超过1秒钟。那么如何解决异步带来的问题呢?那就是使用消息队列,看下面的流程图:

java消息队列应用场景是什么

在上面的流程中,我们增加了一个消息队列的角色,首先由客户端提交订单,然后把订单写入到消息队列,积分服务和短信服务同时去消费消息队列里面的消息,这种方式不需要订单服务在额外的开启异步线程,客户端可以实现真正的耗时1秒。

1.2、应用解耦

我们还是以电商系统为例进行讲解,先看下面的流程图:

java消息队列应用场景是什么

上图的业务逻辑:客户端发起一个创建订单的请求,创建订单的时候,我们要先获取库存,然后在去扣减库存,这样订单系统和库存系统就形成了非常紧密的依赖关系。假如这时候库存系统发生了宕机,由于订单系统依赖于库存系统,这时候订单系统将不能使用。那么如何解决呢?

看下面使用消息队列的流程图:

java消息队列应用场景是什么

在上面的流程中,我们加入了消息队列。首先客户端发起创建订单的请求,订单的消息写入到消息队列里面,然后库存系统去消息队列里面订阅消息,最后异步的去更新库存系统。如果库存系统发生了宕机,由于订单系统不直接依赖于库存系统,所以订单系统可以正常的响应客户端的请求。这样就实现了应用解耦。

1.3、流量削峰

对于高并发的系统来说,在访问高峰时,突发的流量就像洪水般涌向应用系统,尤其是一些高并发写操作,随时会导致数据库服务器瘫痪,无法继续提供服务。

而引入消息队列则可以减少突发流量对应用系统的冲击。消费队列就像“水库”一样,拦截上游的洪水,削减进入下游河道的洪峰流量,从而达到减免洪水灾害的目的。

在这方面最常见的例子就是秒杀系统,一般秒杀活动瞬间流量很高,如果流量全部涌向秒杀系统,会压垮秒杀系统,通过引入消息队列,可以有效缓冲突发流量,达到“削峰”的作用。

我们使用秒杀的场景来描述流量削峰,先看下面一张流程图:

java消息队列应用场景是什么

在上面的流程中,我们把秒杀服务称为上游服务,订单服务、库存服务、余额服务统称为下游服务。客户端发起秒杀的请求,秒杀服务收到客户端发送的请求以后,创建订单,修改库存,扣减余额,这是秒杀的基本业务场景。

假如下游服务只能同时处理1000个并发请求,上游服务可以处理10000个并发请求,而客户端发起了10000个请求,超出了下游服务可以处理的并发量,所以会导致下游服务发生宕机。这时就可以加入消息队列来解决宕机的问题。看下面加入消息队列的流程图:

java消息队列应用场景是什么

我们在上面的流程图中加入了消息队列,描述服务接收到客户端发送的10000个请求以后,把所有的请求都写入到消息队列中,然后下游服务去订阅消息队列里面的秒杀请求,然后在去执行自己的业务逻辑操作。

我们举个简单的例子,上游服务还是能处理10000个并发请求,下游服务还是只能处理1000个并发请求,那么这时候我们在消息队列里面会允许存1000个并发请求。上游的秒杀服务接收到10000个并发请求,而消息队列里面只能存1000个请求,多余的请求就不会存入到消息队列里面,直接返回给客户端提示“系统繁忙,请稍后!”。这就是所谓的流量削峰场景。这是由下游服务可以处理的并发量决定的。由于下游服务只能处理1000个并发请求,所以消息队列里面只能存1000个秒杀,多余的秒杀请求全部返回客户端提示。这样就保证了下游服务的正常响应,不会导致下游服务发生宕机,提高了系统的可用性。

2、日志场景

优化日志传输

为了程序的健壮性,我们一般会在程序中添加各种记录日志的功能,比如错误日志、操作日志等等,看下面一张流程图:

java消息队列应用场景是什么

上面的流程图是同步记录日志的流程。使用同步记录日志的流程,会使得整个流程花费的时间增多,而且也会容易造成业务系统宕机(如果数据库损坏了,向数据库记录日志的操作将会产生错误)。我们可以使用消息队列的方式优化日志的传输。看下面的流程图:

java消息队列应用场景是什么

加入了消息队列以后,可以缩短系统花费的时间,而且也可以达到应用系统解耦的功能。

3、及时通讯场景

聊天室

消息队列最主要功能是收发消息,其内部有高效的通讯机制,因此非常适合用于消息通讯。

我们可以基于消息队列开发点对点的聊天系统,也可以开发广播系统,用于将消息广播给大量接收者。

java消息队列应用场景是什么

以上就是java消息队列应用场景是什么的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2590898.html

(0)
上一篇 2025年3月6日 16:44:02
下一篇 2025年3月6日 16:44:18

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • 怎样用Java实现自动取消未支付订单的功能?

    定时轮询 数据库定时轮询方式,实现思路比较简单。启动一个定时任务,每隔一定时间扫描订单表,查询到超时订单就取消。 优点:实现简单。 立即学习“Java免费学习笔记(深入)”; 缺点:轮询时间间隔不好确定,占用服务器资源,影响数据库性能。 惰…

    编程技术 2025年3月6日
    200
  • java数组和容器的关系是什么

    1、概念 数组是一种高效的存储和随机访问对象引用序列的方式,但是当创建一个数组对象(注意和对象数组的区别)后,数组的大小也就固定了,当数组空间不足的时候就再创建一个新的数组,把旧的数组中所有的引用复制到新的数组中。(数组是一种内存结构,而容…

    编程技术 2025年3月6日
    200
  • java中怎么创建对象

    1、检查类是否加载。 当虚拟机遇到new指令时,首先检查该指令的参数能否在常量池中定位为一个类别的符号引用,检查该符号引用代表的类别是否加载、分析和初始化。否则,执行类加载过程。 2、为目标分配内存。 在完成类加载后,虚拟机会开始为目标分配…

    编程技术 2025年3月6日
    200
  • java弱引用结合队列使用的方法

    1、使用说明 弱引用可与引用队列联合使用,弱引用对象会被垃圾回收,Java虚拟机将该弱引用加入与之相关的引用队列中。 2、实例 public class GCTarget {    // 对象的ID    public String id;…

    编程技术 2025年3月6日
    200
  • Java API 开发中的消息队列处理方案

    随着互联网技术的快速发展,消息队列成为了分布式系统中最常用的通讯方式之一。java api 是一个功能强大的编程语言,其提供了多种消息队列处理方案,这些方案都有自己的特点和适用场景。 本文将介绍 Java API 开发中常见的消息队列处理方…

    编程技术 2025年3月6日
    200
  • Java API 开发中使用 RabbitMQ 进行异步消息处理

    随着互联网的快速发展,异步消息处理在分布式系统中扮演着重要的角色,可以提高系统的可靠性和并发性。rabbitmq是一种开源的消息队列系统,可以快速可靠地传递消息,被广泛应用于互联网领域。本文将介绍在java api开发中如何使用rabbit…

    编程技术 2025年3月6日
    200
  • 如何使用Java构建一个可扩展的社交音乐平台

    随着互联网的不断发展,社交网络和音乐平台已经成为了人们日常生活中必不可少的一部分。在过去,用户需要在不同的平台上进行注册并登录,才能收听他们喜欢的歌曲和与其他用户交流。为了节省用户时间和增加用户体验,很多公司开始将社交网络和音乐平台结合起来…

    编程技术 2025年3月6日
    200
  • 如何使用Java中的消息队列实现异步通信?

    如何使用java中的消息队列实现异步通信? 随着互联网的发展,异步通信已经成为现代应用程序开发中的重要组成部分。它允许应用程序在处理时间长的操作时能够继续响应其他请求,提高了系统的并发处理能力和性能。在Java中,我们可以使用消息队列来实现…

    编程技术 2025年3月6日
    200
  • 手把手项目实战,搞完,直接写在简历上!

    很多没有项目经验,或者没有亮点项目的朋友可以看过来。 最近在搞一个项目:充电桩项目。本文给大家介绍这个项目背景、部分原型图、核心功能、核心模块、技术栈等。 项目背景介绍 随着我国汽车行业的不断发展,电动汽车已经开始逐步的领导整个汽车行业,越…

    2025年3月6日 编程技术
    200
  • 实现Java功能快速迭代的最佳实践:微服务架构

    实现Java功能快速迭代的最佳实践:微服务架构 引言:在当今快节奏的软件开发环境下,开发人员急需寻找一种能够快速迭代、灵活扩展的架构。微服务架构是一种值得探索的解决方案,它将复杂的应用拆分成更小、自治的服务,每个服务都围绕着特定的业务功能进…

    2025年3月6日
    200

发表回复

登录后才能评论