中间件-消息队列
消息队列的定义
以队列的形式存储的消息的容器,支持高并发、高可吞出,高可用
消息队列的发展历程
消息队列从刚开始的TIB到现在的 ActiveMQ RabbitMQ等以及存算分离的 Pulsar 极大的促进互联网的发展(程序的互联互通 消息的订阅和发布)
- Kafka - 分布式 分区多副本的日志服务,具备高吞吐的能力
- RocketMQ - 低延迟 强一致 高性能 高可靠 万亿级容量和灵活的扩展性(实时场景运用)
- Pulsar - 云原生分布式消息流平台 集合了消息 存储以及轻量化函数为一体的存算分离架构
- BMQ - 和Pular也是采用存算分离的形式,适用于高吞吐离线的业务,在某些方面兼容 Kafka
消息队列 Kafka
适用场日志服务的场景
- 搜索
- 直播
- 订单
- 支付
Note:用户的搜索 点赞 评论和收藏等行为
Kafka 的使用的步骤
- 创建 Kafka 集群
- 在集群中创建 Topic
- 引入对应语言的 SDk 并配置集群以及 Topic等相关参数,初始化 Producer 然后调用 Send 方法
- 引入对应语言的 SDk 并配置集群以及 Topic等相关参数,初始化 Consumer 然后调用 Poll 方法
- Topic 逻辑队列,每一个 Topic可以建立一个队列
- Cluster 物理集群,一个集群可以建立多个 Topic
- Producer 生产者,将消息发送到 Topic 中
- Consumer 消费者,负责消费 Topic 的信息
- ConsumerGroup 消费组 不同组 Consumer 的不互相干扰
Replica 一个分片存在多个 Replica 这之中的 领导者将会从 ISR 中进行选举
在 Kafka 中的 zookeeper 存储集群的相关数据的元信息以及分区的分配信息
在 Kafka 中 Producer 为了减少数据信息的大小,我们可能会通过Snappy(default) Gzip LZ4 ZSTD 压缩算法对数据进行压缩
为了加快数据的读写效率 Broker 采用的是顺序读写
Consumer 通过 FetchRequest 请求数据,Broker 则会将 offset 处的信息(采用二分法,找到小于目标 offset 的最大文件),按照时间窗口以及消息大小窗口进行响应
Borker 的零拷贝
- 通常情况下数据的拷贝是通过系统调用对磁盘数据进行读取,返回给用户态的下的用户,而用户会再调用另一个系统调用进行数据的写入
- 这个过程有多次系统调用,对资源的消耗是较大的
- 所以我们可以直接在 Broker 中,读入缓冲区后直接写入 socket buffer,实现快速写入(采用 mmap 映射)
目前 Kafka 存在的问题
- 运维成本较高
- 对于负载均衡的场景,解决较为复杂
- 过度依赖 Page Cache 没有缓存
- Controller & Coordinstor 和 Broker 处于同一进程,IO 的性能不佳