前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Apache Kafka设计理念探究

Apache Kafka设计理念探究

作者头像
哒呵呵
发布2018-09-18 12:27:47
5330
发布2018-09-18 12:27:47
举报
文章被收录于专栏:鸿的学习笔记鸿的学习笔记
动机

创造一个分布式的实时流处理平台,也正是因为这个原因,Kafka选择了将日志分区和消费者群组模型。

持久化

日志的持久化依赖于文件系统,而文件系统的处理速度,在往常的观念里,应该是相当慢的。但是依赖于pagecache-centric design,文件系统的持久化获得了极大的提升。并且Kafka的日志是顺序读写,对于磁盘的定位速度也远远大于随机读写的速度,同样也因为如此,对于传统的AMQP消息系统使用B树实现queue的持久化,也是因为忽略了磁盘的随机读写会很慢,通过日志的方式则不会block写和读,也可以做到O(1)的读写效率(从日志最后读)。

效率

影响消息系统处理效率的主要有两个因素:

  • 太多小的IO操作
  • 过多的字节级复制

对于太多小的IO操作,Kafka会把一定时间内的消息先聚合内存中(“message set”),再一起写入,而不是来一条消息写一次日志。 对于过多的字节级复制,Kafka选择消费者,生产者和broker共享同一套二进制消息格式,使得操作系统可以直接将文件丢入network而不需要buffer。(zero-copy optimization,在具体的实现则是Linux中的sendfile system call方法) 此外,Kafka也提供了GZIP, Snappy and LZ4等协议压缩数据。

生产者

Kafka的生产者模型选择了生产者将数据直接发送给Topic的Master,而不是像Rabbit MQ一样需要路由(为了实现这,Kafka借助了Zookeeper,并且将元数据存储在Zookeeper之上)。除了此,Kafka将负载均衡的任务交给了客户端,客户端可以选择将消息发送到Topic中具体的哪个partition上。对于一些轻一致性,追求效率的场景,Kafka提供了异步发送的机制。

基于pull的拉取数据

Kafka没有选择和AMQP消息系统一样,由消息系统将队列里的消息推送给消费者,而是让消费者自己将Kafka的数据根据offset拉下来。相对于push的方式,Kafka认为pull会给与消费者更大的自由权,这样消费者也可以从任意的offset开始消费(自然也方便失败重试),也无需担心数据会遗漏丢失(只要消息不过期)。Kafka会使用长连接池阻塞的方式,来解决消息未到时消费者连接问题。Kafka也会保存每个消费的消费过的offset元数据,以此来提高消费者的效率。

消息唯一性保证

Kafka提供了三种消息确认机制:

  • At most once—Messages may be lost but are never redelivered.
  • At least once—Messages are never lost but may be redelivered.
  • Exactly once—this is what people actually want, each message is delivered once and only once.

Kafka在0.11.0.0开始通过给生产者的每条消息赋予全局ID,来保证消息不会被重复发送。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-08-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 鸿的学习笔记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 动机
  • 持久化
  • 效率
  • 生产者
  • 基于pull的拉取数据
  • 消息唯一性保证
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档