如何设计一个kafka(理解)

因业务需要而对消息中间件的频繁使用后,每次总会问自己一个问题:kafka为什么快?然后再去背一背八卦找找答案。直到近日终于能站在一个新奇的角度理解kafka,且积累的各种细节串通了起来,实属惊喜。

回到最开始的问题:kafka为什么快?或者换个问法,为何使用kafka?再换个问法,如果你是产品经理,你会如何使用kafka?是不是一头雾水,不知道从什么角度回答,有种说不出接口的感觉。其实你是知道的,就差将这些理解串起来。

记住这三个问题。提到kafka,就离不开kafka的三个关键概念:partition(分区),broker(代理)、副本。

现在将自己当成一个产品经理,产品中涉及到多个微服务,服务之间需要传递消息,服务会发送消息,也会接收消息,那么如何管理消息(生产-消费)是我们要解决的

最开始我们只有一台机子,所有相同的消息放在一个队列中,例如支付相关的消息对应一个队列,队列取名为Topic A;

发送的消息尾追队列,需要处理的消息按顺序从头消费。

后来,发现用户太多,都在排队等一个队列,效率不高。因此,建议将支付相关的消息平均存放在多个队列中,这样就保证可以多个消息一起处理。这就是分区 partition

后来,发现即使分区了,所有消息的读写压力都在服务器1上,因此购入服务器2希望分担一下压力。

如将Topoc A的部分 分区放到服务器2上。这就是 分区可以在多个服务器上

此时,我们就要考虑安全因素了。万一服务器1宕机了,岂不是消息都丢失了,服务器2也只能干着急,帮不了一点忙。因此需要将消息进行备份,且将备份的数据放在其他服务器上。

生产者 生产了消息------->将其保存到副本1(副本1:Leader)-----副本1同步给副本2(副本2:Follower)----副本1同步给副本3(副本3:Follower)

这些副本其实就是保存消息的文件

这样,即使服务器1宕机了,也就是副本a1-1 的消息丢失了,服务器2的副本a1-2 就变成了新的Leader,重启服务器1后,生产者与新的leader交互。这就是 多副本

此外,产品越做越大,不同类别的消息越来越多,有支付类的TopicA ,有音频类的 TopicB,有图文类的Topic C。定义一个控制器(Broker),让其负责这些Topic的创建、保证消息负载均衡的分配在多个分区。(如按照轮询策略,将第一条消息放在分区a1,第二条消息放在分区a2,第三条消息放在分区a1...还有其他的分配方式,可以指定不同的分区器)这就是Broker

此时还要考虑安全,万一服务器broker1失效了,怎么办

分区、多副本、Broker这三个概念就是kafka的核心。

根据业务发展,从0到1渗透讲解kafka是如何实现消息管理。

现在回到前面的问题:

kafka为什么快?或者换个问法,为何使用kafka?再换个问法,如果你是产品经理,你会如何使用kafka?

立马想到分区、多副本、Broker,并能结合业务讲出自己的理解,这些问题都可以不攻自破!

在此基础上,可以深究Api使用、多业务场景下kafka的解决方案等等。

相关推荐
x***58707 分钟前
后端分布式缓存一致性哈希,Java实现
分布式·缓存·哈希算法
.豆鲨包21 分钟前
【Android】深入理解Activity的生命周期和IntentFilter
android·java
lkbhua莱克瓦2429 分钟前
集合进阶6——TreeMap底层原理
java·开发语言·笔记·学习方法·hashmap
JEECG低代码平台33 分钟前
GitHub 十大 Java 语言 AI 开源项目推荐
java·人工智能·github
小咖张37 分钟前
idea 启动失败,不加载自己的配置文件
java·ide·intellij-idea
m***119044 分钟前
使用IDEA环境编译Spring源码及spring源码调试环境搭建
java·spring·intellij-idea
代码程序猿RIP1 小时前
【C++开发面经】全过程面试问题详解
java·c++·面试
2501_941144421 小时前
Java、C# 与 C++:编程语言的选择与应用场景分析
kafka
whatever who cares1 小时前
Java/Android中BigDecimal的相关操作
android·java·开发语言
烤麻辣烫1 小时前
黑马程序员苍穹外卖(新手) DAY3
java·开发语言·spring boot·学习·intellij-idea