原视频https://www.bilibili.com/video/BV1vx411f7hA?from=search&seid=16681595996688576491
作者:等等小姐姐
发布与订阅系统
我们可以想象一个校园论坛, 比如生产者把文章发布到论坛上,消费者接受文章(阅读文章)
当业务线变多时,我们的程序通信链路就会变得复杂。
当然不止这样如果还有更多呢
缺点:
当每个通信线路单独运行时,团队有可能会做重复的操作,会资源浪费
信息过多。无法同步时会造成信息丢失
各个程序相互依赖,耦合度太高
解决方法
消息,生产者,消费者
消息:数据库的一条数据
生产者发布消息
消费者接收消息
问题:不同的消费者想要的不一样怎么办?
主题(topic)
如果我只要看,校园论坛的篮球,我只要订阅论坛篮球主题就OK了
分区(partition)
1. 指定分区
2. 不指定分区
分区器会根据键来进行分区
键:一个标示
分区器:一个算法
- 顺序读取
-
分区的下标都是唯一的
会用一个大的broker 会有一个控制器,来分发,监控作用
broker1等于 broker2的数据,第一安全不会数据丢失,第二
当然是不会这么简单的。这是个大概而已,
比如
我们先分析一波。每个的身份
首先我们是分布式订阅系统肯定是要集群的那么同一个主题,在别的服务器就叫副本,那我总结一下吧,
当我们同一个主题,在集群中会有一个大哥叫leader,。其他都是小弟,小弟还有一个名字叫follower,大哥只能有一个,小弟可以有多个
kafka工作流程
生产者要发消息,生产者会找到我那个主题的大哥,然后把消息给大哥,大哥收到消息会找个地方储存起来,当大哥储存起来后,小弟知道大哥存贮成功后,会主动来找大哥复制一份消息,当小弟复制完并且存贮起来后,就会返回一个标示(ack),告诉大哥我存贮成功了,当大哥收到所有小弟的标示(ack),大哥就会向生产者发送一条标示(ack),来告诉生产者,我和我的小弟都存贮了一份成功了,然后在把消息发给消费者
1.⽣产者从Kafka集群获取分区leader信息
2.⽣产者将消息发送给leader
3.leader将消息写入本地磁盘
4.follower从leader拉取消息数据
5.follower将消息写入本地磁盘后向leader发送ACK
6.leader收到所有的follower的ACK之后向生产者发送ACK