【RabbitMQ——具体使用场景】

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. 下单、订单分发、抢票

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

排水系统C++

题目&#xff1a; 样例解释&#xff1a; 1 号结点是接收口&#xff0c;4,5 号结点没有排出管道&#xff0c;因此是最终排水口。 1 吨污水流入 1 号结点后&#xff0c;均等地流向 2,3,5 号结点&#xff0c;三个结点各流入 1/3 吨污水。 2 号结点流入的 1/3​ 吨污水将均等地流向…

nginx打包部署前端vue项目全过程【保姆级教程】

&#x1f939;‍♀️潜意识起点&#xff1a;个人主页 &#x1f399;座右铭&#xff1a;得之坦然&#xff0c;失之淡然。 &#x1f48e;擅长领域&#xff1a;前端 是的&#xff0c;我需要您的&#xff1a; &#x1f9e1;点赞❤️关注&#x1f499;收藏&#x1f49b; 是我持…

【JavaScript】Bit:组件驱动开发的新时代

Bit 是一个现代化的开发工具&#xff0c;帮助开发者通过组件驱动的方式进行软件开发和协作。它旨在解决开发大型系统时的常见挑战&#xff0c;如组件的复用性、独立性和协作性问题。通过 Bit&#xff0c;开发团队可以更加轻松地共享、管理和维护可复用的代码组件&#xff0c;同…

初识算法 · 双指针(2)

目录 前言&#xff1a; 盛最多水的容器 题目解析&#xff1a; 算法原理&#xff1a; 算法编写&#xff1a; 有效三角形的个数 题目解析&#xff1a; 算法原理&#xff1a; 算法编写&#xff1a; 前言&#xff1a; 本文介绍两个题目&#xff0c;盛最多水的容器和有效三…

Jenkins: fontconfig head is null, check your fonts or fonts configuration;

​ 在部署jenkins第一次启动时遇到如下报错&#xff1a; 一大串报错&#xff0c;看的让人脑瓜疼。。。静静地分析一下日志&#xff0c;发现第一行报错信息&#xff1a; fontconfig head is null, check your fonts or fonts configuration。 这是个什么鬼&#xff0c;我也不…

师生健康信息管理:SpringBoot技术突破

第4章 系统设计 4.1 系统体系结构 师生健康信息管理系统的结构图4-1所示&#xff1a; 图4-1 系统结构 登录系统结构图&#xff0c;如图4-2所示&#xff1a; 图4-2 登录结构图 师生健康信息管理系统结构图&#xff0c;如图4-3所示。 图4-3 师生健康信息管理系统结构图 4.2…

linux文件编程_文件

1. 文件编程概述 之前在windows中对文件的操作是&#xff1a;打开文档—>编辑文档—>保存文档—>关闭文档 我们的Linux文件编程主要是利用代码对文件进行操作&#xff1a;文件创建、打开、编辑等自动化执行等 在Linux我们要使用编程调用api函数的方式进行文档的编辑…

数据结构-链表笔记

移除节点 203. 移除链表元素 - 力扣&#xff08;LeetCode&#xff09; /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* ListNode(int val) { this.val val; }* ListNode(int val, ListN…

C++杂项

作业&#xff1a; 将之前实现的顺序表、栈、队列都更改成模板类 顺序表 #include <iostream>using namespace std;template<typename T>class SeqList { private:T *ptr;int size; //总长度int len 0; //当前顺序表实际长度public://初始…

Vue3.X + SpringBoot小程序 | AI大模型项目 | 饮食陪伴官

gitee平台源码 github平台源码 饮食陪伴师是一个管理饮食的原生大模型小程序&#xff0c;优势&#xff1a; 精确营养监控&#xff1a;用户记录饮食后&#xff0c;我们会计算出食用的营养成分与分量&#xff0c;并反馈给用户。饮食建议有效&#xff1a;大模型经过我们训练具备大…

中建材信云智联项目总监张瑞洲受邀为第四届中国项目经理大会演讲嘉宾

全国项目经理专业人士年度盛会 中建材信云智联科技有限公司数字化事业部项目总监张瑞洲先生受邀为PMO评论主办的全国项目经理专业人士年度盛会——2024第四届中国项目经理大会演讲嘉宾&#xff0c;演讲议题为“电厂智能安全管控项目范围管理实践分享”。大会将于10月26-27日在北…

工具介绍---效率高+实用

Visual Studio Code (VS Code) 功能特点&#xff1a; 智能代码提示&#xff1a;内置的智能代码提示功能可以自动完成函数、变量等的输入&#xff0c;提高代码编写速度。插件丰富&#xff1a;支持成千上万的扩展插件&#xff0c;例如代码片段、主题、Linting等&#xff0c;能够…

67.【C语言】枚举类型

1.定义 对于有限的情况,一一列举 如一周有7天,从周一到周日;光学三原色(Red Green Blue) 2.格式 enum 枚举类型名 {//枚举常量 }; 备注:enum为enumeration缩写 3.枚举成员变量的值 #include <stdio.h> enum color {Red,Green,Blue };int main() {printf("%d…

alpine安装docker踩坑记

文章目录 前言错误场景正确操作最后 前言 你好&#xff0c;我是醉墨居士&#xff0c;最近使用alpine操作系统上docker遇到了一些错误&#xff0c;尝试解决之后就准备输出一篇博客&#xff0c;帮助有需要的后人能够少踩坑&#xff0c;因为淋过雨所以想给别人撑伞 错误场景 我…

基于Hive和Hadoop的电信流量分析系统

本项目是一个基于大数据技术的电信流量分析系统&#xff0c;旨在为用户提供全面的通信数据和深入的流量使用分析。系统采用 Hadoop 平台进行大规模数据存储和处理&#xff0c;利用 MapReduce 进行数据分析和处理&#xff0c;通过 Sqoop 实现数据的导入导出&#xff0c;以 Spark…

Excel实现省-市-区/县级联

数据准备 准备省份-城市映射数据&#xff0c;如下&#xff1a; 新建sheet页&#xff0c;命名为&#xff1a;省-市数据源&#xff0c;然后准备数据&#xff0c;如下所示&#xff1a; 准备城市-区|县映射数据&#xff0c;如下&#xff1a; 新建sheet页&#xff0c;命名为&#x…

遗传算法与深度学习实战(15)——差分进化详解与实现

遗传算法与深度学习实战&#xff08;15&#xff09;——差分进化详解与实现 0. 前言1. 差分进化1.1 基本原理1.2 差分进化基本流程 2. 使用差分进化逼近复杂和不连续函数小结系列链接 0. 前言 深度学习 (Deep learning, DL) 系统通常可以被简单的视为凸函数逼近器&#xff0c;…

[Linux]从零开始的网站搭建教程

一、谁适合本次教程 学习Linux已经有一阵子了&#xff0c;相信大家对LInux都有一定的认识。本次教程会教大家如何在Linux中搭建一个自己的网站并且实现内网访问。这里我们会演示在Windows中和在Linux中如何搭建自己的网站。当然&#xff0c;如果你没有Linux的基础&#xff0c;这…

python画图|自制渐变柱状图

在前述学习过程中&#xff0c;我们已经通过官网学习了如何绘制渐变的柱状图及其背景。 掌握一门技能的最佳检验方式就是通过实战&#xff0c;因此&#xff0c;本文尝试做一些渐变设计。 前述学习记录可查看链接&#xff1a; Python画图|渐变背景-CSDN博客 【1】柱状图渐变 …

ArcGIS共享数据的最佳方法(不丢可视化、标注等各类显示信息一样带)

今天我们介绍一下ArcGIS数据共享的几个小妙招 我们时常要把数据发给对方&#xff0c;特别是很多新手朋友要将shp发给对方时只是发送了shp后缀的文件&#xff0c;却把shp的必要组成文件dbf、shx等等给落下了。 还有很多朋友给图层做好了符号化标注&#xff0c;但是数据一发给别…