Kafka事务是怎么实现的?Kafka事务消息原理详解

news2025/1/24 5:38:58

在这里插入图片描述

目录

    • 一、Kafka事务性消息
      • 1.1 介绍Kafka事务性消息
      • 1.2 事务性消息的应用场景
      • 1.3 Kafka事务性消息的优势
    • 二、Kafka事务性消息的使用
      • 2.1 配置Kafka以支持事务性消息
        • 生产者配置
        • 消费者配置
      • 2.2 生产者:发送事务性消息
        • 创建Kafka生产者
        • 开始事务
        • 发送消息
        • 提交或中止事务
      • 2.3 消费者:处理事务性消息
        • 创建 Kafka 消费者
        • 订阅主题
        • 处理消息
        • 提交位移
    • 三、事务性消息的最佳实践
      • 3.1 保障消息的一次交付
        • 3.1.1 生产者幂等性
        • 3.1.2 消费者去重
      • 3.2 事务性消息的监控和故障排查
        • 3.2.1 监控工具
        • 3.2.2 故障排查
      • 3.3 事务性消息的性能考量
        • 3.3.1 性能调整
        • 3.3.2 吞吐量优化
    • 四、示例:生产和消费Kafka事务性消息
      • 4.1 示例1:生产事务性消息
        • 示例1代码:生产者
        • 代码说明:
      • 4.2 示例2:消费事务性消息
        • 示例2代码:消费者
        • 代码说明:
    • 五、总结
      • Kafka系列文章:

大家好,我是哪吒。

前两天,有个朋友去面试,被问到Kafka事务的问题。

她的第一反应是:

我是来面试Java的,怎么问我大数据的Kafka?

在这里插入图片描述

不过Kafka确实是Java程序员必备的中间件技术了,这点是毋庸置疑的。

在这里插入图片描述

Kafka几乎是当今时代背景下数据管道的首选,无论你是做后端开发、还是大数据开发,对它可能都不陌生。开源软件Kafka的应用越来越广泛。

面对Kafka的普及和学习热潮,哪吒想分享一下自己多年的开发经验,带领读者比较轻松地掌握Kafka的相关知识

上一节我们说到了解密Kafka主题的分区策略:提升实时数据处理的关键,今天系统的说一下Kafka的事务,实现步步为营,逐个击破,拿下Kafka。

在当今大数据时代,数据的可靠性和一致性变得至关重要。Kafka作为一个分布式流数据平台,强调了实时数据的高吞吐量传输,而Kafka事务性消息则在这个过程中发挥了至关重要的作用。

本文将详细介绍Kafka事务性消息,探究它们如何确保数据一致性,以及在各种应用场景中的应用。

一、Kafka事务性消息

1.1 介绍Kafka事务性消息

Kafka事务性消息是一项关键的功能,为确保数据一致性提供了重要的支持。在本部分,我们将深入了解Kafka事务性消息的基本概念。

Kafka事务性消息的概念

在这里插入图片描述

Kafka事务性消息是一种机制,用于确保消息的可靠性传递和处理。与非事务性消息相比,它们在数据处理中提供了额外的保证。一旦消息被写入Kafka集群,它们将被认为是已经处理,无论发生了什么。

为什么需要事务性消息?

在这里插入图片描述

事务性消息对于确保数据一致性至关重要。在某些应用程序中,消息的完整性和可靠性至关重要。如果在消息处理期间发生故障,如何保证消息不会丢失或重复是一个复杂的问题。Kafka事务性消息提供了解决这些问题的方式,使得消息处理更加可控和可靠。

事务性消息的特性

Kafka事务性消息具有以下关键特性:

在这里插入图片描述

  • 原子性:事务性消息要么完全成功,要么完全失败。这确保了消息不会被部分处理。

  • 可靠性:一旦消息被写入Kafka,它们将被视为已经处理,即使发生了应用程序或系统故障。

  • 顺序性:事务性消息在单个分区内保持顺序。这对于需要按顺序处理的应用程序至关重要。

  • 幂等性:Kafka生产者可以配置为幂等,确保相同的消息不会被重复发送。

  • Exactly Once语义:事务性消息支持"仅一次"语义,即消息要么完全到达一次,要么不到达。

本节的目标是帮助您理解Kafka事务性消息的核心概念。接下来,我们将探讨它们的应用场景以及相对于非事务性消息的优势。

1.2 事务性消息的应用场景

事务性消息在多种应用场景中发挥着关键作用。以下是一些常见的应用场景,其中事务性消息特别有用:

金融交易处理:在金融领域,每笔交易都必须具备原子性,确保不发生不一致或重复的交易。事务性消息可用于记录和处理金融交易,保证交易的完整性。

订单处理:在电子商务平台上,订单处理必须是可靠的,以确保订单的创建、支付和发货不会出现问题。事务性消息可用于跟踪和处理订单的不同阶段,从而确保订单流程的一致性。

库存管理:对于企业,库存管理是至关重要的。事务性消息可用于跟踪库存的变化,以确保库存的准确性和可靠性。

日志记录:在大数据和日志记录应用中,日志的完整性是至关重要的。事务性消息可用于确保日志的完整性,即使在日志处理集群发生故障时也能保持一致性。

系统通知:对于需要向用户发送通知或提醒的应用程序,确保通知的可靠发送至关重要。事务性消息可用于实现这一目标。

1.3 Kafka事务性消息的优势

相对于非事务性消息,Kafka事务性消息具有明显的优势,特别是在需要数据一致性的应用场景中。以下是Kafka事务性消息的优势:

数据一致性:事务性消息可确保消息要么被完全处理,要么不被处理。这消除了数据处理中的不一致性,有助于维护数据一致性。

可靠性:一旦消息被写入Kafka,它们将被视为已经处理,即使发生了应用程序或系统故障。这确保了消息的可靠传递。

幂等性:Kafka生产者可以配置为幂等,这意味着相同的消息不会被重复发送。这有助于减少不必要的消息传递,避免数据重复。

Exactly Once语义:事务性消息支持"仅一次"语义,即消息要么完全到达一次,要么不到达。这是某些应用程序所需的高级语义。

错误处理:事务性消息提供了一种处理错误的机制,以确保消息可以被恢复或重试,而不会丢失。

在这里插入图片描述

二、Kafka事务性消息的使用

在这一部分,我们将深入研究如何使用Kafka事务性消息来确保数据的一致性。

2.1 配置Kafka以支持事务性消息

配置Kafka以支持事务性消息对于确保消息在传递和处理过程中的一致性非常重要。在本节中,我们将详细讨论如何配置Kafka以支持事务性消息,包括生产者和消费者的设置。

生产者配置

在生产者端,需要进行一些特定的配置以启用事务性消息。以下是一些关键的配置参数:

  • acks:这是有关生产者接收到确认之后才认为消息发送成功的设置。对于事务性消息,通常将其设置为acks=all,以确保消息仅在事务完全提交后才被视为成功发送。

  • transactional.id:这是用于标识生产者实例的唯一ID。在配置文件中设置transactional.id是启用事务性消息的关键步骤。

  • enable.idempotence:幂等性是指相同的消息不会被重复发送。对于事务性消息,通常将其设置为enable.idempotence=true,以确保消息不会重复发送。

配置示例:

acks=all
transactional.id=my-transactional-id
enable.idempotence=true
消费者配置

在消费者端,同样需要进行适当的配置以确保正确处理事务性消息。以下是一些消费者的重要配置参数:

  • isolation.level:这是用于控制消费者的隔离级别的设置。对于事务性消息,通常将其设置为isolation.level=read_committed,以确保只读取已经提交的事务消息。

  • auto.offset.reset:这是消费者启动时从哪里开始读取消息的设置。通常将其设置为auto.offset.reset=earliest,以确保不会错过任何已提交的消息。

配置示例:

isolation.level=read_committed
auto.offset.reset=earliest

配置Kafka以支持事务性消息是确保消息可靠传递和处理的关键步骤。这些配置设置可以确保在生产和消费事务性消息时的正确行为。

2.2 生产者:发送事务性消息

在这一部分,我们将深入研究如何使用Kafka生产者来发送事务性消息。发送事务性消息是确保数据一致性的关键步骤,需要特别小心。以下是详细的步骤和示例:

创建Kafka生产者

首先,我们需要创建一个 Kafka 生产者的实例。这个生产者实例将负责将消息发送到 Kafka 主题。创建生产者需要配置参数,包括 Kafka 集群的地址、消息的键和值的序列化器、事务ID 等。

下面是一个创建 Kafka 生产者的示例:

import org.apache.kafka.clients.producer.KafkaProducer;
import org.apache.kafka.clients.producer.Producer;
import org.apache.kafka.clients.producer.ProducerConfig;
import java.util.Properties;

public class MyKafkaProducer {
    public static Producer<String, String> createProducer() {
        Properties properties = new Properties();
        properties.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092");
        properties.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringSerializer");
        properties.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringSerializer");
        properties.put(ProducerConfig.TRANSACTIONAL_ID_CONFIG, "my-transactional-id");

        return new KafkaProducer<>(properties);
    }
}
开始事务

在准备发送事务性消息之前,我们需要明确地开始一个事务。这通过调用 beginTransaction 方法来实现。一旦事务开始,所有后续的消息发送将包含在这个事务中。

producer.beginTransaction();
发送消息

在事务内,我们可以开始发送消息。这些消息将被包含在事务中,只有在事务成功提交时才会真正写入 Kafka 主题。

producer.send(new ProducerRecord<>("my-topic", "key1", "value1"));
producer.send(new ProducerRecord<>("my-topic", "key2", "value2"));
提交或中止事务

事务性消息的一个关键特性是它们要么完全成功,要么完全失败。因此,在消息发送后,我们需要根据消息的处理结果来决定是提交事务还是中止事务。这可以通过调用 commitTransactionabortTransaction 方法来实现。

try {
    producer.commitTransaction();
} catch (ProducerFencedException | OutOfOrderSequenceException | AuthorizationException e) {
    // 处理异常,通常中止事务并重试
    producer.close();
} catch (CommitFailedException e) {
    // 事务提交失败,通常中止事务并重试
    producer.close();
}

上述步骤提供了一个基本的示例,演示如何使用 Kafka 生产者发送事务性消息。事务性消息的发送确保了消息的可靠性和一致性,尤其在需要原子性保证的情况下非常有用。

2.3 消费者:处理事务性消息

在这一部分,我们将深入研究如何使用 Kafka 消费者来处理事务性消息。正确处理事务性消息对于保证数据一致性至关重要。以下是详细的步骤和示例:

创建 Kafka 消费者

首先,我们需要创建一个 Kafka 消费者的实例。这个消费者实例将负责从 Kafka 主题中读取消息。创建消费者需要配置参数,包括 Kafka 集群的地址、消息的键和值的反序列化器、消费者组 ID 等。

下面是一个创建 Kafka 消费者的示例:

import org.apache.kafka.clients.consumer.Consumer;
import org.apache.kafka.clients.consumer.ConsumerConfig;
import org.apache.kafka.clients.consumer.ConsumerRecords;
import org.apache.kafka.clients.consumer.KafkaConsumer;
import java.time.Duration;
import java.util.Collections;
import java.util.Properties;

public class MyKafkaConsumer {
    public static Consumer<String, String> createConsumer() {
        Properties properties = new Properties();
        properties.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092");
        properties.put(ConsumerConfig.GROUP_ID_CONFIG, "my-consumer-group");
        properties.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringDeserializer");
        properties.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringDeserializer");

        return new KafkaConsumer<>(properties);
    }
}
订阅主题

消费者需要明确地订阅包含事务性消息的主题。这通过调用 subscribe 方法来实现。一旦订阅,消费者将开始接收该主题上的消息。

consumer.subscribe(Collections.singletonList("my-topic"));
处理消息

一旦事务性消息到达,消费者需要确保消息被正确处理。这通常涉及到处理消息的逻辑,确保数据的一致性。处理消息的逻辑将根据具体的应用和需求而异。

ConsumerRecords<String, String> records = consumer.poll(Duration.ofMillis(100));
for (ConsumerRecord<String, String> record : records) {
    String key = record.key();
    String value = record.value();
    // 处理消息的逻辑
}
提交位移

消费者需要负责提交消息的位移,以便正确跟踪已处理的消息。这通过调用 commitSynccommitAsync 方法来实现。位移的提交确保了消息不会被重复处理。

consumer.commitSync();

上述步骤提供了一个基本的示例,演示了如何使用 Kafka 消费者处理事务性消息。消费者的正确配置和消息处理确保了消息的可靠性和一致性。在实际应用中,处理消息的逻辑将更加复杂,以满足特定的需求。

在这里插入图片描述

三、事务性消息的最佳实践

在这一节,我们将提供一些关于如何使用Kafka事务性消息的最佳实践。这包括如何确保消息的一次交付、监控和故障排查以及性能优化。

3.1 保障消息的一次交付

3.1.1 生产者幂等性

确保生产者的幂等性是关键,以防止消息被重复发送。以下是一些关键策略和实践,可用于确保生产者的幂等性:

1. 分配唯一消息ID: 为每条消息分配一个唯一的消息ID。这可以是全局唯一的,也可以是特定于主题的唯一。在发送消息之前,生产者可以检查已经发送的消息记录,以确保当前消息的ID不重复。

2. 使用幂等性API: Kafka 提供了幂等性的生产者 API。你可以在生产者配置中启用幂等性,设置 enable.idempotence=true,以确保消息在发送时不会被重复处理。

3. 实现自定义幂等性: 在一些情况下,自定义实现幂等性逻辑可能是必要的。这可以涉及到在消息处理端的数据库或存储中跟踪已处理消息的状态,以确保消息不会被重复处理。

4. 设置适当的重试机制: 如果消息发送失败,生产者应该具备适当的重试机制,以确保消息最终被成功发送。重试机制需要在生产者的配置中进行设置。

3.1.2 消费者去重

保障消息不会被重复处理同样至关重要。以下是一些策略和最佳实践,可用于实现消费者的去重:

1. 幂等性消息处理逻辑: 消费者的消息处理逻辑应该是幂等的。这意味着无论消息被处理多少次,其结果都应该是相同的。这通常需要在应用程序代码中进行实施。

2. 消息唯一标识: 为每条消息分配一个唯一的标识符,如消息ID。在处理消息前,消费者可以维护一个记录已处理消息的数据结构,以确保消息不会被重复处理。

3. 消费者去重过程: 消费者在处理消息前,可以查询已处理消息的记录,如果消息已存在于记录中,可以选择跳过处理或进行进一步处理。这可以防止消息的重复处理。

4. 消费者库支持: 一些消息队列处理库提供了内置的去重机制,你可以利用这些库来简化去重处理。

以上内容提供了详细的策略和最佳实践,以确保消息的一次交付。这是保障数据一致性的关键步骤,特别适用于事务性消息的处理。这些实践可以根据具体的应用和需求进行定制化。

3.2 事务性消息的监控和故障排查

3.2.1 监控工具

监控Kafka事务性消息是确保系统的可靠性的重要部分。以下是一些监控工具和策略:

  • Kafka内置指标:Kafka提供了一组内置指标,用于监控事务性消息的性能和状态。你可以使用这些指标来跟踪消息的处理情况。

  • 日志文件:Kafka的日志文件包含了详细的事件信息,可以用于故障排查和性能分析。定期检查日志文件,以查找潜在的问题。

  • 监控系统:使用专业的监控系统,如Prometheus和Grafana,来建立实时监控和警报。这些系统可以帮助你及时发现问题并采取措施。

3.2.2 故障排查

当事务性消息出现问题时,需要能够排查和解决这些问题。以下是一些故障排查策略:

  • 日志分析:定期分析Kafka的日志文件,查找异常和错误信息。这可以帮助你及早发现问题并采取措施。

  • 监控警报:建立监控警报,以便在出现问题时立即收到通知。这有助于快速响应问题。

  • 版本和配置管理:确保Kafka和应用程序的版本和配置得到正确管理。不同版本或配置的不一致可能导致问题。

3.3 事务性消息的性能考量

性能是任何消息系统的关键指标,特别是对于高吞吐量和低延迟的需求。以下是一些性能考量和优化策略:

3.3.1 性能调整
  • 生产者性能调整:通过调整生产者的配置参数,如batch.sizeacks等,可以优化消息发送性能。

  • 消费者性能调整:消费者的性能也可以通过配置参数,如max.poll.recordsfetch.min.bytes等进行调整。

3.3.2 吞吐量优化
  • 分区和并

行度**:合理地选择分区数量和消费者的并行度,以确保系统能够处理大量事务性消息。

  • 水平扩展:如果系统负载增加,考虑进行水平扩展,增加Kafka代理和消费者实例,以提高吞吐量。

  • 网络和存储优化:确保网络和存储基础设施足够快,以支持高吞吐量的消息传递。

上述最佳实践策略和性能优化建议可以帮助你更好地使用Kafka事务性消息,确保消息的可靠传递和一致性处理,同时满足性能需求。通过仔细的配置、监控和故障排查,你可以建立一个可靠和高性能的消息处理系统。

四、示例:生产和消费Kafka事务性消息

在这一节,我们将提供两个示例,详细展示如何生产和消费Kafka事务性消息。

4.1 示例1:生产事务性消息

示例1代码:生产者
import org.apache.kafka.clients.producer.*;
import java.util.Properties;

public class TransactionalProducerExample {
    public static void main(String[] args) {
        String bootstrapServers = "localhost:9092";
        String topic = "my-transactional-topic";

        Properties properties = new Properties();
        properties.put("bootstrap.servers", bootstrapServers);
        properties.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
        properties.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");
        properties.put("acks", "all");
        properties.put("enable.idempotence", "true");
        properties.put("transactional.id", "my-transactional-id");

        Producer<String, String> producer = new KafkaProducer<>(properties);

        producer.initTransactions();

        try {
            producer.beginTransaction();
            ProducerRecord<String, String> record = new ProducerRecord<>(topic, "key", "value");
            producer.send(record);
            producer.commitTransaction();
        } catch (ProducerFencedException | OutOfOrderSequenceException | AuthorizationException e) {
            // Fenced, sequence issue, or authorization exception
            producer.close();
        } catch (KafkaException e) {
            // Handle other exceptions
            producer.close();
        }

        producer.close();
    }
}
代码说明:
  • 这个示例演示了如何创建一个Kafka生产者,配置它以支持事务性消息,并生产一条事务性消息。
  • transactional.id是一个用于标识生产者事务的唯一ID。它确保了事务性消息的一致性。
  • try块中,我们使用producer.beginTransaction()来启动一个事务,然后发送一条消息,最后使用producer.commitTransaction()来提交事务。
  • 如果在事务期间发生异常,我们在catch块中处理异常并关闭生产者。

4.2 示例2:消费事务性消息

示例2代码:消费者
import org.apache.kafka.clients.consumer.*;
import java.time.Duration;
import java.util.Collections;
import java.util.Properties;

public class TransactionalConsumerExample {
    public static void main(String[] args) {
        String bootstrapServers = "localhost:9092";
        String groupId = "my-consumer-group";
        String topic = "my-transactional-topic";

        Properties properties = new Properties();
        properties.put("bootstrap.servers", bootstrapServers);
        properties.put("group.id", groupId);
        properties.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
        properties.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");

        Consumer<String, String> consumer = new KafkaConsumer<>(properties);
        consumer.subscribe(Collections.singletonList(topic));

        while (true) {
            ConsumerRecords<String, String> records = consumer.poll(Duration.ofMillis(100));
            for (ConsumerRecord<String, String> record : records) {
                System.out.printf("Consumed record with key %s and value %s%n", record.key(), record.value());
            }
        }
    }
}
代码说明:
  • 这个示例演示了如何创建一个Kafka消费者,订阅一个主题,并消费事务性消息。
  • 消费者将持续轮询主题以获取新的消息。
  • 每当有新消息可用时,它将打印出消息的键和值。

五、总结

本文深入探讨了Kafka事务性消息的关键概念、应用场景、优势、配置、使用以及最佳实践。在总结中,让我们再次强调一些关键要点,并展望Kafka事务性消息的未来。

  • Kafka事务性消息是一种机制,用于确保消息的可靠性传递和处理。它们提供了额外的保证,确保消息要么完全成功,要么完全失败。
  • 应用场景:Kafka事务性消息在金融交易、库存管理、订单处理等需要高可靠性和数据一致性的应用中发挥关键作用。
  • 优势:事务性消息相对于非事务性消息提供了更高的数据一致性和可靠性,支持原子性、幂等性和"仅一次"语义。
  • 配置:配置Kafka以支持事务性消息包括生产者和消费者的设置,如transactional.idenable.idempotence等。
  • 生产事务性消息:使用Kafka生产者,需要初始化事务、发送消息,然后提交或中止事务,以确保消息的一致性。
  • 消费事务性消息:使用Kafka消费者,需要订阅主题并持续轮询以获取消息,然后确保消息被正确处理。
  • 最佳实践:最佳实践包括保障消息的一次交付、监控和故障排查以及性能考量,以确保系统的稳定性和高性能。

Kafka系列文章:

Kafka批处理与流处理详解

解密Kafka主题的分区策略:提升实时数据处理的关键


🏆哪吒多年工作总结:Java学习路线总结,搬砖工逆袭Java架构师


在这里插入图片描述

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

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

相关文章

【MySQL】在 Centos7 环境下安装 MySQL

环境搭建 一、检查环境二、检查系统安装包三、安装 mysql yum 源四、安装 mysql 服务五、启动服务六、登录 mysql七、配置 my.cnf 注意&#xff0c;我们搭建的 mysql 环境是在 Linux 的 Centos7 环境下安装的~ 一、检查环境 注意&#xff0c;我们在安装和卸载中&#xff0c;先…

前端面试(5)

1、移动端适配 1.1、设置meta缩放比例&#xff0c;将设备窗口调整为设计图大小。 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width,initial-sc…

用到了C语言的函数指针功能。

请选择一个功能&#xff1a; 1. 加法 2. 减法 3. 乘法 4. 除法 5. 取模 6. 阶乘 7. 判断素数 8. 球体体积 9. 斐波那契数列 10. 幂运算 11. 最大公约数 12. 最小公倍数 13. 交换数字 14. 排序 15. 退出 请选择一个选项&#xff1a; #include <stdio.h> #include <stdl…

区块链实验室(31) - 交叉编译Ethereum的客户端Geth

编译Geth到X86架构平台 下载Geth源码&#xff0c;直接编译Geth源码&#xff0c;见下图。用file命令观察编译后的文件&#xff0c;架构是x86-64。 编译Geth到Arm64架构平台 直接用命令行编译&#xff0c;同时指定期望的架构为Arm64。编译脚本如下所示。 CGO_ENABLED0 GOOSlin…

LeetCode力扣每日一题(Java):35、搜索插入位置

一、题目 二、解题思路 1、我的思路&#xff08;又称&#xff1a;论API的重要性&#xff09; 读完题目之后&#xff0c;我心想这题目怎么看着这么眼熟&#xff1f;好像我之前学过的一个API呀&#xff01; 于是我回去翻了翻我之前写的博客&#xff1a;小白备战蓝桥杯&#xf…

JAVA安全之Spring参数绑定漏洞CVE-2022-22965

前言 在介绍这个漏洞前&#xff0c;介绍下在spring下的参数绑定 在Spring框架中&#xff0c;参数绑定是一种常见的操作&#xff0c;用于将HTTP请求的参数值绑定到Controller方法的参数上。下面是一些示例&#xff0c;展示了如何在Spring中进行参数绑定&#xff1a; 示例1&am…

前端知识(十)———JavaScript 使用URL跳转传递数组对象数据类型的方法

目录 首先了解一下正常传递基本数据类型 JavaScript跳转页面方法 JavaScript路由传递参数 JavaScript路由接收参数传递对象、数组 在前端有的时候会需要用链接进行传递参数&#xff0c;基本数据类型的传递还是比较简单的&#xff0c;但是如果要传递引用数据类型就比较麻烦了…

抖音直播匿名采集——协议分析

本文内容仅作学习参考&#xff0c;如侵权&#xff0c;请联系删除。 这次是关于匿名采集的分析&#xff0c;其中会涉及到以下几个只是点&#xff0c;websocket&#xff0c;protobuf&#xff0c;protobuf反序列化。 这里以web端的websocket做分析。 首先你需要将非匿名的代码给…

测试剪切板贴图,兼测试2023年12月7日更新的Bard

当前的情况好比&#xff0c;&#xff08;居然真的可以通过剪切板把图片放进来&#xff01;&#xff09; 听说2023年12月7日Bard有更新&#xff0c;所以&#xff0c;再测试了一次。这下&#xff0c;对大语言模型应该死心了&#xff1b;AI替代人的传闻应该是过早危言耸听了。

基于SpringBoot+Vue前后端分离的景点数据分析平台(Java毕业设计)

大家好&#xff0c;我是DeBug&#xff0c;很高兴你能来阅读&#xff01;作为一名热爱编程的程序员&#xff0c;我希望通过这些教学笔记与大家分享我的编程经验和知识。在这里&#xff0c;我将会结合实际项目经验&#xff0c;分享编程技巧、最佳实践以及解决问题的方法。无论你是…

临时或永久修改linux-kali虚拟机的主机名和遇见的错误解决方法(保姆级图文)【网络工程】

目录 临时修改主机名1. 查看当前主机名2. 修改主机名3. 打开新窗口&#xff0c;临时主机名生效 永久修改主机名1. 查看当前主机名2. 修改主机名3. 执行重启虚拟机生效配置 配置好hosts文件报错效果解决方法 总结 欢迎关注 『网络工程专业』 系列&#xff0c;持续更新中 欢迎关注…

ArcGIS界面显示分辨率调整

因为电脑显示分辨率的问题呢&#xff0c;ArcGIS的界面显示会字体显示不合适&#xff0c;出现模糊情况&#xff0c;这时候只需要做个简单的操作设置一下便可以解决&#xff01; 1、右键ArcMap的快捷启动方式。 2、对应选择兼容性——>更高DPI设置——>勾选替代DPI缩放行为…

【成功】Linux安装Mysql8并设置远程连接

今天在新搞来的阿里云的服务器里安装MySQL8&#xff0c;记录一下过程&#xff1a; 这是MySQL的官网和下载地址&#xff1a;MySQL :: Download MySQL Community Server (Archived Versions) 1. 先进入安装目录 cd /usr/local 2. 安装 wget https://downloads.mysql.com/arch…

stateflow——如何查看状态机中参数变化及状态机断点调试

法一&#xff1a;使用Data Inspector 点击“符号图窗”和“属性”&#xff0c;如图&#xff1b;在选择变量n并右键点击inspector&#xff0c;最后在logging&#xff0c;如图 法二&#xff1a;log active state 和法一类似使用data inspector查看&#xff0c;类似的查看方法和…

public static final

常量对象中声明并赋值的正确写法一&#xff1a; public class RoleConstant {public static final List<String> PROBLEM_VIEW_ALL_DATA new ArrayList<String>() {{add("角色1");add("角色2");add("角色3");}};}常量对象中声明并…

三. LiDAR和Camera融合的BEV感知算法-融合算法的基本介绍

目录 前言0. 简述1. 融合背景2. 融合思路3. 融合性能优劣总结下载链接参考 前言 自动驾驶之心推出的《国内首个BVE感知全栈系列学习教程》&#xff0c;链接。记录下个人学习笔记&#xff0c;仅供自己参考 本次课程我们来学习下课程第三章——LiDAR和Camera融合的BEV感知算法&am…

Stable Diffusion 源码解析(1)

参考1&#xff1a;https://blog.csdn.net/Eric_1993/article/details/129393890 参考2&#xff1a;https://zhuanlan.zhihu.com/p/613337342 1.StableDiffusion基本原理1.1 UNetModel、FrozenCLIP 模型1.2 DDPM、DDIM、PLMS算法 2. Runwayml SD 源码2.1 Img2Img Pipeline2.2 DD…

操作系统笔记——储存系统、文件系统(王道408)

文章目录 前言储存系统地址转换内存扩展覆盖交换 储存器分配——连续分配固定大小分区动态分区分配动态分区分配算法 储存器分配——非连续分配页式管理基本思想地址变换硬件快表&#xff08;TLB&#xff09;多级页表 段式管理段页式管理 虚拟储存器——基于交换的内存扩充技术…

文章解读与仿真程序复现思路——电力系统自动化EI\CSCD\北大核心《面向微电网群的云储能经济-低碳-可靠多目标优化配置方法》

这篇文章的标题涵盖了以下关键信息&#xff1a; 面向微电网群&#xff1a;研究的重点是微电网群&#xff0c;这可能指的是多个微电网系统的集合&#xff0c;而不仅仅是一个单独的微电网。微电网是指由分布式能源资源、储能系统和智能控制组成的小型电力系统&#xff0c;通常能够…

PPP协议概述与实验示例

PPP协议概述与实验示例 概述 PPP&#xff08;Point-to-Point Protocol&#xff09;是一种用于在点对点连接上传输多协议数据包的标准方法。它已经成为最广泛使用的互联网接入数据链路层协议&#xff0c;可以与各种技术结合&#xff0c;如ADSL、LAN等&#xff0c;实现宽带接入…