【RabbitMQ——具体使用场景】

news2024/9/28 5:37:41

1. 异步

1.1 同步异步的问题(串行)

串行方式:将订单信息写入数据库成功后,发送注册邮件,再发送注册短信。以上三个任务全部完成后,返回给客户端
在这里插入图片描述

public void makeOrder(){
    // 1 :保存订单 
    orderService.saveOrder();
    // 2: 发送短信服务
    messageService.sendSMS("order");//1-2 s
    // 3: 发送email服务
    emailService.sendEmail("order");//1-2 s
    // 4: 发送APP服务
    appService.sendApp("order");    
}

1.2 并行方式 异步线程池

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

public void makeOrder(){
    // 1 :保存订单 
    orderService.saveOrder();
   // 相关发送
   relationMessage();
}
public void relationMessage(){
    // 异步
     theadpool.submit(new Callable<Object>{
         public Object call(){
             // 2: 发送短信服务  
             messageService.sendSMS("order");
         }
     })
    // 异步
     theadpool.submit(new Callable<Object>{
         public Object call(){
              // 3: 发送email服务
            emailService.sendEmail("order");
         }
     })
      // 异步
     theadpool.submit(new Callable<Object>{
         public Object call(){
             // 4: 发送短信服务
             appService.sendApp("order");
         }
     })
      // 异步
         theadpool.submit(new Callable<Object>{
         public Object call(){
             // 4: 发送短信服务
             appService.sendApp("order");
         }
     })
}

存在问题:
1:耦合度高
2:需要自己写线程池自己维护成本太高
3:出现了消息可能会丢失,需要你自己做消息补偿
4:如何保证消息的可靠性你自己写
5:如果服务器承载不了,你需要自己去写高可用

1.3 异步消息队列的方式

在这里插入图片描述

public void makeOrder(){
    // 1 :保存订单 
    orderService.saveOrder();   
    rabbitTemplate.convertSend("ex","2","消息内容");
}

好处
1:完全解耦,用MQ建立桥接
2:有独立的线程池和运行模型
3:出现了消息可能会丢失,MQ有持久化功能
4:如何保证消息的可靠性,死信队列和消息转移的等
5:如果服务器承载不了,你需要自己去写高可用,HA镜像模型高可用。
按照以上约定,用户的响应时间相当于是订单信息写入数据库的时间,也就是50毫秒。注册邮件,发送短信写入消息队列后,直接返回,因此写入消息队列的速度很快,基本可以忽略,因此用户的响应时间可能是50毫秒。因此架构改变后,系统的吞吐量提高到每秒20 QPS。比串行提高了3倍,比并行提高了两倍

2. 高内聚,低耦合

在这里插入图片描述

3. 削峰

在这里插入图片描述

3. 分布式事务的可靠消费和可靠生产

3.1 可靠生产

  • 发布确认 (Publisher Confirms):
    • RabbitMQ 支持发布确认机制,允许生产者知道消息是否已经被代理 服务器接收到。
    • 当生产者发送一条消息时,它可以设置一个回调函数,当消息被成功接收后,这个回调函数会被触发。
    • 如果消息未能成功发送,生产者可以采取重试策略或其他补救措施。
      事务 (Transactions):
  • 生产者可以将消息发送包裹在一个事务中。在事务提交之前,所有操作都不会生效。
    • 这种方法虽然能够确保消息要么全部发送成功,要么全部失败,但会显著降低性能,因为事务处理需要更多的网络往返和锁定资源。
    • 在大多数情况下,推荐使用发布确认而不是事务。
  • 持久化消息 (Persistent Messages):
    • 生产者可以在发送消息时将其标记为持久化的,这样即使 RabbitMQ 重启,这些消息也会被保存下来。
    • 持久化消息通常与队列的持久化设置一起使用,以确保消息不会丢失。

3.2 可靠消费

  • 手动确认 (Manual Acknowledgments):
    • 消费者可以通过设置自动确认为 false 来控制何时确认消息。
    • 只有当消费者完成处理并且明确调用确认方法时,RabbitMQ 才会从队列中移除该消息。
    • 如果消费者处理消息过程中发生错误,没有发送确认,那么 RabbitMQ 会将消息重新放入队列中,等待其他消费者处理。
  • 死信交换机 (Dead Letter Exchanges, DLX):
    • 当消息达到一定的条件(如尝试次数超过限制)时,消息可以被路由到一个特殊的交换机,称为死信交换机。
    • 死信交换机可以用来存储或进一步处理这些无法正常处理的消息。
  • 消息TTL (Time To Live):
    • 设置消息的有效期,过期的消息将会被丢弃或者被转发到死信交换机。
    • 这对于清理那些长时间未被处理的消息很有用。
  • 镜像队列 (Mirrored Queues):
    • 镜像队列是 RabbitMQ 中的一种高可用性解决方案,其中队列的内容会在集群中的多个节点上复制。
    • 即使某个节点崩溃,消息也不会丢失,因为它们仍然存在于其他节点上。

4. 索引、缓存、静态化处理的数据同步

4.1 索引更新

  • 异步处理:当数据库中的数据发生变化时,应用程序可以发送一条消息到 RabbitMQ,而不是直接更新索引。一个专门的消费者(可能是另一个服务或进程)监听这个消息,并负责更新索引。这样可以将索引更新操作从主业务流程中分离出来,提高系统的响应速度。
  • 解耦:通过使用消息队列,可以将索引更新逻辑与业务逻辑解耦。即使索引服务暂时不可用,也不会影响主要业务流程,因为消息会被存储在队列中,直到被消费。

4.2 缓存更新

  • 事件驱动的缓存刷新:当数据库中的数据发生变更后,可以通过消息通知相关的缓存服务,使其能够及时地更新或清除过时的缓存条目。
  • 一致性保证:虽然缓存通常不要求强一致性,但使用消息队列可以帮助实现最终一致性。当数据发生变化时,相关服务可以通过订阅消息来更新它们的缓存。

4.3 静态化处理

  • 后台任务触发:对于需要生成或更新的静态内容,如HTML页面、图片缩略图等,可以在数据变更时发送一条消息。静态内容生成器可以是单独的服务,它监听消息并执行生成或更新操作。
  • 流量削峰:如果静态内容的生成是一个资源密集型的操作,那么使用消息队列可以帮助平滑请求峰值,避免因突然大量请求导致系统过载。

5. 流量监控

RabbitMQ 本身并不是一个流量监控工具,但它可以与监控系统结合使用来实现对消息队列的流量监控。通过监控 RabbitMQ 的各项指标,你可以了解系统的健康状况、性能瓶颈以及可能存在的问题。

5.1使用 RabbitMQ 内置的管理插件

RabbitMQ 提供了一个管理界面(Management UI),它可以通过 HTTP API 访问,并且包含了一些基本的监控功能。这些功能包括:

  • 队列状态:查看队列中的消息数量、消费者数量等。
  • 连接和通道:监控当前活动的连接数和通道数。
  • 交换机状态:检查交换机的状态和绑定情况。
  • 节点信息:获取集群中各个节点的信息,包括内存使用情况、磁盘空间等。

5.2 使用外部监控工具

为了更全面地监控 RabbitMQ 并与其他系统集成,通常会使用专门的监控工具或平台,例如:

  • Prometheus + Grafana:Prometheus 是一个开源的监控系统和时间序列数据库。你可以配置 Prometheus 来抓取 RabbitMQ 暴露的指标,并使用 Grafana 创建可视化仪表板。
  • Datadog, New Relic, Zabbix 等第三方监控服务也提供了对 RabbitMQ 的支持,它们可以帮助你设置警报规则,进行历史数据分析等。

6. 日志监控(ELK)

RabbitMQ 本身不是一个日志管理或分析工具,但它可以作为传输层来帮助构建日志收集和处理的管道。ELK(Elasticsearch, Logstash, Kibana)堆栈是一种流行的日志管理和可视化解决方案,其中:

  • Elasticsearch 是一个分布式的搜索和分析引擎。
  • Logstash 是一个服务器端的数据处理管道,可以从多个来源采集数据,转换并发送到指定的目的地。
  • Kibana 提供了可视化界面,用于展示 Elasticsearch 中的数据。
    可以将 RabbitMQ 与 ELK 堆栈结合起来使用,尤其是当你需要一种可靠的、可扩展的方式来传输日志信息时。

7. 下单、订单分发、抢票

同上面的异步、削峰、解耦。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2172506.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

电脑退域或切换系统账号后系统黑屏

之前加入域时迁移了账号系统&#xff0c;导致退域后本地账号系统没了东西黑屏但能看到鼠标。也登不了域账号了一顿慌张&#xff08;操作如下&#xff09; 解决&#xff1a;又加回了域哈哈哈 重启电脑按F8进不去安全模式&#xff0c;找不到触发时间... winr打开运行&#xff0c;…

什么是托管安全信息和事件管理 SIEM?

什么是 SIEM&#xff1f; 安全信息和事件管理 ( SIEM ) 解决方案最初是一种集中式日志聚合解决方案。SIEM 解决方案会从整个组织网络中的系统收集日志数据&#xff0c;使组织能够从单一集中位置监控其网络。 随着时间的推移&#xff0c;SIEM解决方案已发展成为一个完整的威胁…

Jenkins简介;Jenkins安装

一&#xff0c;Jenkins简介 1、什么是Jenkins Jenkins是一个开源软件项目&#xff0c;是基于Java开发的一种持续集成工具&#xff0c;用于监控持续重复的工作&#xff0c;旨在提供一个开放易用的软件平台&#xff0c;使软件项目可以进行持续集成。 2、Jenkins的作用 持续的软…

【Golang】(推荐项目)Go后端工程项目

Go后端工程项目 在这个基于项目的课程中&#xff0c;我们将从头开始用 Go 构建一个完整的 REST API。 本次项目将从构建一个简单的 TCP 服务器开始&#xff0c;目标是探索 Go 中的 net/http 包。本项目的目标是获得构建和推理一般后端系统的基础知识。 为什么推荐这个项目&am…

操作台厂家如何设计工作台面才能让企业高效办公?

在快节奏的现代商业环境中&#xff0c;高效办公已成为企业竞争力的重要体现。嘉德立作为一家专注设计操作台厂家&#xff0c;很明确的告诉大家设计一款既能提升工作效率&#xff0c;又能兼顾员工舒适度的工作台面&#xff0c;是赢得市场的关键。那么&#xff0c;如何巧妙地设计…

【LLM】 TinyAgent 构建指南

文章目录 TinyAgent 构建指南项目概述实现步骤步骤一&#xff1a;模型构建步骤二&#xff1a;工具构建步骤三&#xff1a;Agent 构建步骤四&#xff1a;运行 Agent 结论参考文献学习心得 TinyAgent 构建指南 项目地址&#xff1a;https://github.com/datawhalechina/tiny-univ…

详解位示图计算方法、代码

位示图 位示图的核心思想计算过程与位操作假设问题场景&#xff1a; 实际操作与计算&#xff1a;1. 位示图的初始化2. 设置某一位&#xff08;标记资源占用&#xff09;3. 清除某一位&#xff08;释放资源&#xff09;4. 查询某一位&#xff08;检查资源状态&#xff09; 示例问…

【2米/8米光学卫星】

2米/8米光学卫星 2米/8米光学卫星&#xff0c;通常指的是GF-1 B、C、D卫星&#xff0c;这是我国民用空间基础设施发展规划中的首个民用高分辨率光学陆地业务星座&#xff0c;也是自然资源部组建后发射的首批业务卫星。以下是对该卫星的详细介绍&#xff1a; 一、基本信息 发…

k8s 分布式存储平台 -- Longhorn

文章目录 一、什么是 Longhorn二、架构设计1、工作原理2、工作流程3、基于微服务设计的优势 三、安装1、安装要求2、使用 Longhorn 命令行工具&#xff08;验证方式一&#xff09;3、使用环境检查脚本&#xff08;验证方式之二&#xff09;3.1、安装 jq3.2、运行脚本 4、安装 o…

AI会议时代:企业如何搭上快车?

“我 们认为&#xff0c;AI绝不仅是会议的辅助工具&#xff0c;而更会是重塑会议流程的关键力量。通过AI的个性化定制、大规模支持、智能分析这些技术&#xff0c;AI会议将大大提升会议的智能化与高效性&#xff0c;进而成为企业数字化转型的核心驱动力。” 作者|斗斗 编辑…

QTreeview model过滤

QTreeview model数据过滤&#xff1a;大小写区分&#xff0c;对列过滤&#xff0c;对子对象过滤 示例&#xff1a; 需要自定义QSortFilterProxyModel, //自定义过滤model mProxyModel new TreeFilterProxyModel(this); //添加treeview当前model mProxyModel->setSource…

【源码+文档+调试讲解】学生选课系统Python

摘 要 学生选课系统采用B/S架构&#xff0c;数据库是MySQL。网站的搭建与开发采用了先进的Python进行编写&#xff0c;使用了Django框架。该系统从三个对象&#xff1a;由管理员和学生、教师来对系统进行设计构建。主要功能包括&#xff1a;个人信息修改&#xff0c;对学生、教…

Brave编译指南2024 MacOS篇-获取源码(三)

引言 在上一篇文章中,我们介绍了Brave浏览器的基本特性,以及编译Brave所需的系统要求和推荐工具。现在,我们将进入编译过程的第一个实际步骤:获取Brave的源代码。这一步骤对于后续的编译和开发工作至关重要。 1. Brave源码的获取途径 Brave的源码托管在GitHub上,任何人都可以…

YOLO格式数据集转为COCO数据集(简单粗暴)

最近需要用的coco格式的数据集&#xff0c;但是在网上找的很多 毕竟麻烦&#xff0c;简单记录一下&#xff01; 1、调整目录结构&#xff08;以GC10-DET数据集为例&#xff09; YOLO格式数据集目录结构如下&#xff1a; 简单来说就是images文件夹里面有train、val、test三个文…

OJ在线评测系统 在Linux虚拟机搭建Docker 概念 入门 安装

Docker的基本概念 为什么要用docker容器技术 为了提升系统的安全性 把不同的程序和宿主机进行隔离 使得某个程序 应用的执行不会影响到系统本身 docker技术可以实现程序和宿主机的隔离 容器可以理解成对一系列应用程序、服务和环境的封装 从而把程序运行在一个隔离的 封闭…

在阿里云PAI的DSW上面部署InternLM-XComposer2-VL-1.8B和InternVL2-2B

1.准备开发环境 1.1 阿里交互式建模(DWS) 首先,去阿里云账号注册界面注册好自己的账号然后,开通人工智能平台PAI 如果已经开通,可以进入管理控制台点击,“新建实例”实例名称,根据自己的意愿填写资源配额选择"公共资源组(按量付费)"资源规格"ecs.gn7i-c8g1.2x…

回归预测合集|基于灰狼优化21个机器学习和深度学习的数据回归预测Matlab程序 多特征输入单输出

回归预测合集|基于灰狼优化21个机器学习和深度学习的数据回归预测Matlab程序 多特征输入单输出 文章目录 一、清单二、实验结果三、核心代码四、代码获取五、总结 一、清单 基于灰狼优化BP神经网络的数据预测Matlab程序GWO–BP 基于灰狼优化卷积神经网络的数据预测Matlab程序G…

c++day08

思维导图 栈 #include <iostream>using namespace std;template <typename T> class Stack { private:static const size_t MAX 100; // 定义固定容量T data[MAX]; // 存储栈元素的数组size_t len; // 当前栈的大小public:…

华为玄玑感知系统震撼发布:智能穿戴新品引领情绪健康新纪元

在科技日新月异的今天&#xff0c;华为再次以其卓越的创新能力&#xff0c;为智能穿戴领域带来了一场革命性的变革。 8月28日&#xff0c;华为玄玑感知系统暨穿戴创新技术发布会圆满落幕&#xff0c;会上正式揭晓了这款名为“玄玑”的神秘感知系统&#xff0c;预示着穿戴设备将…

9.26 Buu俩题解

[CISCN2019 华东北赛区]Web2 看wp写完之后写的 知识点 存储型XSS与过滤绕过sql注入 题解 好几个页面&#xff0c;存在登录框可以注册&#xff0c;存在管理员页面(admin.php) ->既然存在管理员页面&#xff0c;且直接访问admin.php提示我们 说明存在身份验证&#xff0…