kafkaspring boot转载的写得较好的文章

阿里面试,为什么Kafka不支持读写分离

2019-05-11  本文已影响250人  美团Java
image

还在加班,收到一个小伙伴的吐槽:狼哥,阿里的面试太变态了,我只是在工作中用过kafka,然后简历上提了下,就被抓着一个劲的问,一些基础的问题,我还可以勉强答出来,但是问到“为什么Kafka不支持读写分离”,我就懵逼了。

说实话,这个狼哥也不知道,对于kafka,我也只会生产、消费。

image

一直没有接触过kafka相关的知识,为了拓展一下技术广度,找到了我厮大

为什么数据库、redis都支持了读写分离功能,而kafka却没有?

厮大也是狠人,直接打开源码从头开始讲,我一看这情况不对,按照这进度得讲到天黑了,蹭着厮大上厕所的空隙,我呲溜跑了~~~

image.gif

厮大估计见我已经呲溜了,第二天就甩我一篇文章,还是热乎的,文末还有精华

从代码层面上来说,在 Kafka 中完全可以支持这种功能,但是会大大增加代码的复杂度,所以我们要从“收益点”这个角度来做具体分析。主写从读可以让从节点去分担主节 点的负载压力,预防主节点负载过重而从节点却空闲的情况发生。但是主写从读也有 2 个很明 显的缺点:

现实情况下,很多应用既可以忍受一定程度上的延时,也可以忍受一段时间内的数据不一 致的情况,那么对于这种情况,Kafka 是否有必要支持主写从读的功能呢?

主写从读可以均摊一定的负载却不能做到完全的负载均衡,比如对于数据写压力很大而读 压力很小的情况,从节点只能分摊很少的负载压力,而绝大多数压力还是在主节点上。而在 Kafka 中却可以达到很大程度上的负载均衡,而且这种均衡是在主写主读的架构上实现的。我们来看 一下 Kafka 的生产消费模型,如下图所示。

image.gif

在 Kafka 集群中有 3 个分区,每个分区有 3 个副本,正好均匀地分布在 3个 broker 上,灰色阴影的代表 leader 副本,非灰色阴影的代表 follower 副本,虚线表示 follower 副本从 leader 副本上拉取消息。当生产者写入消息的时候都写入 leader 副本,对于图 8-23 中的 情形,每个 broker 都有消息从生产者流入;当消费者读取消息的时候也是从 leader 副本中读取 的,对于图 8-23 中的情形,每个 broker 都有消息流出到消费者。

我们很明显地可以看出,每个 broker 上的读写负载都是一样的,这就说明 Kafka 可以通过 主写主读实现主写从读实现不了的负载均衡。上图展示是一种理想的部署情况,有以下几种 情况(包含但不仅限于)会造成一定程度上的负载不均衡:

对此,我们可以做一些防范措施。针对第一种情况,在主题创建的时候尽可能使分区分配 得均衡,好在 Kafka 中相应的分配算法也是在极力地追求这一目标,如果是开发人员自定义的 分配,则需要注意这方面的内容。对于第二和第三种情况,主写从读也无法解决。对于第四种 情况,Kafka 提供了优先副本的选举来达到 leader 副本的均衡,与此同时,也可以配合相应的 监控、告警和运维平台来实现均衡的优化。

所以,从某种意义上来说,主写从读是由于设计上的缺陷而形成的权宜之计。

image

昨天,厮大打磨2月的电子版悄然上线——“图解 Kafka系列”,其内容源自《深入理解Kafka》一书,相当于此书的电子版,内容基本一致,只是在内容编排上做了一定的修改,目前新上还打8折更便宜,扫码下方二维码即可。

image
上一篇下一篇

猜你喜欢

热点阅读