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

java八股文-消息队列

一、MQ基础篇

1. 什么是消息队列?

消息队列(MQ)是分布式系统中实现异步通信的中间件,解耦生产者和消费者。 

2. 使用场景有哪些?

  • 异步处理(如注册后发送邮件)
  • 系统解耦(不同服务通过MQ通信)
  • 流量削峰(应对突发流量)
  • 日志收集(如Kafka处理日志流)

3.消息队列的优缺点?

优点:解耦、异步、削峰、扩展性。
缺点:系统复杂度增加、消息一致性问题、运维成本高。 

4. BrokerProducerConsumerTopicPartition 分别是什么?

  •  Broker:消息队列服务器,负责接收、存储和转发消息。
  • Producer:消息生产者,负责创建并发送消息到Broker。
  • Consumer:消息消费者,从Broker订阅并拉取消息进行处理。
  • Topic:消息的逻辑分类单元(类似“频道”),Producer发送到指定Topic,Consumer订阅该Topic。
  • Partition:Topic的物理分片,每个Partition独立存储和有序,实现并行处理与扩展。

 二、主流MQ对比

1.Kafka vs RocketMQ vs RabbitMQ 区别?

特性KafkaRocketMQRabbitMQ
设计目标高吞吐、日志处理金融级可靠性企业级消息路由
吞吐量最高(百万级/秒)高(十万级/秒)中等(万级/秒)
消息顺序分区有序全局有序队列有序
事务消息不支持支持不支持
延迟消息不支持支持插件支持

2. 选型总结

  • Kafka 适用于高吞吐量、流式数据处理的场景。
  • RabbitMQ 适用于任务调度、企业级消息通信和复杂的消息路由。
  • RocketMQ 适用于电商、金融等高可用、高吞吐量的分布式系统。

3.Kafka 为什么不适合金融级业务?

1. 消息顺序性与事务一致性

  • 事务一致性:Kafka 本身并不直接支持分布式事务。在金融级业务中,通常需要确保多个消息处理的原子性和一致性(例如支付系统中的事务处理)。虽然 Kafka 支持消息的 "Exactly Once" 语义,但这通常需要额外的设计与配置,且依赖于外部的事务管理机制。

  • 消息顺序性:Kafka 在保证分区内的顺序消费方面表现较好,但如果需要跨多个分区处理消息的顺序性,Kafka 就不具备天然的支持。在一些金融系统中,特别是在需要严格的消息顺序保证的情况下,Kafka 可能无法完全满足需求。

2. 消息丢失与确认机制

  • 消息丢失风险:Kafka 的设计目标是高吞吐量,并通过日志存储来确保消息的持久化。然而,在极端情况下,如果系统出现故障,消息丢失的风险仍然存在。虽然 Kafka 提供了副本机制和持久化保证,但对于金融业务来说,尤其是在涉及资金流转等关键业务时,任何消息丢失都可能带来严重的后果。

  • 确认机制:Kafka 在消费端的确认机制(consumer ack)相对简单,依赖于 offset 管理。如果消费者没有正确地处理消息(如没有及时提交 offset),可能会导致重复消费或丢失消息,这在金融系统中是不可接受的。

3. 强一致性保证

  • 最终一致性:Kafka 的设计更多关注“最终一致性”而非强一致性。虽然 Kafka 可以保证高可用性,但它的设计并不适合要求强一致性的场景,尤其是在金融系统中,往往需要保证多个操作(如转账、支付)在同一时间点的一致性,而 Kafka 的最终一致性模型可能无法满足这类需求。

  • 数据延迟问题:在一些高频交易或实时结算的金融应用中,Kafka 的消息传递和处理延迟可能不符合严格的实时性要求,尤其是在高负载情况下。

4. 复杂的消息路由与支持

  • 路由机制的复杂性:Kafka 的消息发布/订阅模型相对简单,没有像 RabbitMQ 那样复杂的交换机、路由键和队列绑定机制。金融业务中,可能需要更细粒度的消息路由和控制,而 Kafka 在这方面的灵活性不如 RabbitMQ。

5. 缺乏完整的事务性支持

  • Kafka 本身并不内置对“事务性”的完整支持。在一些金融系统中,可能会有跨多个消息队列或不同业务组件的事务处理需求,确保所有操作要么全成功,要么全失败。虽然 Kafka 最近版本支持了事务性消息,但是它并没有像传统的数据库管理系统那样强大的事务支持,因此在一些严格的金融业务中可能无法完全满足需求。

总结:

Kafka 的高吞吐量和分布式特性使其在大数据流处理和实时日志分析等场景中非常出色,但它在处理金融级业务时可能存在一些问题,特别是与消息的强一致性、事务管理、可靠性和精确的顺序消费等方面的要求不完全匹配。在金融级别的应用中,通常更偏向于使用如 RabbitMQRocketMQ 这样的系统,它们提供更高的可靠性保证、更灵活的事务支持和更强的消息保障机

4. RocketMQ 的 消息存储结构?(CommitLog+ConsumeQueue)

1. CommitLog

  • 作用:CommitLog 是 RocketMQ 存储所有消息的主要日志文件,类似于 Kafka 的日志存储。所有消息都首先被写入 CommitLog,然后再根据需要将其消费到 ConsumeQueueIndex(可选)中。CommitLog 是消息持久化的核心组件,保证了消息的顺序和高吞吐量。

  • 特点

    • 顺序存储:CommitLog 中的消息是按顺序存储的,采用 append-only 的方式。这意味着新消息总是附加到文件的末尾,而不是插入到文件的中间,这样可以最大化磁盘的写入效率。
    • 文件分段:CommitLog 文件以固定大小(如 1GB 或 2GB)的日志文件进行切分。当文件达到指定大小时,会创建一个新的文件来存储后续的消息。
    • 消息格式:每条消息在 CommitLog 中都有一个固定的格式,包括消息的物理偏移量、消息体、消息属性等。

2. ConsumeQueue

  • 作用:ConsumeQueue 是用于高效消费消息的辅助结构,它将 CommitLog 中的消息按照消费者的消费需求进行组织。ConsumeQueue 是一种索引结构,存储每条消息在 CommitLog 中的位置(即偏移量),并为每个消费者队列提供消息消费的入口。

  • 特点

    • 索引结构:ConsumeQueue 中存储的是 CommitLog 中消息的物理偏移量和消息的相关信息(如消息大小、消息标识等)。消费者可以通过 ConsumeQueue 查找消息的位置,而不需要扫描整个 CommitLog 文件。
    • 高效消费:ConsumeQueue 帮助消费者快速定位消息,避免了对 CommitLog 的全局扫描,提高了消费效率。每个 Consumer Group 都有独立的 ConsumeQueue,用于追踪该 Consumer Group 对应的消息消费进度。
    • 固定长度:每条消息在 ConsumeQueue 中占用固定的空间(如 20 字节),存储 CommitLog 偏移量和其他元数据。这个结构使得 ConsumeQueue 可以非常快速地处理大量的消息。

 

 

 

三、消息队列设计原理 

1. 消息如何存储?(以Kafka为例)

  • 消息按Topic分区存储,每个分区是一个有序的日志文件(Segment)。
  • 通过顺序写入磁盘 + 零拷贝技术提升性能。

2. 推(Push)模式 vs 拉(Pull)模式? 

推模式(如RabbitMQ):服务端主动推消息,实时性高,但可能造成消费者压力。
拉模式(如Kafka):消费者主动拉取,可控性强,但可能有延迟。

四、消息可靠性

1. 如何保证消息不丢失?

  • 生产者:开启确认机制(如Kafka的ACK=all,RocketMQ的事务消息)。
  • Broker:消息持久化(磁盘存储)+ 多副本同步。
  • 消费者:手动提交Offset(避免自动提交导致丢失)。

2. 如何保证消息幂等性?

  • 生产者幂等:唯一ID(如RocketMQ的Message ID)。
  • 消费者幂等:数据库唯一键、Redis去重、乐观锁。

3. 消息发送失败后的 重试机制 如何设计?

 

在消息队列系统中,设计一个可靠的消息发送失败后的重试机制是确保消息最终能够被正确消费的关键。对于 RocketMQ 等消息队列系统,重试机制的设计涉及多个层面,包括如何检测消息发送失败、如何管理重试次数、如何防止消息的无限重试以及如何保证消息的幂等性。以下是一个设计消息发送失败后的重试机制的思路:

1. 失败检测机制

  • 网络问题:发送消息时,如果由于网络问题、服务不可用等原因导致消息无法被成功发送,首先需要进行重试。
  • 消息发送返回的状态码:在发送消息时,如果返回的是发送失败的状态码(例如 RocketMQ 的 SEND_FAILED 状态),需要执行重试操作。
  • 消息发送超时:如果消息发送过程中发生超时(如超出 Broker 规定的时间范围),也应该视为发送失败,并触发重试。

2. 重试策略

为了避免消息发送失败后无限重试,可以采用以下几种常见的重试策略:

a. 固定间隔重试

在这种策略下,消息发送失败后,系统会按照固定的时间间隔进行重试,直到达到最大重试次数。比如,可以设置每次重试的间隔为 1 秒、5 秒等。

  • 优点:实现简单,容易控制重试次数和间隔。
  • 缺点:固定间隔可能无法适应某些场景,例如网络拥堵或者服务负载过高时,固定间隔可能无法有效减轻压力。

b. 指数退避重试(Exponential Backoff)

指数退避是常见的重试策略。它在每次失败后会逐渐增加重试的时间间隔。例如,第一次重试等待 1 秒,第二次重试等待 2 秒,第三次重试等待 4 秒,依此类推。

  • 优点:通过渐增的时间间隔避免短时间内的过度重试,可以有效减轻系统负担,避免突发流量导致系统崩溃。
  • 缺点:需要设置合理的最大等待时间,避免重试等待时间过长。

c. 抖动(Jitter)

在重试过程中加入抖动,防止多个失败的客户端在同一时刻发起重试,造成集中请求。这通常与指数退避结合使用,使得每次重试的间隔随机化。

  • 优点:有效避免多客户端重试冲突,减轻负载。
  • 缺点:可能稍微增加系统的复杂性。

3. 最大重试次数

为了防止消息进入死循环,应该设置最大重试次数。超过最大重试次数后,消息应当被认为是“不可恢复”的,系统应当采取其他措施,如:

  • 死信队列:当消息经过最大重试次数后,可以将其转移到一个死信队列(Dead Letter Queue, DLQ),供人工检查或后续处理。
  • 报警机制:当消息达到最大重试次数并进入死信队列时,系统应当触发报警,通知相关人员进行问题排查。

4. 幂等性保障

在重试过程中,确保消息的幂等性非常重要。如果消息已经处理过,但由于网络故障等原因导致消息发送失败并被重试,重试时会导致重复消费。因此,在设计时要确保消息处理的幂等性。

  • 幂等操作:在消费端设计幂等操作,确保多次消费相同消息不会产生不同的结果。
  • 去重机制:可以在消息中加入唯一标识(如消息 ID、事务 ID 等),并在消费端维护去重记录,确保重复消息不会被再次消费。

5. 延迟队列机制

除了直接进行重试外,延迟队列也可以作为一种有效的补充机制。

  • 失败的消息可以被放入一个延迟队列中,经过一定的时间后再进行重新尝试。这种方法能够有效避免大量并发重试。
  • 通过设置延迟时间,可以让重试的消息“错开”其他消息的重试时机,从而避免集中重试的压力。

6. 多重备份机制

如果使用的是分布式消息队列(如 RocketMQ),可以采用消息备份机制。在某个 Broker 宕机或消息发送失败时,系统可以将消息备份到其他节点进行重新发送,从而增加消息的可靠性。

7. 全局重试管理

对于大规模分布式系统,通常会有一个全局的重试管理系统来控制所有消息的重试策略。这个系统会监控所有发送失败的消息,自动进行调度和重试,防止消息处理时出现瓶颈。

8. 日志与监控

  • 日志记录:每次消息发送失败、重试成功或者失败,系统都应该记录相关日志。通过日志,开发人员可以了解消息重试的情况,并进一步调优系统。
  • 监控与告警:系统需要对重试情况进行监控,设定阈值,当重试次数过多时触发报警,便于及时响应。

9. RocketMQ 中的重试机制

RocketMQ 本身也提供了一些内建的重试机制:

  • Producer 端的重试:在消息发送失败时,Producer 会根据配置的重试次数进行重试。可通过 retryTimesWhenSendFailed 配置来设置最大重试次数。
  • Consumer 端的重试:如果消费失败,RocketMQ 会将消息放回到消息队列,直到消息成功消费或者达到最大重试次数。

总结

设计一个消息发送失败后的重试机制时,关键是要确保以下几点:

  • 避免无限重试:通过最大重试次数或死信队列来避免。
  • 幂等性保障:保证即使消息被多次发送,系统的状态也不会受到不良影响。
  • 优化重试策略:采用指数退避、抖动等策略来减少系统的压力。
  • 监控与报警:对失败重试进行实时监控,及时处理异常情况。

4. 消费者宕机时,如何保证消息不丢失?(手动ACK+消费状态持久化)

  • 确保消息在队列中持久化,直到被消费者成功消费。
  • 使用重试机制、延迟队列和死信队列处理消费者宕机后的消息恢复。
  • 设计幂等性消费逻辑,避免重复消费导致的问题。
  • 通过消费者的高可用性和偏移量机制,确保消费者能够从断点恢复消费。

 

 五、消息顺序性

1. 如何保证消息顺序消费?

  • 全局有序:单分区/队列(牺牲并发)。
  • 分区有序:同一业务Key哈希到同一分区(如订单ID),消费者单线程处理该分区。

六、消息积压 & 延迟 

1. 消息积压如何处理?

  • 临时扩容:增加消费者实例或分区数。
  • 异步处理:降级非核心业务,批量消费。
  • 修复消费者:排查消费端性能问题。

2. 如何实现延迟消息?

  • RabbitMQ:通过死信队列(DLX)+ TTL实现。
  • RocketMQ:内置延迟级别(18种预设时间)。
  • Kafka:需自行实现时间轮或外部存储。

七、高可用 & 高性能 

1. Kafka的高可用设计?

  • 分区副本机制:每个分区有多个副本,Leader负责读写,Follower同步数据。
  • ISR机制:仅同步副本(In-Sync Replicas)参与选举,保障一致性。

2. 如何提升MQ性能?

  • 批量发送/压缩:减少网络IO。
  • 异步刷盘:Broker异步持久化消息。
  • 分片存储:水平扩展Topic分区数。

八、高频场景题

 

1.如何设计一个消息队列?

  • 核心组件:Producer、Broker(存储+路由)、Consumer。
  • 关键问题:网络协议、存储设计、高可用、消息可靠性。

2. MQ如何实现分布式事务?

  • 本地消息表:业务DB记录消息状态,定时任务补偿。
  • RocketMQ事务消息:两阶段提交(Half消息 + 回调检查)。

3. 订单超时未支付如何用延迟消息实现?

3.1. 设计需求分析

  • 场景:用户在一定时间内未完成支付,系统需要自动关闭订单。
  • 延迟时间:订单创建时设置一个超时时间(如 30 分钟),当超过该时间后,系统自动处理未支付的订单。
  • 处理操作:超时未支付的订单会被标记为“已超时”或直接关闭。

3.2. 延迟消息的基本原理

延迟消息是指将消息发送到消息队列后,系统会延迟一段时间才消费该消息。通常可以通过两种方式实现:

  • 定时消息:通过消息队列的延迟机制(如 Kafka、RocketMQ、RabbitMQ 等支持的定时消息功能)。
  • 延迟队列:通过将消息存放到一个专门的延迟队列中,等待指定的时间后再进行消费。

3.3. 使用延迟消息实现订单超时未支付

3.3.1: 定义延迟消息内容

每个订单都会发送一条延迟消息,这条消息包含:

  • 订单 ID:标识该订单。
  • 订单超时时间:订单创建时间 + 超时时长(例如 30 分钟后)。
  • 处理逻辑:如果超时未支付,进行相关处理(如关闭订单)。

3.3.2: 发送延迟消息

通过消息队列发送一条延迟消息,设置消息的延迟时间为订单超时的时长。

  • RocketMQ: RocketMQ 支持消息延迟,消息生产者可以通过设置 delayTimeLevel 来实现延迟。

    例如,设置消息延迟 30 分钟:

    Message msg = new Message("OrderTopic", "order_timeout_tag", "orderID", orderMessage.getBytes()); msg.setDelayTimeLevel(3); // 3代表30分钟后发送 producer.send(msg);

3.3.3: 消费延迟消息

消费者在延迟时间到达后,会消费这条消息。消费时需要检查该订单是否已经支付。

  • 如果订单支付成功,则消息被忽略,不做任何处理。
  • 如果订单仍未支付,则执行超时处理逻辑,例如关闭订单、发送通知等。

3.3.4: 超时处理

在消费延迟消息时,如果订单没有支付,系统可以执行以下操作:

  • 关闭订单:标记订单为超时关闭。
  • 发送提醒:提醒用户支付失败或订单已经超时。
  • 退回库存:如果订单超时,可能需要将商品库存恢复。
public void handleOrderTimeout(String orderId) { Order order = orderService.getOrder(orderId); if (order != null && !order.isPaid()) { orderService.closeOrder(orderId); // 关闭订单 inventoryService.restoreInventory(orderId); // 恢复库存 notificationService.sendTimeoutNotification(orderId); // 发送通知 } }

3.4. 示例流程图

  1. 用户下单,系统创建订单并记录创建时间。
  2. 系统向消息队列发送一条延迟消息,设置延迟时间为订单的超时时长(例如 30 分钟)。
  3. 延迟时间到达时,消息队列将消息交给消费者。
  4. 消费者检查订单是否已支付:
    • 如果已支付,消息被丢弃,不做处理。
    • 如果未支付,执行超时处理(关闭订单、恢复库存等)。

 

 

相关文章:

java八股文-消息队列

一、MQ基础篇 1. 什么是消息队列? 消息队列(MQ)是分布式系统中实现异步通信的中间件,解耦生产者和消费者。 2. 使用场景有哪些? 异步处理(如注册后发送邮件)系统解耦(不同服务通过…...

3分钟idea接入deepseek

DeepSeek简介 DeepSeek 是杭州深度求索人工智能基础技术研究有限公司开发的一系列大语言模型,背后是知名量化资管巨头幻方量化3。它专注于开发先进的大语言模型和相关技术,拥有多个版本的模型,如 DeepSeek-LLM、DeepSeek-V2、DeepSeek-V3 等&…...

【DeepSeek与鸿蒙HarmonyOS:开启应用开发新次元】

引言:科技融合的新曙光 在当今数字化浪潮中,DeepSeek 和鸿蒙 HarmonyOS 宛如两颗璀璨的明星,各自在人工智能和操作系统领域熠熠生辉。DeepSeek 以其强大的大模型能力,在自然语言处理、代码生成等多个领域展现出卓越的性能&#x…...

基于光度立体视觉的三维重建方法

基于光度立体视觉的三维重建方法 一、三维重建概述二、光度立体原理简介三、Halcon:光度立体实验1.四张测试原图2.结果图3.Halcon实验代码 四、相关参考 光度立体视觉通过多角度的光源激励,获取多个不同光照方向下的表面图像,从中重建表面法向&#xff0…...

在VSCode中接入deepseek

注册就送14元2000万tokens。 https://cloud.siliconflow.cn/i/rnbA6i6U各种大模型 下面介绍我是如如接入vscode的 左边生成一个key,呆会vscode要用,不然401. 打开vscod,电脑能上网。下插件。 下好要配置 点它一下。 要配置,全…...

DeepSeek掘金——VSCode 接入DeepSeek V3大模型,附使用说明

VSCode 接入DeepSeek V3大模型,附使用说明 由于近期 DeepSeek 使用人数激增,服务器压力较大,官网已 暂停充值入口 ,且接口响应也开始不稳定,建议使用第三方部署的 DeepSeek,如 硅基流动 或者使用其他模型/插件,如 豆包免费AI插件 MarsCode、阿里免费AI插件 TONGYI Lin…...

申请SSL证书,如何完成域名验证

一、前言 给大家分享一下Lets Encrypt 证书申请时,如何完成域名验证这一步操作的方法。 二、为什么要进行域名验证 申请SSL证书时进行域名验证的主要原因是确保证书只颁发给有权控制特定域名的实体。这是为了保证互联网的安全性和信任,防止恶意方获取不…...

HTTP实验(ENSP模拟器实现)

HTTP概述 HTTP(HyperText Transfer Protocol,超文本传输协议),设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法。 HTTP定义了多种请求方法,常用的包括: GET:请求资源。 POST&…...

AI工具评论

deepseek(一系列接入R1的工具如:元宝、纳米、C知道、qq浏览器、百度AI、小艺...,应该都是R1满血版吧...) kimi 豆包 ------ chatGPT Grok3 cursor github copilot https://zhuanlan.zhihu.com/p/21161495794https://zhuan…...

comfy UI节点缺失dlib库处理

安装出现dlib错误: [!] ERROR: Failed building wheel for dlib Failed to build dlib 依赖环境:python3.12 comfyui 最新版本 pip install dlib 出现错误 直接下代码编译 编译为:dlib-19.24.99-cp312-cp312-win_amd64.whl 下载地址&am…...

STM32 HAL库I2C函数使用详解:以MPU6050传感器为例

引言 I2C(Inter - Integrated Circuit)由Philips公司开发的一种简单、双向二线制串行通信协议。它只需要两根线即可在连接于总线上的器件之间传送信息,主要用于短距离、低速的数据传输,广泛应用于各种传感器、存储器等设备的通信中…...

四步彻底卸载IDEA!!!

各位看官早安午安晚安呀 如果您觉得这篇文章对您有帮助的话 欢迎您一键三连,小编尽全力做到更好 欢迎您分享给更多人哦 大家好,我们今天来学习四步彻底卸载IDEA!!! 首先我要提醒各位 如果你想删除 IDEA 相关&#xf…...

vue3 背景虚化,文字高亮效果

效果: 组件代码: <template><div :style"styleComputed" class"background-blurring"><div class"mask"></div><div :style"styleComputed" class"blurring-text">background</div>&l…...

开源一个可以调RGB三色的小灯棒子

开源一个可以调灯的小灯棒子。 主控用的STC8G1K08A-SOP8&#xff0c;RGB三色灯是WS2812B。 开源到立创开源广场了&#xff0c;可以直接进入下方链接&#xff0c;那边可以直接查看原理图和PCB。 一个可调RGB三色的小灯棒子 - 立创开源硬件平台一个可调RGB三色的小灯棒子https…...

在聚类算法的领域特定语言(DSL)中添加一个度量矩阵组件

以下是一个详细的步骤和示例代码&#xff0c;用于在聚类算法的领域特定语言&#xff08;DSL&#xff09;中添加一个度量矩阵组件&#xff0c;同时满足处理数据集能达到完美聚类且改进后查询次数少于改进前的要求。 整体思路 定义DSL和原聚类算法&#xff1a;首先&#xff0c;…...

【C++】list 链表的使用+模拟实现

目录 文章目录 前言 一、list的简介 二、list的使用方法 三、list的模拟实现 1.基本框架&#xff1a; 2.迭代器实现 3.常用接口实现 四、完整代码 总结 前言 本文主要介绍C【STL】容器中的 list&#xff0c;包括接口说明和模拟实现。其中讲解了迭代器功能上的分类&am…...

AI助力小微企业技术开发规范化管理 | 杂谈

AI助力小微企业技术开发规范化管理 在小型技术研发企业中&#xff0c;人员配置紧张&#xff0c;往往一名员工需要承担多项职务和任务。例如&#xff0c;后端程序开发人员可能同时要负责需求调研、数据库设计、后端设计及开发&#xff0c;甚至在某些情况下还需兼任架构师的角色。…...

Android 实现 RTMP 推流:快速集成指南

简介 在 Android 设备上实现 RTMP 推流,可以用于直播、远程监控等应用场景。本文将基于 rtmp-rtsp-stream-client-java 库,介绍如何在 Android 端快速集成 RTMP 推流,包括权限管理、相机预览、推流控制等关键步骤。 步骤 1. 配置 Maven 仓库 在 settings.gradle.kts 中添…...

pipeline 使用git parameter插件实现动态选择分支构造

效果&#xff0c;&#xff0c;点击build with Parameters 就会出现右边的当前仓库的所有的分支&#xff0c;默认最多显示5个&#xff0c;可以修改配置&#xff0c;修改显示的最大分支数量。如果分支太多&#xff0c;可以通过右边的过滤框输入过滤。 安装git params插件 搜索g…...

postcss.config.js 动态配置基准值

在Vue项目中引入PostCSS可以实现不同分辨率的自适应&#xff0c;通常在H5项目中使用 1. 安装插件 npm install --save-dev postcss postcss-loader autoprefixer 2. 新建postcss.config.js文件&#xff0c;添加下列配置项 module.exports {plugins: {postcss-px-to-viewpor…...

[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?

&#x1f9e0; 智能合约中的数据是如何在区块链中保持一致的&#xff1f; 为什么所有区块链节点都能得出相同结果&#xff1f;合约调用这么复杂&#xff0c;状态真能保持一致吗&#xff1f;本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里&#xf…...

1688商品列表API与其他数据源的对接思路

将1688商品列表API与其他数据源对接时&#xff0c;需结合业务场景设计数据流转链路&#xff0c;重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点&#xff1a; 一、核心对接场景与目标 商品数据同步 场景&#xff1a;将1688商品信息…...

大模型多显卡多服务器并行计算方法与实践指南

一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...

IT供电系统绝缘监测及故障定位解决方案

随着新能源的快速发展&#xff0c;光伏电站、储能系统及充电设备已广泛应用于现代能源网络。在光伏领域&#xff0c;IT供电系统凭借其持续供电性好、安全性高等优势成为光伏首选&#xff0c;但在长期运行中&#xff0c;例如老化、潮湿、隐裂、机械损伤等问题会影响光伏板绝缘层…...

SpringTask-03.入门案例

一.入门案例 启动类&#xff1a; package com.sky;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCach…...

【JVM面试篇】高频八股汇总——类加载和类加载器

目录 1. 讲一下类加载过程&#xff1f; 2. Java创建对象的过程&#xff1f; 3. 对象的生命周期&#xff1f; 4. 类加载器有哪些&#xff1f; 5. 双亲委派模型的作用&#xff08;好处&#xff09;&#xff1f; 6. 讲一下类的加载和双亲委派原则&#xff1f; 7. 双亲委派模…...

Selenium常用函数介绍

目录 一&#xff0c;元素定位 1.1 cssSeector 1.2 xpath 二&#xff0c;操作测试对象 三&#xff0c;窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四&#xff0c;弹窗 五&#xff0c;等待 六&#xff0c;导航 七&#xff0c;文件上传 …...

pycharm 设置环境出错

pycharm 设置环境出错 pycharm 新建项目&#xff0c;设置虚拟环境&#xff0c;出错 pycharm 出错 Cannot open Local Failed to start [powershell.exe, -NoExit, -ExecutionPolicy, Bypass, -File, C:\Program Files\JetBrains\PyCharm 2024.1.3\plugins\terminal\shell-int…...

Python常用模块:time、os、shutil与flask初探

一、Flask初探 & PyCharm终端配置 目的: 快速搭建小型Web服务器以提供数据。 工具: 第三方Web框架 Flask (需 pip install flask 安装)。 安装 Flask: 建议: 使用 PyCharm 内置的 Terminal (模拟命令行) 进行安装,避免频繁切换。 PyCharm Terminal 配置建议: 打开 Py…...

基于stm32F10x 系列微控制器的智能电子琴(附完整项目源码、详细接线及讲解视频)

注&#xff1a;文章末尾网盘链接中自取成品使用演示视频、项目源码、项目文档 所用硬件&#xff1a;STM32F103C8T6、无源蜂鸣器、44矩阵键盘、flash存储模块、OLED显示屏、RGB三色灯、面包板、杜邦线、usb转ttl串口 stm32f103c8t6 面包板 …...