kafka基本原理
kafka通过将broker集群将生产者producer和消费者consumer解耦分离,并通过采用不同的消息消费机制实现队列消息模式和发布订阅模式,其重要术语概念如下:
topic: 消息主题,每条消息都被归为某一个topic,不同topic间的消息的生产和消费过程互不干扰,同一topic消息的生产顺序和存储顺序一致,并且消费顺序也大致一致(单一partition内顺序消费)。
partition: 消息分区,topic内部还可进一步分为多个partition,分为多个partition不仅可以通过partition并行消费提升吞吐量,还能将不同partition部署到不同集群节点上以提升容错性。
broker: 集群节点,kafka集群内的每个节点即为一broker。出于容错性的考虑,每个topic的分区都有一个leader broker和零到多个follower broker用于备份,分区的读写操作皆由leader broker处理,followers就如普通的consumer一样从leader拉去消息并存储到自己的日志中,当leader挂掉以后,众多followers便会选举出一个新的leader,使消息服务能继续使用。kafka将不同partition的leader均匀地分布在不同broker中,从而降低一个节点宕机造成的影响。
producer: 消息的生产者,向某个topic内写入消息,kafka会负责消息写入的负载均衡,使得同一topic的消息被均匀地写入多个partition内。
consumer: 消息的消费者,kafka采用poll拉取的方式进行消息的消费,即消息的获取由consumer控制,这样消费者可以根据本地负载能力控制消费速率。
group: 不同消费者可以组成一个消费组,由groupid唯一识别,同一group内的consumer消费相同topic的消息。需要注意topic内的某一partition的消息会全部发给group组内的某一consumer,即组内partition与consumer为多对一或一对一的关系,因此组内consumer数量不能超过partition数量,否则便会有consumer一直无法获得消息。
根据不同的消费策略,kafka可分为队列消息方式和发布订阅方式:
队列消息方式: 同一group内的多个consumer都接受相同topic的消息,但发往一个group的一个消息只会被组内的一个consumer消费,若是每个consumer都属于同一个group,则所有consumer轮流接收同一topic的消息,即为队列消息方式。
发布订阅方式: 某一topic的一条消息会发给每个订阅了该topic的group,若是每个consumer都属于不同的group,则topic的消息会广播给所有订阅了该topic的consumer,即为发布订阅方式。
kafka优势
高吞吐量、低延迟: kafka每秒可以处理几十万条消息,它的延迟最低只有几毫秒;
可扩展性: producer、broker 和 consumer 都会有多个,均为分布式,支持热扩展;
持久性、可靠性: 消息被持久化到本地磁盘,并且支持数据备份防止数据丢失;
容错性: 允许集群中节点故障(若副本数量为n,则允许n-1个节点故障);
高并发: 消息被消费后并不删除,而是在过期时间内持续保存,不同消费者本地存储自身的offset,不影响其他消费者消费消息,支持数千个客户端同时读写。
kafka应用场景
日志收集: 一个公司可以用Kafka收集各种服务的log,通过kafka以统一接口服务的方式开放给各种consumer;
消息系统: 解耦生产者和消费者、缓存消息等;
用户活动跟踪: kafka经常被用来记录web用户或者app用户的各种活动,如浏览网页、搜索、点击等活动,这些活动信息被各个服务器发布到kafka的topic中,然后消费者通过订阅这些topic来做实时的监控分析,亦可保存到数据库;
运营指标: kafka也经常用来记录运营监控数据。包括收集各种分布式应用的数据,生产各种操作的集中反馈,比如报警和报告;
流式处理: 作为大数据流式计算的source或sink。