如何设计一个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的解决方案等等。

相关推荐
notillusion8 分钟前
KWW#71843
java·php·程序优化
Deschen37 分钟前
设计模式-抽象工厂模式
java·设计模式·抽象工厂模式
齐木卡卡西在敲代码42 分钟前
java流式编程学习
java
ʚ希希ɞ ྀ1 小时前
SpringBoot的学习
java·spring boot·学习
notillusion1 小时前
TRX#22597
java·php·程序优化
shinelord明1 小时前
【大数据技术实战】Kafka 认证机制全解析
大数据·数据结构·分布式·架构·kafka
冬天的雪20082 小时前
java内存性能优化工具Mat
java·开发语言
Le1Yu2 小时前
消息队列以及RabbitMQ的使用
java·开发语言
羚羊角uou2 小时前
【Linux】线程池
java·开发语言