首页 > 其他分享 >消息队列常见的使用场景

消息队列常见的使用场景

时间:2023-04-16 16:24:06浏览次数:43  
标签:场景 队列 常见 消息 下单 日志 客户端

消息队列中间件是分布式系统中重要的组件,主要解决应用耦合,异步消息,流量削锋等问题

实现高性能,高可用,可伸缩和最终一致性架构。最全面的Java面试网站

使用较多的消息队列有 RocketMQ,RabbitMQ,Kafka,ZeroMQ,MetaMQ

以下介绍消息队列在实际应用中常用的使用场景。

异步处理,应用解耦,流量削锋、日志处理和消息通讯五个场景。

场景 1:异步处理

场景说明:用户注册后,需要发注册邮件和注册短信。传统的做法有两种 1.串行的方式;2.并行方式

本文已经收录到Github仓库,该仓库包含计算机基础、Java基础、多线程、JVM、数据库、Redis、Spring、Mybatis、SpringMVC、SpringBoot、分布式、微服务、设计模式、架构、校招社招分享等核心知识点,欢迎star~

Github地址

如果访问不了Github,可以访问gitee地址。

gitee地址

(1)串行方式:将注册信息写入数据库成功后,发送注册邮件,再发送注册短信。以上三个任务全部完成后,返回给客户端

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

假设三个业务节点每个使用 50 毫秒钟,不考虑网络等其他开销,则串行方式的时间是 150 毫秒,并行的时间可能是 100 毫秒。

因为 CPU 在单位时间内处理的请求数是一定的,假设 CPU1 秒内吞吐量是 100 次。则串行方式 1 秒内 CPU 可处理的请求量是 7 次(1000/150)。并行方式处理的请求量是 10 次(1000/100)

小结:如以上案例描述,传统的方式系统的性能(并发量,吞吐量,响应时间)会有瓶颈。如何解决这个问题呢?

引入消息队列,将不是必须的业务逻辑,异步处理。改造后的架构如下:

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

场景 2:应用解耦

场景说明:用户下单后,订单系统需要通知库存系统。传统的做法是,订单系统调用库存系统的接口。如下图

传统模式的缺点:

  • 假如库存系统无法访问,则订单减库存将失败,从而导致订单失败
  • 订单系统与库存系统耦合

如何解决以上问题呢?引入应用消息队列后的方案,如下图:

  • 订单系统:用户下单后,订单系统完成持久化处理,将消息写入消息队列,返回用户订单下单成功
  • 库存系统:订阅下单的消息,采用拉/推的方式,获取下单信息,库存系统根据下单信息,进行库存操作
  • 假如:在下单时库存系统不能正常使用。也不影响正常下单,因为下单后,订单系统写入消息队列就不再关心其他的后续操作了。实现订单系统与库存系统的应用解耦

场景 3:流量削锋

流量削锋也是消息队列中的常用场景,一般在秒杀或团抢活动中使用广泛

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

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

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

场景 4:日志处理

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

  • 日志采集客户端,负责日志数据采集,定时写入 Kafka 队列
  • Kafka 消息队列,负责日志数据的接收,存储和转发
  • 日志处理应用:订阅并消费 kafka 队列中的日志数据

以下是新浪 kafka 日志处理应用案例

(1)、Kafka:接收用户日志的消息队列

(2)、Logstash:做日志解析,统一成 JSON 输出给 Elasticsearch

(3)、Elasticsearch:实时日志分析服务的核心技术,一个 schemaless,实时的数据存储服务,通过 index 组织数据,兼具强大的搜索和统计功能

(4)、Kibana:基于 Elasticsearch 的数据可视化组件,超强的数据可视化能力是众多公司选择 ELK stack 的重要原因

场景 5:消息通讯

消息通讯是指,消息队列一般都内置了高效的通信机制,因此也可以用在纯的消息通讯。比如实现点对点消息队列,或者聊天室等

点对点通讯:

客户端 A 和客户端 B 使用同一队列,进行消息通讯。

聊天室通讯:

客户端 A,客户端 B,客户端 N 订阅同一主题,进行消息发布和接收。实现类似聊天室效果。

以上实际是消息队列的两种消息模式,点对点或发布订阅模式。模型为示意图,供参考。

最后给大家分享一个Github仓库,上面有大彬整理的300多本经典的计算机书籍PDF,包括C语言、C++、Java、Python、前端、数据库、操作系统、计算机网络、数据结构和算法、机器学习、编程人生等,可以star一下,下次找书直接在上面搜索,仓库持续更新中~

Github地址

标签:场景,队列,常见,消息,下单,日志,客户端
From: https://www.cnblogs.com/tyson03/p/17323462.html

相关文章

  • 多重背包单调队列
    考虑思考完全背包问题的过程。完全背包其实是一个前缀最值的过程。而完全背包就是滑动窗口问题。可以把余数相同的归为一类,然后就可以直接单调队列了,队长\(s\)。#include<cstdio>#definemax(x,y)((x)>(y)?(x):(y))constintN=20001;intn,m,f[N],g[N],q[N];intmain(){......
  • 最基本的可视化图案有哪些?分别适用于那些场景?(比如折线图适合可视化某个属性值随时间变
    原文链接:https://blog.csdn.net/weixin_42129177/article/details/108231137散点图:用于发现各变量之间的关系。柱状图:展示多个分类的数据变化和同类别各变量之间的比较情况。条形图:展示多个分类的数据变化和同类别各变量之间的比较情况。折线图:展示数据随时间或有序类别的......
  • 关于Mybatis中常见的问题以及解决办法
    一.基础问题问题一:所有的配置没问题时,查询的数据库却为空,首先可以确定的是配置没问题,数据库连接也没有问题,那就可能是数据读取有问题了 有三种解决办法解决办法:(1)去实体类修改set方法,Mybatis是通过set方法进行查询的,所以只需要修改set方法就可以查询得到(不推荐使用)     ......
  • iTween用法与常见问题
    iTweenoncomplete回调不工作iTween.MoveTo(newBoom,iTween.Hash"y",100f,"speed",Boomspeed,"EaseType",BoomeaseType,"LoopType",BoomloopType,"oncomplete","BoomComplete"......
  • Visual Studio Code 常见的配置、常用好用插件以及【vsCode 开发相应项目推荐安装的插
    一、VsCode常见的配置1、取消更新把插件的更新也一起取消了2、设置编码为utf-8:默认就是了,不用设置了3、设置常用的开发字体:Consolas,默认就是了,不用设置了字体对开发也很重要,不同字体,字母形态都不太一样,尤其是标点符号,逗号和分号的区分,有的字体看着这两者就很像......
  • 关于站立会议的一些常见问题
    最近看到一些观点,关于敏捷开发各种不好用的观点,来源于水木社区,有兴趣的朋友可以自己去搜索,这里就不罗列了,仅仅记录一些目前我在一个新团队中推动时看到的问题,以及论坛中一些观点涉及到的错误的点,今后可能会发布一系列这方面的文字,随笔随写了。1,水木上某人说在某国企应用敏捷开发,结......
  • 栈和队列经典题题解
    目录......
  • 8.for循环的场景示例
    1.通过一个文件,进行批量创建用户   1.for循环根据文件内容进行取值   2.判断该用户是否存在,存在则提示已存在,无需创建   3.不存在则创建   4.提示创建结果    2.根据读入文件内容,进行批量创建用户,user:pass      3.批量创建用......
  • JUC之阻塞队列BlockingQueue的实现原理
    1.阻塞队列首先它是一个队列,是队列就会遵循先进先出(FIFO)的原则,又因为它是阻塞的,故与普通的队列有两点区别:A.当一个线程向队列里面添加数据时,如果队列是满的,那么将阻塞该线程,暂停添加数据。B.当一个线程从队列里面取出数据时,如果队列是空的,那么将阻塞该线程,暂停取出数据。2......
  • 超级账本与区块链应用场景
    区块链3.0去中心化应用的新需求区块链技术在行业应用中的条件行业应用的用户是有一定的范围的,一般限制在一个市场或某一个企业内部。这就要求应用具有身份认证和许可授权的功能。其次,企业往往需要数据在传输过程中不会被窃取。要求应用具有保护交易信息传输的设计。因此,对于提供给......