简介
Apache Kafka是一款基于日志的消息系统,后来Kafka发展成为了一个“distributed streaming platform”,包含了消息系统,存储系统和流处理系统三个功能。
核心特性:
发布订阅模式的消息系统
持久化存储(commit log)数据
在输入输出过程中实现流数据的转换
核心概念
分布式集群,消息存储副本
按照topic存储同一类型数据
每一条记录包含key,value和时间戳
核心API
生产者,负责推送数据到相应的Topic
消费者,订阅相关Topic,并进行消费
Stream API,在Kafka的输入和输出间进行相应转换
Connector API,包装了一层可复用的生产者和消费者代码
Topics and Logs
Topics是记录着生产者产生的同一类型数据,一个Topic可以有很多个订阅者。对于每个Topic都会维护着相应的partition,每一个partition都可以理解为一个日志(有序不可变只增持久化),每一条在partition的记录都会有一个序列ID(offset)和相应的有效期。消费者可以控制offset,拥有着决定权(意味着你可以从选择从一个特定的老offset消费),而Kafka的元数据会维护每个消费者当前消费的offset。使用partition的好处在于可以将一个Topic的数据分布到多个服务器,根据数据大小进行良好的切分。
Distribution
使用主从复制模式,基于Zookeeper的分布式算法实现一致性。
Geo-Replication
跨数据中心复制
Producers
生产数据到对应的partition,并且拥有Topic里的partition的选择权
Consumers
Consumer可以组成一个Consumer组,当所有的Consumer都在一个组里的时候,消息会根据复杂发到其中一个Consumer上,而拥有不同的组时,则是广播到所有的Consumer组其中一个Consumer。引入Consumer组的原因是为了容错,一旦组里的一个Consumer挂了,挂了的Consumer对应的partition会分配给其它的Consumer,当一个新的Consumer加入时会分担组内的消费partition的压力。相比于传统的queue,Consumer组弥补了一个queue里的数据一旦消费便不可复现的问题。但是Kafka只提供了单个Partition的有序性,而不保证多个Partition之间数据的有序性,所以要实现有序就必须保证一个Topic就只有一个Partition,而每一个Consumer组只有一个Consumer。
可靠性
确保同一个生产者发布的消息在Topic的单个partition是有序的。
一个消费者收到的消息与日志顺序相同。
当一个Topic拥有N个副本时,可以容忍N-1个副本的丢失。
领取专属 10元无门槛券
私享最新 技术干货