加入收藏 | 设为首页 | 会员中心 | 我要投稿 衡阳站长网 (https://www.0734zz.cn/)- 数据集成、设备管理、备份、数据加密、智能搜索!
当前位置: 首页 > 运营中心 > 建站资源 > 优化 > 正文

微服务架构之–消息队列Kafka图解最全知识点

发布时间:2019-09-23 19:11: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执行完毕。

(编辑:衡阳站长网)

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

热点阅读