KafKa 3.x(一、入门)

news2024/11/18 16:54:29

前置:熟悉javase,熟悉linux,熟悉idea,熟悉hadoop

1. KafKa

1.1 KafKa定义

前端埋点记录用户(浏览,点赞,收藏,评论)到日志服务器,然后通过Flume(小于100m/s)将大日志文件导入到Hadoop集群,每产生一个日志就发送到hadoop(上传100m/s)中。
秒杀活动:Flume采集速度大于200ms/s,就需要KafKa集群。
kafka
Kafka传统定义:一个分布式的基于发布/订阅消息队列(MessageQueue),主要用于大数据实时处理领域。
发布/订阅:消息的发布者不会将消息直接发送给特定的订阅者,而是将发布的消息分为不同的类别,订阅者只接收感兴趣的消息
Kafka最新定义:一个开源的分布式事件流平台(EventStreamingPlatform),用于高性能数据管道,流分析,数据集成和关键任务应用

1.2消息队列

常见消息队列:Kafka,ActiveMQ,RabbitMQ,RocketMQ,大数据场景主要采用Kafka。

1.2.1 传统消息队列应用

缓存/削峰,解耦和异步通信。
缓冲/削峰:控制和优化数据流速度,解决生产和消费消息处理速度不一致的情况。
解耦:独立的扩展或修改两边的处理过程,只要确保他们遵循同样的接口约束。
数据解耦
异步通信:允许用户把一个消息放入队列,但并不立即处理它,然后再需要的时候再去处理。

1.2.2 消息队列的两种模式

  1. 点对点模式 消费者主动拉取数据,消息收到后清除消息。
    点对点
  2. 发布/订阅模式
  • 可以有多个topic主题(浏览,点赞,收藏,评论)
  • 消费者消费数据之后,不删除数据
  • 每个消费者独立,都可以消费数据
    发布/订阅

1.3 KafKa基础架构

KafKa架构

  1. 为方便扩展,提高吞吐量(大数据量),一个topic分为多个partition
  2. 配合分区的设计,提出消费者组(多消费)的概念,组内每个消费者并行消费,注意:某一个分区数据只能由一个消费者消费,防止会出现混乱
  3. 为提高可用性,为每个partition增加若干副本,类似NameNode HA,leader挂了后才会用副本。
  4. ZK中记录谁是leader,Kafka2.8.0后可不采用ZK,用kraft

2. KafKa快速入门

2.1 安装部署

2.1.1 集群规划

hadoop102hadoop103hadoop104
ZKZKZK
KafkaKafkaKafka

2.1.2 集群部署

注意:(在server.properties中修改)每个kafka在集群中的broker.id一定要唯一,修改log.dirs地址,修改zookeeper.connect地址
注意:一定要先关kafka,再关zookeeper

  1. 官方地址:http://kafka.apache.org/downloads.html
  2. 解压,修改文件名,修改配置文件

2.2.2 集群启停脚本

--kf.sh
#!/bin/bash
case $1 in
"start")
	for i in hadoop1 hadoop2 hadoop3
	do
		echo "---启动 $i kafka---"
		ssh $i"/opt/module/kafka/bin/kafka-server-start.sh -daemon /opt/module/kafka/config/server.properties"
	done
;;
"stop")
	for i in hadoop1 hadoop2 hadoop3
	do
		echo "---启动 $i kafka---"
		ssh $i"/opt/module/kafka/bin/kafka-server-stop.sh"
	done
;;
esac

chomod 777

2.2 Kafka命令行操作

2.2.1 主题命令行操作

  1. 查看操作主题命令: bin/kafka-topics.sh
    连接的kafkaBroker主机名端口:–bootstarp-server<String:server toconnect to>
    操作topic名称:–topic String:topic
    创建主题:–create
    删除主题:–delete
    修改主题:–alter
    查看主题:–list
    查看详情 --describe
    设置分区数 --partitions<Integer:# of partitions>
    设置分区副本:–replication-factor<Integer:replication factor>
  2. 查看当前服务器中的所有topic:bin/kafka-topics.sh --bootstrap-server localhost:9092 --list
  3. 创建first topic:bin/kafka-topics.sh --bootstrap-server
进入kafka目录下,不用进入bin目录下

-- 查看所有topic

.\bin\windows\kafka-topics.bat --zookeeper localhost:2181 --list

-- 查看指定topic信息

.\bin\windows\kafka-topics.bat --zookeeper localhost:2181 --describe --topic test

-- 创建topic信息

.\bin\windows\kafka-topics.bat --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic test

-- 创建生产者产生消息,不关闭页面

.\bin\windows\kafka-console-producer.bat --broker-list localhost:9092 --topic test

-- 创建消费者接收消息,不关闭页面

.\bin\windows\kafka-console-consumer.bat --bootstrap-server localhost:9092 --topic test --from-beginning

-- 删除topic:

.\bin\windows\kafka-topics.bat kafka.admin.DeleteTopicCommand --zookeeper localhost:2181 --delete --topic test

2.2.2 生产者命令行操作

生产者发送:bin/kafka-console-producer.sh --bootstrap-server localhost:9092 -topic first

2.2.3 消费者命令行操作

消费者消费:bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 -topic first
查看历史数据:bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 -topic first-beginning

3 KafKa生产者

3.1 生产者消息发送流程

3.1.1 发送原理

在消息发送过程中有2线程,main和sender。main中创建一个双端队列RecordAccumulator。main将消息发给队列,Sender线程从中拉取消息发送到Kafka Broker。
Kafka发送
DQueue中数据发给Send条件:

  • batch.size:数据累计到batch.size,sender就会发送数据。默认16k
  • linger.ms:如果数据没达到batch.size,sender在linger.ms时间后也会发送数据,单位ms,默认0ms,没有延时。
    应答ack级别:
  • 0:生产者发送的数据不需要等待数据落盘应答
  • 1:生产者发送的数据Leader收到数据后应答
  • -1(all):生产者发送的数据,Leader和ISR队列里所有的节点收齐数据后应答。-1和all等价。

3.1 异步发送API

3.2.1 普通异步发送

  1. 需求:创建Kafka生产者,采用异步的方式发送到Kafka Broker
    注:windows下创建topic: bin目录windows下执行:.\kafka-topics.bat --delete --bootstrap-server 127.0.0.1:9092 --topic test
public class CustomProducer {
    public static void main(String[] args) {
        //0.配置
        Properties properties = new Properties();
        //连接kafka
        properties.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG,"localhost:9092");
        //指定对应的ke和value序列化类型
        properties.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName());
        properties.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName());
        //1.创建kafka生产者对象
        KafkaProducer<String, String> kafkaProducer = new KafkaProducer<>(properties);
        //2.发送数据
        for (int i = 0; i < 5; i++) {
            kafkaProducer.send(new ProducerRecord<String, String>("first", "xuyu" + i));
        }
        //3.关闭资源
        kafkaProducer.close();
    }
}

3.2.1 带回调函数的异步发送

回调函数会在producer收到ack时调用,为异步调用,该方法有两个参数:元数据信息(RecordMetadata)和异常信息(Exception),如果Exception为null,说明发送成功。
只需在send()方法上添加callback参数即可。
kafkaProducer.send(new ProducerRecord<String, String>("first", "xuyu" + i), new Callback() {
	@Override
	public void onCompletion(RecordMetadata recordMetadata, Exception e) {
		if(e == null){
			System.out.println("主题:" + recordMetadata.topic() + "分区:" + recordMetadata.partition());
		}
	}
);

3.3 同步发送API

只需在异步发送的基础上,再调用get()方法即可。

kafkaProducer.send(new ProducerRecord<String, String>("first", "xuyu" + i)).get();

3.4 生产者分区

3.4.1 分区好处

  1. 便于合理使用资源,每个partition在一个Broker上存储,可把海量数据按照分区切割成一块一块的数据存储在多台Broker上,合理控制分区,可实现负载均衡的效果。
  2. 提高并行度,生产者可以分区为单位发送数据,消费者可以分区为单位进行消费。
    发送分区

3.4.2 生产者发送消息的分区策略

  1. 默认的分区器DefaultPartitioner(源码:IDEA中ctrl+n,全局查找DefaultPartitioner)
  • 有设置分区,则有设置值。
  • 没设置分区,将key的hash与topic的partition数进行取余得到partition值。
  • 没设置分区,也没有key,则用粘性分区,随机选择一分区,待该分区batch满了,kafka再随机一个分区。
    生产者发送消息的分区策略

3.4.2 自定义分区

如果根据企业需求,自己实现分区器。
  1. 需求
    将发送过来的数据如果包含x,就发往0号分区,否则发往1号分区。
  2. 实现
/**
 * @author 自定义分区器
 */
public class MyPartitioner implements Partitioner {
    @Override
    public int partition(String topic, Object key, byte[] keyBytes, Object value, byte[] valueBytes, Cluster cluster) {
        //获取数据
        String msgValue = value.toString();
        int partition;
        if (msgValue.contains("x")) {
            partition = 0;
        } else {
            partition = 1;
        }
        return partition;
    }
    @Override
    public void close() {}
    @Override
    public void configure(Map<String, ?> map) {}
}
//使用:关联自定义分区器
properties.put(ProducerConfig.PARTITIONER_CLASS_CONFIG, "com/xuyu/kafka/producer/config/MyPartitioner.java");

3.5 生产经验-如何提高吞吐量

从生产者到kafka集群broker仓库本来一次只发送一个data包数据,修改batch.size(批次大小,默认16k),linger.ms(等待时间,修改为5-100ms)使等待时间和发送数据量增大。同时使用compression.type(压缩snappy)将数据压缩。并将RecordAccumulator(缓冲区大小,修改为64m)调大。

public class CustomProducerParameters {
    public static void main(String[] args) {
        //0. 配置
        Properties properties = new Properties();
        properties.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092"); //连接/集群
        properties.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName());  //key序列化
        properties.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName());  //value序列化
        //优化参数
        properties.put(ProducerConfig.BUFFER_MEMORY_CONFIG, 33554432);  //缓冲区大小,默认32M
        properties.put(ProducerConfig.BATCH_SIZE_CONFIG, 16384);  //批次大小,默认16K
        properties.put(ProducerConfig.LINGER_MS_CONFIG, 1);  //linger.ms 等待时间,默认0
        properties.put(ProducerConfig.COMPRESSION_TYPE_CONFIG, "snappy");  //压缩,默认none,可选gzip,snappy,lz4,zstd
        //1. 创建生产者
        KafkaProducer<String, String> kafkaProducer = new KafkaProducer<>(properties);
        //2. 发送
        for (int i = 0; i < 5; i++) {
            kafkaProducer.send(new ProducerRecord<String, String>("first", "xuyu" + i));
        }
        //3. 关闭
        kafkaProducer.close();
    }
}

3.6 生产经验-数据可靠性

  1. acks应答原理
    ACK应答级别
    0:生产者发送过来的数据,不需要等数据落盘应答。
    问题:当Producer数据到leader内存中,服务器挂掉,数据会丢失,效率高
    1:生产者发送夺来的数据,Leader收到数据后应答。
    问题:当Producer数据到Leader内存中,应答完成后还没开始同步副本就挂掉了,新的leader不会收到这个信息,因为生产者已经认为发送成功了,数据会丢失,效率中等
    ack1
    -1(all):生产者发送过来的数据,Leader和ISR队列里所有节点都收到数据后应答。
    ack-1
    问题:Leader收到数据,ISR队列所有Follower都同步到数据,可靠性高,效率低,但有一个长时间没有同步到,怎么办?
    解决:Leader维护了一个动态的in-sync replica set(ISR),意为和Leader保持同步的Follower+Leader集合(leader:0 isr:0,1,2),如果Follower长时间未向Leader发送通信请求或同步数据,则该follower将被踢出ISR。该时间阈值由replica.lag.time.max.ms参数设定,默认30s。
    数据可靠性分析:如果分区副本设置为1,或ISR里应答的最小副本数为1(min.insync.replicas默认1),和ack=1的效果是一样的,仍会丢失数据(leader:0 isr:0)。
    数据完全可靠条件 = ACK级别设置为-1 + 分区副本>=2 + ISR里应答的最小副本数>=2
    结论:生产环境中,ack=0不用,ack=1用于日志传输,ack=-1用于传输和钱相关的数据,对可靠性要求高的场景。
        //acks
        properties.put(ProducerConfig.ACKS_CONFIG, "1");  //ack参数,默认-1 可选0,1,-1
        properties.put(ProducerConfig.RETRIES_CONFIG, 3);  //重试次数,默认int最大值21亿

数据重复分析:生产者发送过来的数据,Leader和ISR队列中所有节点收到数据后,leader挂了,没有返回ack,选出新的leader重复收到相同的数据。解决见下文。

3.7 生产经验-数据去重

3.7.1 数据传递语义

  • 至少一次(At LEadtest Once):ACK级别设置为-1 + 分区副本>=2 + ISR里应答的最小副本数>=2,可保证数据不丢失,不能保证数据不重复。
  • 至多一次(At Most Once):ACK级别设置为0,可保证数据不重复,不能保证数据不丢失。
  • 精确一次(Exactly Once):重要数据,既不能重复也不能丢失。
    Kafka 0.11版本后,引入幂等性和事务。

3.7.2 幂等性

  1. 幂等原理
    幂等性指Producer不论向Broker发送多少次重复数据,Broker端只会持久化一条,保证不重复。
    精确一次(Exactly Once) = 幂等性 + 至少一次(ack = -1 + 分区副本数>=2 + ISR最小副本数量>=2)。
    重复数据判断依据:具有<PID,Partition,SeqNumber>相同主键的消息提交时,Broker只会持久化一条。其中PID是Kafka每次重启都会分配一个新的;Partition表示分区号;Sequence Number是单调自增的。所以幂等性只能保证在单分区单会话内不重复。
  2. 如何使用幂等性
    开启参数enable.idempotence默认为true。

3.2.3 生产者事务

  1. Kafka事务原理
    说明:开启事务必须开启幂等性
    Producer在使用事务功能前,必须先自定义一个唯一的transactional.id。有此id,即使客户端挂掉,它重启后也能继续处理未完成的事务。
    Kafka生产者事务
  2. Kafka的事务的5个API
    void initTransactions(); 初始化事务
    void beginTransaction(); 开启事务
    void sendOffsetsToTransaction(Map<TopicPartition, OffsetAndMetadata> offsets, String consumerGroupId); 在事务内提交已经消费的偏移量(主要用于消费者)
    void commitTransaction(); 提交事务
    void abortTransaction(); 放弃事务(回滚)
  3. 单个Producer,使用事务保证消息仅一次发送。
public class CustomProducerTransactions {
    public static void main(String[] args) {
        //0.配置
        Properties properties = new Properties();
        //连接kafka
        properties.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092");
        //指定对应的ke和value序列化类型
        properties.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName());
        properties.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName());
        properties.put(ProducerConfig.TRANSACTIONAL_ID_CONFIG, "transaction_id_1");  //指定事务id
        //1.创建kafka生产者对象
        KafkaProducer<String, String> kafkaProducer = new KafkaProducer<>(properties);
        //添加事务
        kafkaProducer.initTransactions();
        kafkaProducer.beginTransaction();
        try {
            //2.发送数据
            for (int i = 0; i < 5; i++) {
                kafkaProducer.send(new ProducerRecord<String, String>("first", "xuyu" + i));
            }
            kafkaProducer.commitTransaction();
        } catch (Exception e) {
            kafkaProducer.abortTransaction();
        } finally {
            //3.关闭资源
            kafkaProducer.close();
        }
    }
}

3.8 生产经验-数据有序

单分区有序
单分区内有序:有条件,见下文
多分区,分区与分区间无序。

3.8 生产经验-数据乱序

  1. kafka在1.x版本之前保证数据单分区有序,条件:max.in.flight.requests.per.connection=1(不需要考虑是否开启幂等)
  2. kafka在1.x以及后版本保证数据单分区有序,条件:
  • 未开幂等性:max.in.flight.requests.per.connection=1
  • 开启幂等性:max.in.flight.requests.per.connection需要设置<=5
    原因:在kafka1.x后,启用幂等,kafka服务端会缓存producer发来的最近的5个request的元数据进行重排序,无论如何,都可保证最近5个request有序。因为幂等性的pid可保证。类似tcp数据校验

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

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

相关文章

k8s Service服务详解

1. Service 的概念&#xff1a; k8s中Service定义了这样一种抽象&#xff1a;一个pod的逻辑分组&#xff0c;一种可以访问他们的策略—通常称为微服务。这一组pod能够被Service访问到&#xff0c;通常是通过Label Selector Service能够提供负载均衡的能力&#xff0c;但是在使…

第二章 逻辑代数基础--数电(期末复习笔记)

第二章 逻辑代数基础 2.1 概述 逻辑&#xff1a;事物间的因果关系。 逻辑运算&#xff1a;逻辑状态按照指定的某种因果关系进行推理的过程。 逻辑变量&#xff1a;用字母表示&#xff0c;取值只有0和1。此时&#xff0c;0和1不再表示数量的大小&#xff0c;只代表两种不同的状…

人工智能期末复习(简答)

第1章 人工智能概述 1.什么是人工智能&#xff1f; 人工智能&#xff08;Artificial Intelligence, AI&#xff09;,又称机器智能&#xff08;MI&#xff0c;Machine Intelligence&#xff09;&#xff0c; 主要研究用人工的方法和技术开发智能机器或智能系统&#xff0c;以模…

交换机配置DHCP服务(华为交换机)

#三层交换机互联互通 配置 #进入系统视图 <Huawei>system-view #关闭系统提示信息 [Huawei]undo info-center enable #启动DHCP功能 [Huawei]dhcp enable #创建vlan 10 并配置 vlanif 地址 [Huawei]vlan 10 [Huawei-vlan10]int vlanif 10 [Huawei-Vlanif10]ip addr…

软考A计划-网络工程师-专业英语

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列 &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff…

初识轻量级分布式任务调度平台 xxl-job

文章目录 前言xxl-job的目录结构项目依赖 (父 pom.xml)xxl-job-admin 启动xxl-job-executor-sample (项目使用示例)xxl-job-executor-sample-frameless : 不使用框架的接入方式案例xxl-job-executor-sample-springboot : springboot接入方案案例 xxl-job执行器器启动流程分析调…

python高效使用方法03_pandas中的rolling.mean滚动求均值效率究竟如何?

先上图来说明pandas.rolling(n).mean()滚动求均值的方法效率其实并不是最高的&#xff0c;我自己尝试使用cython把滚动求均值的方法重新编译了一下&#xff0c;发现效率总体上是pandas的三倍以上。 总结&#xff1a;pandas比较合适用于普通的研究分析工作&#xff0c;如果用到追…

AcWing802:详解

原题引出 题解分析 首先毫无置疑的是本体需要用到离散化的知识&#xff0c;将输入的索引下标放到一个vector当中存起来&#xff0c;在该vector当中&#xff0c;利用其本身的索引我们对称构造两个数组a和s&#xff08;用于求前缀和&#xff09;。那么最关键的一个问题就是如何通…

NodeJS Socket编程⑩③

文章目录 ✨文章有误请指正&#xff0c;如果觉得对你有用&#xff0c;请点三连一波&#xff0c;蟹蟹支持&#x1f618;前言Socket编程1、WebSocket VS HTTP请求2、浏览器支持3、WebSocket Practice4、WebSocket 授权验证5、SocketIO模块 &#x1f5e1; Express~WebSokcetIOServ…

Java中不支持多重继承原因

在 Java 中回答这种棘手问题的关键是准备好相关主题, 以应对后续的各种可能的问题。 这是非常经典的问题&#xff0c;与为什么 String 在 Java 中是不可变的很类似; 这两个问题之间的相似之处在于它们主要是由 Java 创作者的设计决策使然。 为什么Java不支持类多重继承, 可以考…

UML基本图例

UML基本图例 软件流程和UML基本图例软件流程&#xff1a;下面是九种常用的UML图&#xff1a;1.用例图&#xff08;UseCase Diagrams&#xff09;2.类图&#xff08;Class Diagram&#xff09;3.对象图&#xff08;Object Diagrams&#xff09;4.状态图&#xff08;Statechart D…

6道常见hadoop面试题

Q1.什么是Hadoop&#xff1f;   Hadoop是一个开源软件框架&#xff0c;用于存储大量数据&#xff0c;并发处理/查询在具有多个商用硬件&#xff08;即低成本硬件&#xff09;节点的集群上的那些数据。总之&#xff0c;Hadoop包括以下内容&#xff1a;   HDFS&#xff08;Ha…

Chiplet技术概览

一、概览 chiplet技术顺应了芯片生产与集成技术发展的趋势&#xff0c;也开拓了半导体技术发展的新的发展方向&#xff0c;将创造出一种新的芯片设计和商业模式 1.1 芯片生产与集成技术发展的趋势 &#xff08;1&#xff09;低半径高带宽的物理连线(bandwidth / memory wall…

打开win10“启动”文件夹的2种方式

方式1&#xff1a;通过CMD命令 1.输入代码 按WinR键打开运行窗口&#xff0c;输入“shell:Common Startup”代码。 2.点击确定 点击下面的确定按钮&#xff0c;运行代码。 3.打开文件夹 弹出文件夹即为系统启动文件夹。 方式2&#xff1a;输入路径 1.打开文件管理器 打…

【城市开发者职业成长交流 - 重庆】加强交流,共创成长:重庆程序员的线下交流会总结

周五睡觉前&#xff0c;我把窗帘拉的严严实实&#xff0c;所有的闹钟全部取消&#xff0c;甚至另外一只电话直接关机掉&#xff0c;为的是第二天可以好好的躺到自然醒&#xff0c;我其实也不知道具体的几点&#xff0c;就感觉连上被踩&#xff01;无奈的睁开眼睛&#xff0c;看…

基于WEB的院校课程管理系统设计与实现(论文+源码)_kaic

摘要 课程管理是学校管理工作的核心&#xff0c;是最为繁琐也最容易出错的工作&#xff0c;开发和 应用课程管理系统能够让课程管理工作人员从繁琐的工作中解脱出来&#xff0c;提高课程 管理的工作效率[1]&#xff0c;实现课程管理的信息化。虽然目前高职院校应用的课程管理系…

bigdata.com《大数据计算框架》样题

容量单位从小到大的顺序依次为&#xff1a;TB、PB、EB、ZB。 . 用于设置环境变量的文件是 .bash_profile . 将HDFS文件下载到本地的命令是 hadoop fs -get。 . 不需要Java环境的支持是 MySQL . 通配符是用于模糊匹配的特殊字符&#xff0c;可以在关键字查询中使用。在MySQL…

助你面试一臂之力,认识银行测试

我们知道软件测试是为了保证软件的质量和可靠性而在新软件系统上线之前对软件进行的质量检测工作。通过软件测试这个过程找出软件中的错误&#xff0c;分析错误的产生原因和容易产生错误的区域&#xff0c;进而有针对性的设计测试方法提高软件测试的效率。 以上简单讲述了一下…

k8s 之网络组件-Calico(十九)

下载资源 &#xff1a;安装 kubernetes 网络组件-Calico 一&#xff0c;简介 Calico是Kubernetes生态系统中另一种流行的网络选择。虽然Flannel被公认为是最简单的选择&#xff0c;但Calico以其性能、灵活性而闻名。Calico的功能更为全面&#xff0c;不仅提供主机和pod之间的网…

【深入浅出密码学】离散对数

群相关知识点 离散对数相关 ## 蛮力搜索 对于解决 α x β \alpha^{x} \beta αxβ,我们不断地选取合适地 x x x,计算 a x a^x ax&#xff0c;直到找到满足这个等式的 x x x&#xff0c;时间复杂度 O ( ∣ G ∣ ) O(|G|) O(∣G∣). Baby-Step Giant-Step 对于解决 α x β…