当前位置: 首页 > news >正文

20250106面试

rabbitmq如何保证消息不丢失

my:

持久化,包括消息持久化和队列持久化,重启不丢失。持久化到磁盘中的。

消息确认

死信队列:消费失败(业务异常/未确认,重试后,会放死信队列),TTL,满了

集群+队列镜像,即使一个节点挂了,其他节点还有数据,不会丢失。

重试

---

在 RabbitMQ 中,确保消息不丢失通常涉及多个层次的配置和实践,主要包括消息持久化、队列持久化、确认机制以及合理的高可用配置。下面是确保消息不丢失的几种常见方法:

1. 消息持久化(Message Durability)

RabbitMQ 默认情况下将消息存储在内存中,这意味着如果 RabbitMQ 守护进程崩溃,消息可能会丢失。为了避免这种情况,你需要将消息持久化到磁盘。

  • 消息持久化:在发送消息时,设置消息的 delivery_mode 属性为 2,表示消息应该被持久化到磁盘。

     

    python

    channel.basic_publish( exchange='', routing_key='queue_name', body='Hello World!', properties=pika.BasicProperties( delivery_mode=2 # 使消息持久化 ) )
  • 队列持久化:即使消息本身被持久化,如果队列本身没有设置持久化,RabbitMQ 在重启时仍然会丢失队列。为了避免这种情况,你需要确保队列本身也是持久化的。

    创建持久化队列的示例(使用 durable=True):

     

    python

    channel.queue_declare(queue='queue_name', durable=True)

    这确保了即使 RabbitMQ 重启,队列也不会丢失。

2. 交换器持久化(Exchange Durability)

为了确保交换器不丢失,在创建交换器时,也需要将其持久化。你可以通过将 durable=True 设置为交换器的属性来确保其持久化:

 

python

channel.exchange_declare(exchange='my_exchange', exchange_type='direct', durable=True)

3. 消费者确认机制(Message Acknowledgement)

消费者需要显式确认消息已经被正确处理,否则消息会被重新投递。如果消费者没有确认消息,而 RabbitMQ 又没有收到 ACK 确认,则消息会在队列中保留,直到消费者处理完并确认。

  • 自动确认:如果 auto_ack 设置为 True,RabbitMQ 会认为消息已经被消费者处理,无论消费者是否处理成功。这会导致消息丢失的风险。

     

    python

    channel.basic_consume(queue='queue_name', on_message_callback=callback, auto_ack=True)

    上面的设置是不安全的,因为它不能保证消息已经被处理。

  • 手动确认:最安全的做法是关闭 auto_ack,并在消费者处理完消息后手动发送 ack 确认消息。

     

    python

    def callback(ch, method, properties, body): print(f"Received message: {body}") ch.basic_ack(delivery_tag=method.delivery_tag) # 手动确认消息

    使用 basic_ack 进行消息确认,确保消息在消费者成功处理后才从队列中移除。

    你还可以设置 basic_nack 来拒绝消息并让它重新入队,避免消息丢失。

4. 未确认消息的处理(Dead Letter Exchange, DLX)

RabbitMQ 支持死信队列(Dead Letter Queue, DLX),即如果某个消息无法被消费者处理,可以将它放到另外一个队列,避免丢失。

配置死信队列(DLX)示例:

 

python

channel.queue_declare(queue='main_queue', durable=True, arguments={ 'x-dead-letter-exchange': 'dlx_exchange' }) channel.queue_declare(queue='dlx_queue', durable=True)

如果消息在主队列中被拒绝或过期,消息将会被送到 dlx_queue 中。

5. 高可用集群(Mirrored Queues)

为了避免单点故障,RabbitMQ 提供了集群和镜像队列(Mirrored Queues)功能,可以将消息复制到多个节点上。即使一个节点发生故障,消息也不会丢失,因为它已经被镜像到其他节点。

  • 镜像队列:镜像队列可以确保消息在多个 RabbitMQ 节点之间保持同步,这样即使一个节点崩溃,其他节点仍然可以提供服务。
 

python

channel.queue_declare(queue='queue_name', durable=True, arguments={ 'x-queue-type': 'quorum' # 使用 Quorum 队列提高消息可靠性 })

quorum 队列比传统的镜像队列提供更高的可靠性,适用于需要高可靠性的场景。

6. 事务机制(Transactional Publisher)

虽然事务机制可以确保消息在提交之前不丢失,但它的性能较低,一般不推荐用于高吞吐量的生产环境。可以通过将消息发布到事务中来确保消息的持久化。

 

python

channel.tx_select() # 开始事务 try: channel.basic_publish(...) channel.tx_commit() # 提交事务 except: channel.tx_rollback() # 回滚事务

7. 消息重试(Message Retry)

如果消费者无法处理消息(比如遇到临时问题),可以使用 消息重试机制(例如通过延时队列)来确保消息最终能够被处理,而不是直接丢失。

RabbitMQ 本身不直接提供消息重试功能,但你可以通过将消息重新发送到队列、设置消息的 x-delayed-message 属性,或者使用死信队列和延时插件来实现消息的重试机制。

总结

在 RabbitMQ 中,要保证消息不丢失,通常需要结合以下几个方面的配置:

  1. 持久化消息:设置消息 delivery_mode=2 使其持久化。
  2. 持久化队列和交换器:确保队列和交换器也都是持久化的。
  3. 消费者确认:确保消费者在处理完消息后发出确认(ack)。
  4. 高可用架构:使用镜像队列和集群来防止单点故障。
  5. 死信队列(DLX)和消息重试:使用死信队列和延时队列来确保消息不会因为暂时的处理失败而丢失。

通过结合这些策略,可以显著降低消息丢失的风险,并提高 RabbitMQ 系统的可靠性。

jvm调优,内存怎么分配,8G内存

在JVM调优过程中,合理分配内存是关键。Java应用的性能往往受到JVM内存分配策略的影响,尤其是当内存资源有限时。对于一个8GB的物理内存系统,如何合理配置JVM内存参数,可以有效避免内存溢出、频繁GC、长时间停顿等问题。

JVM内存的主要区域

JVM内存主要分为以下几个区域,每个区域的大小和管理方式都需要合理配置:

  1. 堆内存(Heap Memory)

    • 负责存储对象实例、数组等动态分配的内存。
    • 年轻代(Young Generation):用于存放新创建的对象。大部分对象在年轻代中迅速死亡,经过垃圾回收后会被清除。
    • 老年代(Old Generation):存放存活较长时间的对象。当年轻代无法容纳更多对象时,存活的对象会被晋升到老年代。
    • 永久代(PermGen) / 元空间(Metaspace):用于存放类的元数据(如类的结构信息)。在JVM 8以后,永久代被元空间取代,元空间使用本地内存而非JVM堆内存。
  2. 非堆内存(Non-Heap Memory)

    • 包括方法区、代码缓存、JVM内部的数据结构等。

8GB内存系统的JVM内存分配方案

对于一个总内存为 8GB 的物理内存系统,我们需要合理地分配给JVM的内存,确保既能提供足够的内存空间,又能避免超出物理内存限制导致的系统负载过高。

通常,8GB内存的机器可以将 JVM堆内存 配置为 4GB-6GB,留出一部分内存给操作系统和其他进程。以下是一个常见的配置方案:

JVM内存调优示例(假设使用8GB内存的机器)

  1. 最大堆内存

    • 设置最大堆内存为4GB。
     

    bash

    -Xmx4g
  2. 初始堆内存

    • 设置初始堆内存为2GB。这有助于提高程序启动时的性能,但过大的初始堆可能会浪费内存。
     

    bash

    -Xms2g
  3. 年轻代内存设置

    • 年轻代内存大小可以通过 -Xmn 参数设置,建议设置为堆内存的 1/3 左右,具体可以根据应用的实际需求调整。例如,将年轻代大小设置为1GB:
     

    bash

    -Xmn1g
  4. 老年代内存设置

    • 老年代内存的大小是通过调整堆的总大小和年轻代的大小来间接控制的。通常,老年代内存占堆的剩余部分。例如,设置最大堆内存为4GB,年轻代为1GB,那么老年代将是3GB。
  5. PermGen / Metaspace 设置(JVM 8之后使用Metaspace):

    • 如果使用JVM 8及以上版本,PermGen 已被 Metaspace 取代。Metaspace 的默认大小是动态增长的,但我们可以通过以下参数调整其大小:
     

    bash

    -XX:MaxMetaspaceSize=256m -XX:MetaspaceSize=128m
  6. 垃圾回收器选择

    • 如果需要优化垃圾回收的性能,可以根据应用的需求选择不同的垃圾回收器。例如,使用 G1 GC 或 CMS 来减少停顿时间。
    • 启用 G1 GC:
     

    bash

    -XX:+UseG1GC

其他相关JVM内存配置

  • 线程栈大小:每个线程会消耗一定的内存,用于保存栈帧。可以通过 -Xss 来调整每个线程的栈大小。默认值通常为1MB,对于线程较多的应用,可以适当调低栈大小以节省内存。

     

    bash

    -Xss512k
  • GC日志输出:调优过程中,查看GC日志能帮助我们分析和优化内存使用。可以通过以下参数输出GC日志:

     

    bash

    -Xlog:gc*:file=gc.log

具体的调优案例

假设我们有一台具有8GB内存的服务器,并且应用程序需要稳定的响应时间和低延迟。我们可以使用以下JVM参数进行调优:

 

bash

java -Xms2g -Xmx4g -Xmn1g -XX:+UseG1GC -XX:MaxMetaspaceSize=256m -XX:MetaspaceSize=128m -Xss512k -Xlog:gc*:file=gc.log -jar myapp.jar

这个配置做了以下优化:

  • 设置初始堆内存为2GB,最大堆内存为4GB,年轻代为1GB,确保有足够的内存空间。
  • 使用 G1 GC 来优化垃圾回收性能,避免长时间的Stop-the-World停顿。
  • 设置 Metaspace 内存限制,避免类加载和卸载时占用过多内存。
  • 限制每个线程的栈大小为512KB,减少线程栈内存占用。

调优原则

  1. 尽量保证堆内存不超出物理内存的一半:如果堆内存过大,会导致频繁的GC,或者直接导致 OutOfMemoryError。理想的堆内存配置是物理内存的50%-75%。
  2. 考虑操作系统和其他进程的内存占用:不要将JVM的内存配置得过大,否则操作系统和其他应用会受到影响。
  3. 选择合适的垃圾回收器:对于大部分高性能应用,G1 GC 是推荐的选择,它提供了较为平衡的延迟和吞吐量。对于低延迟要求的应用,也可以考虑 ZGC 或 Shenandoah
  4. 监控和分析:定期通过 GC 日志或其他性能监控工具(如 VisualVM 或 JConsole)来观察内存的使用情况,并根据实际运行情况进行调整。

总结

在8GB内存的机器上为JVM分配内存时,建议将堆内存设置为2GB-4GB,具体的配置需要根据应用的需求进行调整。合理设置年轻代、老年代、PermGen(或Metaspace)等内存区域的大小,选择适合的垃圾回收器,并优化线程栈大小,可以有效提升Java应用的性能并减少内存问题。

分布式事务解决方案:

比如在一个方法中涉及:订单 商品 库存

mq

补偿兜底

job补偿:分别查询订单,商品,库存,根据订单号,对比哪个缺了

Eureka原理

redis事务

垃圾回收:标记清理

redis clustomer节点挂了,如何防止数据丢失

设置过期时间大于,主从同步间隔时间,缩短这个时间

redis不设置从节点

相关文章:

20250106面试

rabbitmq如何保证消息不丢失 my: 持久化,包括消息持久化和队列持久化,重启不丢失。持久化到磁盘中的。 消息确认 死信队列:消费失败(业务异常/未确认,重试后,会放死信队列)&…...

Java 分布式锁:Redisson、Zookeeper、Spring 提供的 Redis 分布式锁封装详解

📚 Java 分布式锁:Redisson、Zookeeper、Spring 提供的 Redis 分布式锁封装详解 在分布式系统中,分布式锁 用于解决多个服务实例同时访问共享资源时的 数据一致性 问题。Java 生态中,有多种成熟的框架可以实现分布式锁&#xff0…...

智能汽车的数字钥匙安全

数字钥匙作为汽车智能化变革下的一项创新技术,利用蓝牙定位、NFC等近场通信技术进行钥匙与汽车的匹配继而开锁,可以让车主通过智能手机、可穿戴设备等解锁汽车,并对汽车实施相关的操作,提升用车便利性,受到越来越多车企…...

YangQG 面试题汇总

一、交叉链表 问题: 给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。 解题思想: 双指针 备注:不是快慢指针,如果两个长度相…...

急速了解什么是GPU服务器

GPU服务器是一种专门配置了高性能图形处理器(GPU)的服务器,旨在提供高性能计算、深度学习、科学计算等多种场景的计算服务。与传统的CPU服务器相比,GPU服务器在处理并行密集型计算任务时具有显著优势。本文将详细介绍GPU服务器的定…...

用 Python 绘制可爱的招财猫

✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连✨ ​​​​​ ​​​​​​​​​ ​​​​ 招财猫,也被称为“幸运猫”,是一种象征财富和好运的吉祥物,经常…...

Linux 获取文本部分内容

Linux获取文本部分内容 前言场景获取前几行内容获取末尾几行内容获取中间内容head 命令 tail 命令 结合sed 命令awk 命令 前言 test.log 文本内容如下: (注意:内容 a1004和a1005之间有一空行) [rootgaussdb002 tmp]# cat test.…...

01-51单片机LED与独立按键

一、单片机概述 注意:个人学习笔记,里面涉及到的C语言和进程转换相关的知识在C语言部分已经写了,这里是默认都会的状态学习单片机。 1.什么是单片机 单片机,英文Micro Controller Unit,简称MCU。其内部集成了CPU、R…...

【微服务】SpringBoot 整合Redis实现延时任务处理使用详解

目录 一、前言 二、延迟任务的高频使用场景 三、延迟任务常用解决方案 3.1 Quartz 3.2 DelayQueue 3.2.1 Timer + TimerTask 3.2.2 ScheduledExecutorService 3.3 Redis sorted set 3.4 RabbitMQ 四、Redis实现延时队列操作实战 4.1 Redis Sorted Set 概述 4.1.1 Re…...

【Java项目】基于SpringBoot的【校园交友系统】

【Java项目】基于SpringBoot的【校园交友系统】 技术简介:系统软件架构选择B/S模式、SpringBoot框架、java技术和MySQL数据库等,总体功能模块运用自顶向下的分层思想。 系统简介:系统主要包括管理员和用户。 (a) 管理员的功能主要有首页、个人…...

Elasticsearch学习(1) : 简介、索引库操作、文档操作、RestAPI、RestClient操作

目录 1.elasticsearch简介1.1.了解es1.2.倒排索引正向索引和倒排索引 1.3.es的一些概念:文档和字段;索引和映射;Mysql与ES1.4.安装es、kibana部署单点es部署kibanaIK分词器安装IK分词器与测试扩展与停用词词典总结 部署es集群 2.索引库操作2.1.mapping映…...

ls指令详讲

🏝️专栏:https://blog.csdn.net/2301_81831423/category_12872319.html 🌅主页:猫咪-9527-CSDN博客 “欲穷千里目,更上一层楼。会当凌绝顶,一览众山小。” 目录 基本语法 常用选项详解 1. 基本选项 …...

【前端】【CSS3】基础入门知识

目录 如何学习CSS 1.1什么是CSS​编辑 1.2发展史 1.三种导入方式 1.1、行内样式 1.2、外部样式 1.3、嵌入方式 2.选择器 2.1、基本选择器 (1)元素选择器 (2)类选择器 (3)id选择器:必…...

计算机网络之---RIP协议

RIP协议的作用 RIP (Routing Information Protocol) 协议是一个基于距离矢量的路由协议,它在网络中用来动态地交换路由信息。RIP 是最早的路由协议之一,通常用于小型和中型网络中。它的工作原理简单,易于实现,但在一些大型网络中效…...

【LeetCode Hot100 贪心算法】 买卖股票的最佳时机、跳跃游戏、划分字母区间

贪心算法 买卖股票的最佳时机买卖股票的最佳时机II跳跃游戏跳跃游戏II划分字母区间 买卖股票的最佳时机 给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的…...

互联网架构变迁:从 TCP/IP “呼叫” 到 NDN “内容分发” 的逐浪之旅

本文将给出关于互联网架构演进的一个不同视角。回顾一下互联网的核心理论基础产生的背景: 左边是典型的集中控制通信网络,很容易被摧毁,而右边的网络则没有单点问题,换句话说它很难被全部摧毁,与此同时,分…...

git相关操作笔记

git相关操作笔记 1. git init git init 是一个 Git 命令,用于初始化一个新的 Git 仓库。执行该命令后,Git 会在当前目录创建一个 .git 子目录,这是 Git 用来存储所有版本控制信息的地方。 使用方法如下: (1&#xff…...

jenkins 使用 ssh-agent向windows进行部署

背景: jenkins在linux的docker环境内,应用服务部署在windows。需要使用jenkins实现自动化部署。 实现方式: jenkins上构建pipeline任务,脚本如下: 遇到问题: 1、问题:jenkins 调用部署bat脚…...

MySQL入门学习笔记

第一章 数据库系统概述 数据库的4个基本概念 数据、数据库、数据库管理系统、数据库系统是与数据库技术密切相关的4个基本概念 数据 数据是数据库中存储的基本对象,描述事物的符号记录称为数据,数据的表现形式还不能完全表达其内容,需要…...

机器学习全流程解析:数据导入到服务上线全阶段介绍

目录 1. 数据导入 2. 数据预处理 3. 超参数搜索与优化 4. 模型训练 5. 模型评估 6. 模型压缩与优化 7. 模型注册与版本管理 8. 服务上线与部署 总结 1. 数据导入 数据源:数据库、文件系统、API等。数据格式:CSV、JSON、SQL 数据库表、Parquet …...

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造,完美适配AGV和无人叉车。同时,集成以太网与语音合成技术,为各类高级系统(如MES、调度系统、库位管理、立库等)提供高效便捷的语音交互体验。 L…...

2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面

代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口(适配服务端返回 Token) export const login async (code, avatar) > {const res await http…...

在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用

1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...

浪潮交换机配置track检测实现高速公路收费网络主备切换NQA

浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求,本次涉及的主要是收费汇聚交换机的配置,浪潮网络设备在高速项目很少,通…...

Java毕业设计:WML信息查询与后端信息发布系统开发

JAVAWML信息查询与后端信息发布系统实现 一、系统概述 本系统基于Java和WML(无线标记语言)技术开发,实现了移动设备上的信息查询与后端信息发布功能。系统采用B/S架构,服务器端使用Java Servlet处理请求,数据库采用MySQL存储信息&#xff0…...

排序算法总结(C++)

目录 一、稳定性二、排序算法选择、冒泡、插入排序归并排序随机快速排序堆排序基数排序计数排序 三、总结 一、稳定性 排序算法的稳定性是指:同样大小的样本 **(同样大小的数据)**在排序之后不会改变原始的相对次序。 稳定性对基础类型对象…...

比较数据迁移后MySQL数据库和OceanBase数据仓库中的表

设计一个MySQL数据库和OceanBase数据仓库的表数据比较的详细程序流程,两张表是相同的结构,都有整型主键id字段,需要每次从数据库分批取得2000条数据,用于比较,比较操作的同时可以再取2000条数据,等上一次比较完成之后,开始比较,直到比较完所有的数据。比较操作需要比较…...

从“安全密码”到测试体系:Gitee Test 赋能关键领域软件质量保障

关键领域软件测试的"安全密码":Gitee Test如何破解行业痛点 在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的"神经中枢"。从国防军工到能源电力,从金融交易到交通管控,这些关乎国计民生的关键领域…...

Ubuntu系统多网卡多相机IP设置方法

目录 1、硬件情况 2、如何设置网卡和相机IP 2.1 万兆网卡连接交换机,交换机再连相机 2.1.1 网卡设置 2.1.2 相机设置 2.3 万兆网卡直连相机 1、硬件情况 2个网卡n个相机 电脑系统信息,系统版本:Ubuntu22.04.5 LTS;内核版本…...

LLaMA-Factory 微调 Qwen2-VL 进行人脸情感识别(二)

在上一篇文章中,我们详细介绍了如何使用LLaMA-Factory框架对Qwen2-VL大模型进行微调,以实现人脸情感识别的功能。本篇文章将聚焦于微调完成后,如何调用这个模型进行人脸情感识别的具体代码实现,包括详细的步骤和注释。 模型调用步骤 环境准备:确保安装了必要的Python库。…...