kafka
kafka的组件
- kafka依赖zookeeper保证系统可用性集群保存一些mate信息(元)
Topics
- 一个topics可以看作为一类信息
- 每个topics分为多个partition(区)
- 每个partition在存储层面是append log 文件
- 每个发布到此区的消息会被直接追加到log文件的尾部
- 每个消息在文件中的位置成为 offset(偏移量)
- offset 是一个long型数字
- kafka没有索引机制来存储offset 几乎不支持消息的“随读随写”
- 如果消息被消费不会北直街立即删除,日志文件会根据boker中的配置要求保存一段时间之后删除
1.kafka持久性
kafka使用文件存储消息
- 对文件进行append操作
- 磁盘检索的开支是较小的
- 为了减少写入次数boker会将消息暂时buffer(缓冲)达到一定的阀值时,在flush到磁盘中
2. 性能
- 对磁盘IO 不用太多占用资源小
- 对网络IO 需要考虑 支持将消息进过压缩,有gzip/snappy等多种压缩格式
3.生产者(Producer)
3.1负载均衡
- producer会和topic下的所有partition leader 保持socket 连接,消息有producer直接通过socket发送到broker
- 消息被路由到那个partiton上由 producer客户端决定 ,可以采用“random”,"key-hash"进行轮询
3.2 异步发送
- 将多条消息暂存在客户端buffer中,并批量发送到broker
- 优点:批量延迟发送提高了网络的效率
- 缺点: producer失效时,尚未发送的数据将会丢失
4.消费者(Consumer)
- consumer 端 会向broker发送“fetch”请求,并告知其获取消息的offset,此后consumer将会获得一定条数的消息,consumer端也可以重置offset来重新获得消息
- JMS 模式采用push方式,即boker将消息推送给consumer端
- kafka采用pull方式 consumer在和broker建立连接之后,主动去pull(或者fetch)消息
- 优点 根据consumer的消费能力去获取数据并能控制offset
5.消息传送机制
- JMS :有且只有一次(exactly once)
- kafka
- at most once :最多一次和JMS中“非持久化”类似,发送一次无论成功多不会重发
- at least once :消息至少发送一次 ,未接收成功再次发送知道成功
- exactly once : 消息只会发送一次
6.复制备份
- 将每个partition数据复制到多个server上,任何一个partition有一个leader和多个follower(可以没有)备份的个数可以通过broker配置文件来设定