• 简单谈谈对云原生领域MQ组件kafka的理解


    1. 定义:

    kafka具备大吞吐量,内置分区,可以进行数据备份,同时具备数据容错性的消息系统。

    kafka主要特点体现如下:

    1. Kafka可以完成在线或者离线数据消费,所谓离线数据消费实际上就是kafka将消息数据保留在磁盘上。
    2. kafka会做数据备份,防止节点宕机从而导致数据丢失。
    3. 和spark产品的整合性非常好,可以完成实时的流式大数据分析
    4. 理论上,kafka的节点可以无限扩容

    2. 消息系统:

    定义

    1. 将数据从一个应用程序传递到另一个应用程序,通过提供消息传递和消息排队模型,它可以在分布式环境下扩展进程间的通信。
    2. 分布式系统利用消息系统,在多应用之间进行高效、稳定、安全的数据传递。
    3. 应用场景有跨系统数据传递、高并发流量削峰、数据异步处理。

    两种消息模式:

    1. 点对点:若干个生产和消费者,处理队列当中的数据,一旦该数据被消费,则从队列当中被移除。(多线程:生产消费者模型)
    2. 发布-订阅:消息是被保留在主题当中,消费者一个消费一个或者若干个主题当中的消息

    3. kafka的一些概念

    1. 术语:

    术语术语
    Topics(主题)Kafka Cluster(Kafka集群)
    Partition(分区)Producers(生产者)
    Partition offset(分区偏移)Consumers(消费者)
    Replicas of partition(分区备份)Leader(领导者)
    BrokersFollower(追随者)

    2. 发布和订阅的流程

    1. 生产者向topic当中提交消息,Brokers将topic当中的数据在对应的分区当中依次保存;
    2. 消费者向Brokers请求获取消息,Brokers向消费者提供偏移量,消费者根据偏移量要求获取消息。
    3. 消费者排队的前提,消费者数量大于分区数量
    4. 同一个消费者组内的消息不会重复消费。

    3. 生产者:

    主要是消息提供者,根据业务需要往指定的topic推消息,一般也俗称为消息的上游。

    4. 消费者:

    1. 要指定消费者的分组:默认情况下,分组是test
    2. 消费者可以同时消费若干个topic:
      1. 消息是已key-value格式进行发送
      2. 每个key如果重复发送,其偏移量会递增
      3. 新key的偏移量从0开始
    3. 消费者要放在一个独立的线程当中,才能始终处于消费状态
    4. Spring是没有办法直接给线程当中进行依赖注入的
    5. 消费者的线程如果要通知其他的任务执行,需要从Spring的bean当中获取相关的业务对象

    5. kafka写消息的路由策略

    1. 如果指定分区:直接使用分区进行路由
    2. 指定了key,但是没有指定分区,那么会对key进行hash运算,通过运算的值得到一个分区
    3. 如果都没指定,那么会轮询写入一个分区

    6. kafka写硬盘:

    1. 传统写硬盘是随机写
    2. kafka是顺序写硬盘,是随机写硬盘速度的6000倍
    3. 写数据的流程
      1. 首先找到leader
      2. 将消息写入leader的日志文件
      3. Followers(包含ISR中的成员,也包含不在ISR中的成员)会同步leader当中的消息,同步完以后会向leader发送一个ACK确认。
      4. leader在接收到isr所有成员的ACK确认后,正式提交commit保存

    7. kafka的消息安全策略:

    1. 默认是保证一定成功(同步)
    2. 不重复发送,不保证成功(异步)

    8. kafka的备份:

    1. 备份是由分区来创建的
    2. 一个分区有1个leader和0-n个follower,只要leader不宕机,所有的follower都宕机了也不影响读写。follower只负责数据备份,不负责数据读写。

    9. Kafka的isr:

    1. 同步备份:保证isr集合当中至少存活一个,如果leader不挂,正常提供服务,如果leader挂了,重新选leader然后提供服务;每个分区都有自己的isr
      1. 备份的算法:
      1. 分区:分区编号,取余代理数量 (p_i mod b_num)
      2. 备份:分区编号 + 备份编号之和, 取余 代理数量(p_i+r_j) mod b_num
    2. 判定存活:配置延时replica.log.max.messages,replica.log.time.max.ms来判定是否宕机
    3. kafka如何解决zookeeper的压力的
      1. Kafka有容器机制
      2. 每一个代理会创建一个新的容器
      3. 容器负责维护leader的读写,和选举
    4. leader是在zk上竞争创建节点来获取leader资格,如果leader宕机,选举策略是所有的follower(ISR当中保存的成员)重新竞争创建节点,获取leader资格;容器会记录新的leader,并保持
    5. 如果所有的ISR成员都死亡:
      1. 等待ISR成员任意一个苏醒,但是这个过程是不可控的
      2. 默认:只要有一个不是isr的成员存活,把这个作为新的leader。但是并不能保证这个成员是否数据和原本leader数据一致。

    10. kafka的数据保存:

    1. Kafka的日志分为两种,一种是运行日志;还有一种是用于保存消息的日志;
    2. 一个分区对应日志当中的一个目录
      1. 索引文件
      2. 数据文件
        1. 数据长度
        2. 数据类型
        3. 时间戳
        4. 偏移量
        5. Key
        6. Value
        7. 头信息
      3. 数据保留策略
        1. 时间:
        2. 大小:
        3. 注意:清理数据对kafka的读写没有任何影响
        4. Kafka是在硬盘磁道上进行顺序读写,所以性能和文件大小没有任何关系

    11. topic的创建和删除流程:

    1. 创建topic,是首先获取代理的ids,然后将这些ids组成一个isr,作为一个新的容器
    2. 删除topic:
      1. 默认情况下delete.topic.enable=false;也就是被删除的节点会被移入zk的这个节点/admin/delete_topics
      2. 要彻底删除
      1. delete.topic.enable=true:一旦删除,容器会清空在/admin/delete_topics节点上的监听
      2. auto.create.topics.enable=false:自动创建主题,如果他为true,那么只要还有一个用户在往这个主题当中写消息,这个主题就不会真正被删除。即便是你已经删了,他依然还会创建一个出来。
  • 相关阅读:
    .NET Core多线程 (3) 异步 - 下
    高效接口重试机制的实现
    微信小程序中使用Behavior混入
    Java学习笔记 --- 集合选型规则
    Kafka多生产者消费者自动配置
    React面试题:React.Component和React.PureComponent的区别?
    新库上线 | CnOpenData中国星级酒店数据
    linux安装opencv
    sed命令使用总结
    TypeError: copytree() got an unexpected keyword argument ‘dirs_exist_ok‘
  • 原文地址:https://blog.csdn.net/a1774381324/article/details/125463522