Apache Kafka是一款基于日志的消息系统,后来Kafka发展成为了一个“distributed streaming platform”,包含了消息系统,存储系统和流处理系统三个功能。
Topics是记录着生产者产生的同一类型数据,一个Topic可以有很多个订阅者。对于每个Topic都会维护着相应的partition,每一个partition都可以理解为一个日志(有序不可变只增持久化),每一条在partition的记录都会有一个序列ID(offset)和相应的有效期。消费者可以控制offset,拥有着决定权(意味着你可以从选择从一个特定的老offset消费),而Kafka的元数据会维护每个消费者当前消费的offset。使用partition的好处在于可以将一个Topic的数据分布到多个服务器,根据数据大小进行良好的切分。
使用主从复制模式,基于Zookeeper的分布式算法实现一致性。
跨数据中心复制
生产数据到对应的partition,并且拥有Topic里的partition的选择权
Consumer可以组成一个Consumer组,当所有的Consumer都在一个组里的时候,消息会根据复杂发到其中一个Consumer上,而拥有不同的组时,则是广播到所有的Consumer组其中一个Consumer。引入Consumer组的原因是为了容错,一旦组里的一个Consumer挂了,挂了的Consumer对应的partition会分配给其它的Consumer,当一个新的Consumer加入时会分担组内的消费partition的压力。相比于传统的queue,Consumer组弥补了一个queue里的数据一旦消费便不可复现的问题。但是Kafka只提供了单个Partition的有序性,而不保证多个Partition之间数据的有序性,所以要实现有序就必须保证一个Topic就只有一个Partition,而每一个Consumer组只有一个Consumer。