消息模型
点对点
生产者向消息队列发送一个消息之后,只能被一个消费者消费一次
发布/订阅
生产者向topic发送一个消息之后,多个消费者可以从该topic得到数据
作用
- 解耦:上有关注消息通知,而不关注下游处理
- 异步处理
- 缓冲(削锋):应对突发流量
- 广播:一条信息,可以被多个下游处理
- 持久化:消息可以被回溯
kafka
基本概念
role(角色)
- producer:生产者生成数据,默认情况下生产者会把一个消息均匀的分散在不同分区,但是也可以根据键和分区器将消息写入指定分区
- consumer:消费者消费数据,消费者订阅一个或多个主题,并按照消息生成的顺序消费数据;消费者通过偏移量来区分已经读取过的数据
- consumer group:消费者是消费者群组的一部分,群组保证每个分区只能被一个消费者使用,消费者和分区之间的映射关系通常又被称为所有权关系
- broker:一个独立的kafka服务器被称为broker,broker接收来自生产者的消息,为消息设置偏移量,并提交到磁盘保存。broker为消费者提供服务,对读取分区的请求作出响应,返回已经提交到磁盘的消息。根据特定的硬件以及其性能特征,一个broker能轻松应对上千个分区以及每秒百万级的并发量
consumer(消费者):
- rebalance:在一个consumer group中增加conumser会导致分区的再分配
- 群组协调器:一个特殊的broker,作为消费组的协调者。不同的群组可以有不同的协调器
- 心跳:consumer会向协调器发送信息表示自己健康状态
- 提交:更新分区当前位置的操作
offset(偏移量)
- 偏移量也是一种元数据,它是一个不断递增的整数,在给定的分区上每个消息的分区都是唯一的,消费者把每个分区读取的最后偏移量放在zookeeper或kafka上。如果消费者关闭或重启数据不会丢失。
Record(消息)
- Key-Value
- Timestamp
Topic(话题)
- 逻辑概念
- 发布-订阅均基于Topic
Partition(分区)
- 一个Topic包含一个或多个partition
- 每个partition对应物理上的一个文件夹
Segment
- 每个Segment对应物理上的一个文件
Replica(分区副本)
- leader 主副本
- follower 冗余副本
partition分区策略
kafka中会以partition为纬度进行副本存储,一个partition的所有副本被叫做AR(Assigned Replicas)。所有与副本保持一定程度同步(可配置)的副本组成ISR(In-Sync Replicas),与副本同步滞后过多的副本组成OSR(Out-of-Sync Replicas);
AR = ISR + OSR
当leader副本发生问题时,会将ISR中的第一个follower作为leader
生产者
不同的发送场景
- 发送并忘记(大部分情况下消息都能被正确的送达,因为kafka自带错误重试机制)
- 同步发送
- 异步发送
生产者信息三元组
- broker
- topic
- partition
消费者
消费者的核心是轮训,通过一个简单的轮训想服务器请求数据。一旦消费者订阅了主题,轮训就会处理所有细节,包括群组协调、分区再均衡、发送心跳、获取数据
在同一个群组中,我们无法让一个线程运行多个消费者,也无法让多个线程安全的共享一个消费者。按照规则,一个消费者使用一个线程。
消费者消息三元组
- broker
- topic
- partition
- offset
consumer与consumer group
如何实现安全的rebalance以及避免不必要的rebalance?
- 群主:第一个加入该消费组的消费者
- 只有群主能掌握全部消费者分区信息,其他消费者只知道自己的分区信息
提交和偏移量
消费者是如何提交偏移量的?消费者往一个叫做_consumer_offset的特殊主题发送消息,消息里包含每个分区的偏移量。如果消费者一直处于运行状态,那么偏移量就没有什么用处。不过,如果当新的消费者加入或者消费者崩溃的时候,就会触发rebalance,在rebalance之后,消费者对应的分区有可能改变。为了能够继续之前的工作,消费者需要读取每个分区最后一次提交的偏移量。
提交方式
- 自动提交:将enable.auto.commit设置为true,消费者每间隔auto.commit.inteval.ms时间进行一次提交。问题:消息冗余处理。
- 同步提交:调用commitSync()同步提交。问题:上一次同步提交到rebalance这段期间到消息会用冗余处理
- 异步提交:调用commitAsync()
- 同步和异步提交组合:当消费者正常时,使用异步提交。当消费者快退出时,使用同步提交。
kafka信息保存位置
zookeeper
- topic
- 配置信息
- 旧版本consumer
broker
- 新版本consumer
聚焦
Kafka的特性,为什么选择kakfa?
- 多个消费者:由于消费组的存在,使得kafka同时满足点对点模式以及发布/订阅模式
- 基于磁盘的数据存储:保证了消息的持久化
- 伸缩性:支持consumer、broker、producer的伸缩
- 高性能:上面的特性保证了kafka的高性能,通过横向扩展c、b、p可以轻松处理巨大的消息流;并且kafka还能保证毫秒级的延迟。
Kafka 选主怎么做的?
- 讲冗余分为两种:ISR、OSR;当leader副本出现问题,从ISR中选取第一个follower作为leader
kafka如何保证生产与消费都是同步的?
kafka 怎么保证不丢消息的?
- kafka消费者自带重试机制
- 消息冗余提交机制,只有当一个消息被同步到所有ISR中,才会认为一个消息被成功提交,防止单机故障丢失信息
Kafka中的分区器、序列化器、拦截器是否了解?它们之间的处理顺序是什么?
- 分区器:根据消息“键”计算出散列值,通过散列值将消息写入分区
- 序列化器:与反序列化器一一对应,这样才能保证消息被正确解析
KafkaConsumer是非线程安全的,那么怎么样实现多线程消费? 题意解释:kafka一个分区只能有一个消费者(同一个消费组),如何实现多个消费者共同消费同一个分区? 方法大致上可以理解为将消费和处理的过程解耦
kafka topic数可不可以增加? blog.csdn.net/u013256816/…
保留消息机制?
- 保留一段时间
- 保留空间限制
- 自己灵活配置
为什么选择多集群?
- 数据类型隔离
- 安全级别隔离
- 多数据中心
Linux操作系统调优
- 虚拟内存
- 内存交换
- 脏页(????)
- 磁盘
- 文件系统选择
- 禁止非必要文件元数据
- 网络
- 系统内核没有针对大流量网络传输进行优化,所以大部分web系统都得自己对Linux网络栈进行优化
- 增加TCP socket缓存区大小
参考文档
kafka权威指南 kafka参数配置