Kafka消息队列

目录

什么是消息队列

高可用性

高扩展性

高可用性

持久化和过期策略

[consumer group 分组消费](#consumer group 分组消费)

ZooKeeper


什么是消息队列

普通版消息队列

说白了就是一个队列,生产者生产多少,放在消息队列中存储,而消费者想要多少拿多少,按序列号消费

缓存信息

生产者与消费者解耦合

那么Kafka如何改进普通版的消息队列

高可用性

随着生产者和消费者都变多,我们会发现它们会同时争抢同一个消息队列,抢不到的一方就得等待,这不纯纯浪费时间吗!

有解决方案吗?有!

首先是对消息进行分类,每一类是一个 topic,然后根据 topic 新增队列的数量,生产者将数据按 topic 投递到不同的队列中,消费者则根据需要订阅不同的 topic。

这就大大降低了 topic 队列的压力。

但单个 topic 的消息还是可能过多,我们可以将单个队列,拆成好几段,

每段就是一个 partition 分区,每个消费者负责一个 partition。

这就大大降低了争抢,提升了消息队列的性能。

高扩展性

随着 partition 变多,如果 partition 都在同一台机器上的话,就会导致单机 cpu 和内存过高,影响整体系统性能。

于是我们可以申请更多的机器,将 partition 分散部署在多台机器上,这每一台机器,

就代表一个 broker。我们可以通过增加 broker 缓解机器 cpu 过高带来的性能问题。

高可用性

如果其中一个 partition 所在的 broker 挂了,那 broker 里所有 partition 的消息就都没了。

有解决方案吗?

我们可以给 partition 多加几个副本,也就是 replicas,将它们分为 Leader 和 Follower。Leader 负责应付生产者和消费者的读写请求,而 Follower 只管同步 Leader 的消息。

持久化和过期策略

刚刚提到的是几个 broker 挂掉的情况,那搞大点,假设所有 broker 都挂了,那岂不是数据全丢了?

为了解决这个问题,我们不能光把数据放内存里,还要持久化到磁盘中,这样哪怕全部 broker 都挂了,数据也不会全丢,重启服务后,也能从磁盘里读出数据,继续工作。

但问题又来了,磁盘总是有限的,这一直往里写数据迟早有一天得炸。

所以我们还可以给数据加上保留策略,也就是所谓的 retention policy,比如

对磁盘设置容量大小,数据设置过期时间

consumer group 分组消费

在上面我们说的消息队列,只能依靠 offset(序号) 顺序消费,那么我们相从中间的某一个开始消费呢?

给消息队列加入消费者组(consumer group)的概念:

B 和 C 服务各自是一个独立的消费者组,不同消费者组维护自己的消费进度,互不打搅。

ZooKeeper

如果组件太多了,而且每个组件都有自己的数据和状态,所以还需要有个组件去统一维护这些组件的状态信息,于是我们引入 ZooKeeper 组件。

它会定期和 broker 通信,获取 整个 kafka 集群的状态,以此判断 某些 broker 是不是挂了,某些消费组消费到哪了。

参考 -- 小白debug-消息队列 kafka 是什么

相关推荐
码事漫谈1 小时前
消除AI幻觉,普通人能做的五件事
后端
金銀銅鐵3 小时前
[Java] 用 GUI 展示 EnumSet 增减元素时的内部变化(下)
java·后端·ai编程
Mk598784 小时前
给 Agent 装上对话框 —— AgentScope-Java 接入 Spring Boot 与 SSE 流式实战
后端
付威20234 小时前
从 Loop 到 Runtime:rpi Agent Loop 与 Cordis 的边界、取舍与组合
后端
IT_陈寒5 小时前
Redis的LRU淘汰策略坑了我一整天
前端·人工智能·后端
考虑考虑6 小时前
JDK26的JEP 500属性
java·后端·java ee
Mia_墨黎6 小时前
2026 Windows 11 终端美化完全指南
前端·后端
foreverYoung7 小时前
给开源后台做等保适配,我发现了 5 个"看起来有、其实没用"的功能 从一个尴尬的现场测试说起
后端
程序猿阿越7 小时前
从 StatefulSet 到容器挂载:CSI 源码走读
后端·kubernetes·源码阅读