简介
Apache kafka 是一个分布式的基于push-subscribe的消息系统,它具备快速、可扩展、可持久化的特点。它现在是Apache旗下的一个开源系统,作为hadoop生态系统的一部分,被各种商业公司广泛应用。它的最大的特性就是可以实时的处理大量数据以满足各种需求场景:比如基于hadoop的批处理系统、低延迟的实时系统、storm/spark流式处理引擎。
特性
- 高吞吐量、低延迟:kafka每秒可以处理几十万条消息,它的延迟最低只有几毫秒
- 可扩展性:kafka集群支持热扩展
- 持久性、可靠性:消息被持久化到本地磁盘,并且支持数据备份防止数据丢失
- 容错性:允许集群中节点失败(若副本数量为n,则允许n-1个节点失败)
- 高并发:支持数千个客户端同时读写
架构组件
Kafka中发布订阅的对象是topic。我们可以为每类数据创建一个topic,把向topic发布消息的客户端称作producer,从topic订阅消息的客户端称作consumer。Producers和consumers可以同时从多个topic读写数据。一个kafka集群由一个或多个broker服务器组成,它负责持久化和备份具体的kafka消息。
- Topic:消息存放的主题
- Producer:生产者
- Consumer:消费者
- Broker:Kafka的服务实例
- Replications:副本(kafka容错机制)
- Partitions:分区(每个分区只能被一个消费者消费)
- Leaders:选举partition中的副本为leader,负责处理读写
- Follower: 未被选举为leader的副本为follower,负责备份数据
备份机制
kafka 0.8以后,提供了HA机制,就是replica副本机制。每个partition的数据都会同步到其他机器上,形成自己的多个replica副本。然后所有replica会选举一个leader出来,那么生产和消费都跟这个leader打交道,然后其他replica就是follower。写的时候,leader会负责把数据同步到所有follower上去,读的时候就直接读leader上数据即可。
kafka常见问题
1、消息幂等性(重复消费)
重复消费只针对消费者端而言,消费者要保证消息的幂等性,一般要结合业务场景进行,主要有两种解决方案:
1)redis:消费数据后把消息的唯一键存到redis中,每次消费的时候去redis查一下key是否存在
2)mysql:消费数据后把消息的唯一键存到mysql中,每次消费的时候查mysql
2、数据丢失
- 消费者:消费者自动提交offset的时候会有数据丢失的情况,改为手动提交offset可解决,极端情况下数据处理完后提交offset的时候挂了,可通过加幂等性操作解决
- kafka:kafka某个broker宕机,重新选举leader时有数据未同步时会有消息丢失的情况,可通过设置参数(保证数据写入到每个副本后才算写入成功)解决
- 生产者:设置acks=all即可避免丢失数据
3、顺序性
- 生产者:生产者没有顺序性问题
- kafka:partition内部有序,多个partition时无法保证顺序,对需要顺序消费的数据指定到同一个partition即可保证顺序
- 消费者:同一个partition时,当消费者内部启用多线程时会导致顺序错乱,可在消费者内部启用内存队列来保证多线程的顺序