持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第 30 天,点击查看活动详情
1 前言
kafka 作为一个高性能、高吞吐量的分布式发布订阅消息系统,在开发过程中的应用场景十分广泛,kafka 的高性能体现在磁盘顺序写(增加了 IO 性能)、页面缓存技术、批量发送机制、零拷贝以及数据压缩算法。在本文中将分享一些 kafka 的其它一些技术点。
2 kafka 怎么处理消息丢失
消息丢失是所有的消息服务中间件都需要考虑的问题,在前文中已经讲述了 rabbitmq 面对数据丢失的解决方案,同样的 kafka 也需要采用消息的确认机制。
-
1 在消息发送时,kafaka 一般是集群部署,通过 ack 来标记消息,ack = 0 时不进行重试, ack = 1 时,只要消息写入 lead 时即返回给发送者,ack=all 则表示消息同步至 ISR 集合时才返回成功给生产者。
-
2 消息的持久化,在 kafka 集群中,消息需要从 leader 节点同步至 ISR 集合中,才算是完成消息的存储,这消息持久化方面 kafka 表现相当优异。
-
3 消息的消费,消息消费者在消费消息时,需要先消费消息,然后再 commit 就可以。
3 消费消息 pull or push
目前 mq 在消费消息时,都需要考虑使用 pull or push 模式, pull 模式的优点就是可以根据 consumer 的消费能力拉取,可以控制速率,可以批量拉取也可以单条拉取。缺点就是如果没有消息时,就会产生空循环,消耗资源。 push 模式优点是不会导致 consumer 循环等待,缺点是速率不固定,忽略 consumer 的消费能力,当消费者资源不足时可能拒绝服务或者网络堵塞的情况。kafka 采用的模式就是 pull 模式。
4 kafka 的高性能
kafka 是基于磁盘而不是硬盘存储,因此消息的存储能力比较强。磁盘顺序写的速度可以接近内存,kafka 消息的都是追加的操作,partition 是有序的,节省了磁盘的寻址时间,同时可以通过批量写节省 io 操作时间,同时 partition 物理上分为多个 segment 进行存储,也方便数据的删除。
此外 kafka 操作磁盘采用了零拷贝的技术,打打提高了 io 的效率,kafka 主要使用操作系统的页缓存,如果数据的生产和消费速率相当,那么直接使用页缓存进行数据交换,不需要经过磁盘 IO,进一步提升了数据的存取速度。
5 总结
在本文中,主要讲述了 kafka 相关的知识点,有关 kafka 高性能的原因、kafka 是如何处理消息丢失的以及 kafka 消息消费的模式等内容。在后续的文章中将会继续讲述 mq 相关的内容,欢迎关注。