• Kafka大白话(●二●)


    目录

    🧡ACK应答

    🧡数据可靠性

    🧡数据重复

    🧡事务原理

    🧡数据有序


    💟这里是CS大白话专场,让枯燥的学习变得有趣!

    💟没有对象不要怕,我们new一个出来,每天对ta说不尽情话!

    💟好记性不如烂键盘,自己总结不如收藏别人!

    🧡ACK应答

    acks = 0acks = 1acks = -1
    机制生产者发完数据不接收应答生产者发完数据Leader应答生产者发完数据Leader和ISR队列里所有Follower应答
    可靠性
    效率
    使用

    传输普通日志

    允许丢数据

    传输重要数据

    不允许丢数据

    💌Leader维护一个动态的ISR(Leader+Follower),若Follower长时间没有反应,则被踢出ISR。

    🧡数据可靠性

    💌至少一次:保证数据不丢,但可能数据重复。

    ACK == -1  && 分区副本数 >= 2 && ISR里应答的最小副本数 >= 2

    1. //asks
    2. properties.put(ProducerConfig.ACKS_CONFIG,"1");
    3. //重试次数 默认int最大值2147483647
    4. properties.put(ProducerConfig.RETRIES_CONFIG,3);

    🧡数据重复

    💌在Leader应答的一瞬间挂掉了,选择一个Follower作为Leader发送应答,但是Follower本身已经同步了一份数据,因此在应答的时候数据重复了。

    💌至多一次:保证数据不重复,但可能数据丢失。

    ACK == 0

    💌精确一次:既不重复也不丢失数据。

    幂等性 && 至少一次

    💌幂等性:Broker端只会持久化一条Producer发来的同样的数据,由以下三个参数判定:

    🍠PID:每次重启分配一个新的,保证单会话内不重复。

    🍠Partition:区号。

    🍠SeqNumber:单调自增。

    🧡事务原理

    💌开启事务必须开启幂等性。每一个Broker节点都有一个事务协调器,根据唯一的事务id对50求模,确定事务存到主题的哪一个分区,分区所在的节点就是本次事务的主负责人。整体流程就是申请完事务id之后发送数据持久化请求,将数据存储到主题中,再确认数据是否真正发送成功。

    1. package com.jodie.kafka.producer;
    2. import org.apache.kafka.clients.producer.*;
    3. import org.apache.kafka.common.serialization.StringSerializer;
    4. import java.util.Properties;
    5. import java.util.concurrent.ExecutionException;
    6. /**
    7. * @author Jodie
    8. * @date 2022/9/20-18:17
    9. */
    10. public class CustomProducerTransactions {
    11. public static void main(String[] args) throws ExecutionException, InterruptedException {
    12. Properties properties = new Properties();
    13. //连接集群
    14. properties.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG,"192.168.10.102:9092,192.168.10.103:9092");
    15. //指定序列化类型
    16. //properties.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG,"org.apache.kafka.common.serialization.StringSerializer");
    17. properties.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName());
    18. properties.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG,StringSerializer.class.getName());
    19. //指定事务ID
    20. properties.put(ProducerConfig.TRANSACTIONAL_ID_CONFIG,"01");
    21. //创建生产者对象
    22. KafkaProducer kafkaProducer = new KafkaProducer<>(properties);
    23. //初始化事务
    24. kafkaProducer.initTransactions();
    25. //开启事务
    26. kafkaProducer.beginTransaction();
    27. try {
    28. kafkaProducer.send(new ProducerRecord<>("first","jodie"));
    29. //提交事务
    30. kafkaProducer.commitTransaction();
    31. }catch (Exception e){
    32. //放弃事务
    33. kafkaProducer.abortTransaction();
    34. }finally {
    35. kafkaProducer.close();
    36. }
    37. }
    38. }

    🧡数据有序

    💌在1.x版本之后保证数据单分区有序,条件如下:

    🍠未开启幂等性:max.in.flight.requests.per.connection=1。

    🍠开启幂等性:max.in.flight.requests.per.connection<=5,保证最近五个request的数据有序。

  • 相关阅读:
    ubuntu编译sqlite3并使用
    linux基础IO
    深入理解c++继承
    jvm参数查看
    瞬间抠图!揭秘 ZEGO 绿幕抠图算法背后的技术
    287_C++_TaskQueue管理任务队列和定时器(头文件.h)
    一种以RGB颜色登录的密码实现
    在Linux怎么用vim实现把一个文件里面的文本复制到另一个文件里面
    windows系统使用cmd执行.py文件并且传入参数 | 神经网络模型训练 | 主打能用就行
    好用又方便的浏览器主页,整合丰富资源,功能很齐全
  • 原文地址:https://blog.csdn.net/qq_41847894/article/details/126954244