加入收藏 | 设为首页 | 会员中心 | 我要投稿 河北网 (https://www.hebeiwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 建站 > 正文

微处事架构之–动静行列Kafka图解最全常识点

发布时间:2019-09-25 22:43:25 所属栏目:建站 来源:互联网架构师精髓
导读:MQ(动静行列)是跨历程通讯的方法之一,可领略为异步rpc,上游体系对换勤奋效的立场每每是重要不紧张。行使动静行列有以下甜头:营业解耦、流量削峰、机动扩展。接下来先容动静中间件Kafka。 Kafka是什么? Kafka是一个漫衍式的动静引擎。具有以下特性 可以或许
副问题[/!--empirenews.page--]

MQ(动静行列)是跨历程通讯的方法之一,可领略为异步rpc,上游体系对换勤奋效的立场每每是重要不紧张。行使动静行列有以下甜头:营业解耦、流量削峰、机动扩展。接下来先容动静中间件Kafka。

微处事架构之–动静行列Kafka图解最全常识点

Kafka是什么?

Kafka是一个漫衍式的动静引擎。具有以下特性

  • 可以或许宣布和订阅动静流(相同于动静行列)
  • 以容错的、耐久的方法存储动静流
  • 多分区观念,进步了并行手段

Kafka架构总览

微处事架构之–动静行列Kafka图解最全常识点

Topic

动静的主题、行列,每一个动静都有它的topic,Kafka通过topic对动静举办归类。Kafka中可以将Topic从物理上分别成一个或多个分区(Partition),每个分区在物理上对应一个文件夹,以”topicName_partitionIndex”的定名方法定名,该dir包括了这个分区的全部动静(.log)和索引文件(.index),这使得Kafka的吞吐率可以程度扩展。

Partition

每个分区都是一个 次序的、不行变的动静行列, 而且可以一连的添加;分区中的动静都被分了一个序列号,称之为偏移量(offset),在每个分区中此偏移量都是独一的。

producer在宣布动静的时辰,可觉得每条动静指定Key,这样动静被发送到broker时,会按照分区算法把动静存储到对应的分区中(一个分区存储多个动静),假如分区法则配置的公道,那么全部的动静将会被匀称的漫衍到差异的分区中,这样就实现了负载平衡。

微处事架构之–动静行列Kafka图解最全常识点

Broker

Kafka server,用来存储动静,Kafka集群中的每一个处事器都是一个Broker,斲丧者将从broker拉取订阅的动静

Producer

向Kafka发送动静,出产者会按照topic分动员静。出产者也认真把动静关联到Topic上的哪一个分区。最简朴的方法从分区列表中轮番选择。也可以按照某种算法依照权重选择分区。算法可由开拓者界说。

Cousumer

Consermer实例可所以独立的历程,认真订阅和斲丧动静。斲丧者用consumerGroup来标识本身。统一个斲丧组可以并发地斲丧多个分区的动静,统一个partition也可以由多个consumerGroup并发斲丧,可是在consumerGroup中一个partition只能由一个consumer斲丧

CousumerGroup

Consumer Group:统一个Consumer Group中的Consumers,Kafka将响应Topic中的每个动静只发送给个中一个Consumer

Kafka producer 计划道理

发送动静的流程

微处事架构之–动静行列Kafka图解最全常识点

1.序列化动静&&.计较partition

按照key和value的设置对动静举办序列化,然后计较partition:

ProducerRecord工具中假如指定了partition,就行使这个partition。不然按照key和topic的partition数量取余,假如key也没有的话就随机天生一个counter,行使这个counter来和partition数量取余。这个counter每次行使的时辰递增。

2发送到batch&&叫醒Sender 线程

按照topic-partition获取对应的batchs(Dueue ),然后将动静append到batch中.假若有batch满了则叫醒Sender 线程。行列的操纵是加锁执行,以是batch内动静时有序的。后续的Sender操纵当前要领异步操纵。

微处事架构之–动静行列Kafka图解最全常识点
微处事架构之–动静行列Kafka图解最全常识点

3.Sender把动静有序发到 broker(tp replia leader)

3.1 确定tp relica leader 地址的broker

  • Kafka中 每台broker都生涯了kafka集群的metadata信息,metadata信息里包罗了每个topic的全部partition的信息: leader, leader_epoch, controller_epoch, isr, replicas等;Kafka客户端从任一broker都可以获取到必要的metadata信息;sender线程通过metadata信息可以知道tp leader的brokerId
  • producer也生涯了metada信息,同时按照metadata更新计策(按期更新metadata.max.age.ms、失效检测,逼迫更新:搜查到metadata失效往后,挪用metadata.requestUpdate()逼迫更新
  1. public class PartitionInfo { 
  2.  
  3. private final String topic; 
  4.  
  5. private final int partition; 
  6.  
  7. private final Node leader; 
  8.  
  9. private final Node[] replicas; 
  10.  
  11. private final Node[] inSyncReplicas; 
  12.  
  13. private final Node[] offlineReplicas; 
  14.  

3.2 幂等性发送

为实现Producer的幂等性,Kafka引入了Producer ID(即PID)和Sequence Number。对付每个PID,该Producer发送动静的每个

  • 假如动静序号比Broker维护的序号差值比一大,声名中间稀有据尚未写入,即乱序,此时Broker拒绝该动静,Producer抛出InvalidSequenceNumber
  • 假如动静序号小于便是Broker维护的序号,声名该动静已被生涯,即为一再动静,Broker直接扬弃该动静,Producer抛出DuplicateSequenceNumber
  • Sender发送失败后会重试,这样可以担保每个动静都被发送到broker

4. Sender处理赏罚broker发来的produce response

一旦broker处理赏罚完Sender的produce哀求,就会发送produce response给Sender,此时producer将执行我们为send()配置的回调函数。至此producer的send执行完毕。

(编辑:河北网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读