Kafka总结系列(一)

来源:互联网 发布:偏微分方程数值解 知乎 编辑:程序博客网 时间:2024/06/15 21:48

Apache kafka:一个高吞吐量的分布式发布订阅消息系统

        从最初的了解、学习kafka,到后来基于其API进行开发,再到后来有意识地了解其实现原理,是一个漫长的过程偷笑。趁周末有空梳理一下期间读过的官方文档、技术博客等,以便自己日后复习。

特性如下:

  • Fast:单台broker节点每秒便可处理来自数千个client的(hundreds of megabytes of reads and writes)百兆读写请求;
  • Scalable:扩展性:可以实现灵活、透明的扩展without downtime 。日志数据被分区并分布式地存储在集群的服务器中,允许数据量大于任意单个节点的存储能力,并且消费者也是一个可扩展的集群。
  • Durable:持久化:消息被持久化在磁盘Disk中,且在集群内进行备份避免单点故障导致消息丢失。每个broker节点可存储TB级消息;
  • Distributed by Design:分布式设计:kafka采用cluster-centric设计,具备很强的持久性和容错保证;

Getting Started

  1. kafka是一个分布式的、分区的、存在备份的commit log service。
  2. 消息分类存储,每一类称之为Topic;发布消息的叫做生产者、订阅消费消息的是消费者;
  3. kafka体现为多台服务器组成集群,每一个server也叫broker;
  4. client与server之间使用TCP协议进行通信(采用TCP socket);
  5. topic又被划分为若干分区partition(创建topic的时候可以指定分区个数),每个分区由一组有序的消息序列组成,新生产的消息则追加至末尾。
  6. 每条消息有一个序列号id,称之为offset,唯一标记partition内的一条消息;
  7. kafka集群会保存所有消息,无论其是否被消费过,可以在配置文件中设置保存的时间以及日志清理策略(delete或者compact);
  8. 消费者需要维护的唯一元数据信息是其消费的offset值,理论上offset是线性增长的,但consumer可以指定offset的值,所以这些设计机制使consumer very cheap,开发者可以随意增删consumer,不会影响kafka集群或者其他消费者,broker也是无状态的;
  9. 分区partition存在的意义:将一个topic的消息进行切分,分开存储在不同的broker上,从而使topic能够容纳更多的数据量,不受单台服务器存储能力的限制;另外一点是:作为并行处理的基本单元:(我的理解:1、一个partition对应一个leader broker以及若干follower,生产者消费者仅和leader通信进行读写操作,只要集群内的leader均匀分布,则可保证每台服务器的负载相对均衡;2、消费者又属于某个consumer group,一条消息只能被一个group内的一个consumer消费,所以一般情况下,一个消费者消费topic的一个分区,可见分区越多,便可以有更多的消费者并发消费,所以partition是kafka并行化的基本单位)
  10. 消费者:
    • 传统的消息系统有两种模型:队列queuing和发布订阅publish-subscribe。队列模型中,一条消息只能被一个消费者消费;发布订阅模型中,一条消息会广播给所有的消费者。kafka通过consumer group能同时满足这两种需求。
    • 消息的顺序性保证:传统的队列保证消息在server上顺序存储,但当他将消息按照存储顺序分发给并行消费的consumer时,顺序就会被打乱,无法保障有序性。当然,可以只让一个消费者来消费,这样消息依然是顺序的,但又违背了并行处理的初衷。
    • kafka通过partition很好的保证了顺序性以及消费者的负载均衡:(这是partition存在的另一个意义吧)consumer group中的一个consumer消费一个partition,所以保证了一个分区内的消息总是被顺序消费,消费者的负载也相对均衡。但是要注意:如果group内的consumer数量大于topic的partition个数,则一些消费者处于空闲状态,而且不能保证partition之间消息的顺序性,特殊场景下,可以使一个topic只有一个分区,只让一个consumer进行消费,这样便是全局有序的。


2 0
原创粉丝点击