图解 Kafka,画得太好了!
Posted Java技术栈
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了图解 Kafka,画得太好了!相关的知识,希望对你有一定的参考价值。
点击关注公众号,Java干货及时送达
Kafka 是主流的消息流系统,其中的概念还是比较多的,下面通过图示的方式来梳理一下 Kafka 的核心概念,以便在我们的头脑中有一个清晰的认识。
基础
Kafka 是一套流处理系统,可以让后端服务轻松的相互沟通,是微服务架构中常用的组件。
![](https://image.cha138.com/20210525/a25a391b510e4d55a6fb2d9ad59000cd.jpg)
生产者消费者
生产者服务 Producer 向 Kafka 发送消息,消费者服务 Consumer 监听 Kafka 接收消息。
![](https://image.cha138.com/20210525/cd922a4ab5fc4185ba961223874c51cd.jpg)
一个服务可以同时为生产者和消费者。
![](https://image.cha138.com/20210525/41c07ec06d76483ca18cbff12f5af46b.jpg)
Topics 主题
Topic 是生产者发送消息的目标地址,是消费者的监听目标。
![](https://image.cha138.com/20210525/dbfdc47db55e42c5a3ee17a400abd41d.jpg)
一个服务可以监听、发送多个 Topics。
![](https://image.cha138.com/20210525/41d305c1ed374b9895c3d47fd94ae62b.jpg)
Kafka 中有一个【consumer-group(消费者组)】的概念。
这是一组服务,扮演一个消费者。
![](https://image.cha138.com/20210525/c385b5777bea457cb0ccf01e2c4aa14c.jpg)
如果是消费者组接收消息,Kafka 会把一条消息路由到组中的某一个服务。
![](https://image.cha138.com/20210525/ce52ecdaeecb43b7925581608e66456f.jpg)
这样有助于消息的负载均衡,也方便扩展消费者。
Topic 扮演一个消息的队列。
首先,一条消息发送了。
![](https://image.cha138.com/20210525/e9d13e05aeba47b69293044430981e1a.jpg)
然后,这条消息被记录和存储在这个队列中,不允许被修改。
![](https://image.cha138.com/20210525/9a8c51ccf30a415581a27a80cb7c3736.jpg)
接下来,消息会被发送给此 Topic 的消费者。
但是,这条消息并不会被删除,会继续保留在队列中。
![](https://image.cha138.com/20210525/b34924a553564dbd84f4ff87bb72b502.jpg)
继续发送消息。另外,关注公众号Java技术栈,在后台回复:面试,可以获取我整理的 Java 系列面试题和答案,非常齐全。
![](https://image.cha138.com/20210525/41aca576159a4ce184edebf726d35ce3.jpg)
像之前一样,这条消息会发送给消费者、不允许被改动、一直呆在队列中。
(消息在队列中能呆多久,可以修改 Kafka 的配置)
![](https://image.cha138.com/20210525/c739855e5ce14cb6a2ac178405a036e1.jpg)
![](https://image.cha138.com/20210525/f5285b62f5934238abdd84e8480d1532.jpg)
Partitions 分区
上面 Topic 的描述中,把 Topic 看做了一个队列,实际上,一个 Topic 是由多个队列组成的,被称为【Partition(分区)】。
这样可以便于 Topic 的扩展。
![](https://image.cha138.com/20210525/4dd0d21ba5684c8c869a002fd7d6bd37.jpg)
生产者发送消息的时候,这条消息会被路由到此 Topic 中的某一个 Partition。
![](https://image.cha138.com/20210525/26a26aff637d4666b85d3dc3cb9cd54d.jpg)
消费者监听的是所有分区。
![](https://image.cha138.com/20210525/9b19822abf7048b69064a9b211d0e112.jpg)
生产者发送消息时,默认是面向 Topic 的,由 Topic 决定放在哪个 Partition,默认使用轮询策略。
![](https://image.cha138.com/20210525/3cd63bc7b8e74afdb6e10b2b2972506b.jpg)
也可以配置 Topic,让同类型的消息都在同一个 Partition。
例如,处理用户消息,可以让某一个用户所有消息都在一个 Partition。
例如,用户1发送了3条消息:A、B、C,默认情况下,这3条消息是在不同的 Partition 中(如 P1、P2、P3)。
在配置之后,可以确保用户1的所有消息都发到同一个分区中(如 P1)。
![](https://image.cha138.com/20210525/74fea0e060d6496d9990a1d69576db28.jpg)
这个功能有什么用呢?
这是为了提供消息的【有序性】。
消息在不同的 Partition 是不能保证有序的,只有一个 Partition 内的消息是有序的。
![](https://image.cha138.com/20210525/466630c61d15468b939b57ef84e2aded.jpg)
![](https://image.cha138.com/20210525/5ff3dbeb3cb04c72b18d39bd3e1a0e91.jpg)
架构
Kafka 是集群架构的,ZooKeeper是重要组件。
![](https://image.cha138.com/20210525/2cc0042774f644a7a925e7a537ef086e.jpg)
ZooKeeper 管理者所有的 Topic 和 Partition。
Topic 和 Partition 存储在 Node 物理节点中,ZooKeeper负责维护这些 Node。
![](https://image.cha138.com/20210525/4772ea53ca224374a7be93b85d7d71eb.jpg)
例如,有2个 Topic,各自有2个 Partition。
![](https://image.cha138.com/20210525/ec7be71cc39343b18616c9cb78b21e41.jpg)
这是逻辑上的形式,但在 Kafka 集群中的实际存储可能是这样的:
![](https://image.cha138.com/20210525/8009df16d86649b1889b09c54e83b1d7.jpg)
Topic A 的 Partition #1 有3份,分布在各个 Node 上。
这样可以增加 Kafka 的可靠性和系统弹性。
3个 Partition #1 中,ZooKeeper 会指定一个 Leader,负责接收生产者发来的消息。
![](https://image.cha138.com/20210525/62ad4bff4532455280bd57e6e326bf46.jpg)
其他2个 Partition #1 会作为 Follower,Leader 接收到的消息会复制给 Follower。
![](https://image.cha138.com/20210525/0df3dadbbf304de48e49e6676a614223.jpg)
这样,每个 Partition 都含有了全量消息数据。
![](https://image.cha138.com/20210525/cb93fdd092a749889efb74763ef9b76b.jpg)
即使某个 Node 节点出现了故障,也不用担心消息的损坏。
Topic A 和 Topic B 的所有 Partition 分布可能就是这样的:
![](https://image.cha138.com/20210525/486a2dbb6de74af3b6a74e53bea0a5ee.jpg)
感谢阅读,希望对你有所帮助 :) 翻译整理自:https://timothystepro.medium.com/visualizing-kafka-20bc384803e7
译文:https://blog.csdn.net/duysh/article/details/116355977
关注Java技术栈看更多干货
获取 Spring Boot 实战笔记!
以上是关于图解 Kafka,画得太好了!的主要内容,如果未能解决你的问题,请参考以下文章