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 是什么

相关推荐
罗政5 小时前
[附源码]超简洁个人博客网站搭建+SpringBoot+Vue前后端分离
vue.js·spring boot·后端
懒洋洋的华3695 小时前
消息队列-Kafka(概念篇)
分布式·中间件·kafka
拾光师6 小时前
spring获取当前request
java·后端·spring
Java小白笔记8 小时前
关于使用Mybatis-Plus 自动填充功能失效问题
spring boot·后端·mybatis
happycao12310 小时前
kafka之路-01从零搭建环境到SpringBoot集成
kafka
JOJO___10 小时前
Spring IoC 配置类 总结
java·后端·spring·java-ee
happycao12310 小时前
kafka 配置自定义序列化方式
kafka
happycao12310 小时前
kafka Partition使用详解
kafka
_小许_11 小时前
Go语言的io输入输出流
golang
白总Server11 小时前
MySQL在大数据场景应用
大数据·开发语言·数据库·后端·mysql·golang·php