Kafka基本概念及常用场景
基本概念
Kafka可以看成一个流平台,这个平台上可以发布和订阅数据流,并把他们保存起来,进行处理。Kafka有点像消息系统,允许发布和订阅消息流,但是它和传统的消息系统有很大的差异,首先,Kafka是个现代分布式系统,以集群的方式运行,可以自由伸缩。其次,Kafka可以按照要求存储数据,保存多久都可以。第三,流式处理将数据处理的层次提示到了新高度,消息系统只会传递数据,Kafka的流式处理能力可以让我们用很少的代码就能动态地处理派生流和数据集。所以Kafka不仅仅是个消息中间件。
同时在大数据领域,Kafka还可以看成实时版的Hadoop,Hadoop可以存储和定期处理大量的数据文件,往往以TB计数,而Kafka可以存储和持续处理大型的数据流。Hadoop主要用在数据分析上,而Kafka因为低延迟,更适合于核心的业务应用上。
消息和批次
消息,Kafka里的数据单元,也就是我们一般消息中间件里的消息的概念。消息由字节数组组成。消息还可以包含键
,用以对消息选取分区。
另外为了提高效率,消息被分批写入Kafka。批次就是一组消息,这些消息属于同一个主题和分区。如果只传递单个消息,会导致大量的网络开销,把消息分成批次传输可以减少这开销。
但是,这个需要权衡,批次里包含的消息越多,单位时间内处理的消息就越多,单个消息的传输时间就越长。如果进行压缩,可以提升数据的传输和存储能力,但需要更多的计算处理。
主题和分区
Kafka里的消息用主题进行分类,主题下又可以被分为若干个分区。分区本质上是个提交日志,当有新消息的时候,这个消息就会以追加的方式写入分区,然后用先入先出的顺序读取。
但是因为主题会有多个分区,所以在整个主题的范围内,是无法保证消息的顺序的,单个分区则可以保证。
Kafka通过分区来实现数据冗余和伸缩性,因为分区可以分布在不同的服务器上,那就是说一个主题可以跨越多个服务器。
Kafka可以看成一个流平台,很多时候,我们会把一个主题的数据看成一个流,不管有多少个分区。
生产者和消费者、偏移量、消费者群组
生产者和消费者就是一般消息中间件里生产者和消费者的概念。一些其他的高级客户端API,像数据管道API和流式处理的Kafka Stream,都是使用了最基本的生产者和消费者作为内部组件,然后提供了高级功能。
生产者默认情况下把消息均衡分布到主题的所有分区上,如果需要指定分区,则需要使用消息里的消息键和分区器。
消费者订阅一个或者多个主题,并且按照消息的生成顺序读取。消费者通过检查所谓的偏移量来区分消息是否读取过。偏移量是一种元数据,一个不断递增的整数值,创建消息的时候,Kafka会把他加入消息。在一个分区里,每个消息的偏移量是唯一的。每个分区最后读取的消息偏移量会保存到Zookeeper或者Kafka上,这样分区的消费者关闭或者重启,读取状态都不会丢失。
多个消费者可以构成一个消费者群组。怎么构成?共同读取一个主题的消费者们,就形成了一个群组。群组可以保证每个分区只被一个消费者使用。
消费者和分区之间的这种映射关系叫做消费者对分区的所有权关系,很明显如下图,一个分区只有一个消费者,而一个消费者可以有多个分区。
Broker和集群
一个独立的Kafka服务器叫Broker。Broker的主要工作是,接收生产者的消息,设置偏移量,提交消息到磁盘保存,为消费者提供服务,响应请求,返回消息。在合适的硬件上,单个Broker可以处理上千个分区和每秒百万级的消息量。
多个Broker可以组成一个集群。每个集群中Broker会选举出一个集群控制器(基于Zookeeper进行选举 )。控制器会进行管理,包括将分区分配给Broker和监控Broker。
集群里,一个分区从属于一个Broker,这个Broker被称为首领。但是分区可以被分配给多个Broker,这个时候会发生分区复制。
分区复制带来的好处是,提供了消息冗余。一旦首领Broker失效,其他Broker可以接管领导权。当然相关的消费者和生产者都要重新连接到新的首领上。
保留消息
在一定期限内保留消息是Kafka的一个重要特性,Kafka Broker默认的保留策略是:要么保留一段时间,要么保留一定大小。到了限制条后,旧消息过期并删除。允许每个主题可以根据业务需求配置自己的保留策略。
常见场景
那么选择Kafka存在哪些优势呢?首先Kafka和其它消息中间件一样,肯定支持多生产者和多消费者。其次Kafka基于磁盘的数据存储,换句话说,Kafka的数据天生就是持久化的。
另外Kafka具有高伸缩性,因为Kafka一开始就被设计成一个具有灵活伸缩性的系统,对在线集群的伸缩丝毫不影响整体系统的可用性。
最后就是Kafka具有非常高的性能,结合横向扩展生产者、消费者和Broker,Kafka可以轻松处理巨大的信息流,同时保证亚秒级的消息延迟。
活动跟踪
跟踪网站用户和前端应用发生的交互,比如页面访问次数和点击,将这些信息作为消息发布到一个或者多个主题上,这样就可以根据这些数据为机器学习提供数据,更新搜素结果等等。
传递消息
标准消息中间件的功能。
收集指标和日志
收集应用程序和系统的度量监控指标,或者收集应用日志信息,通过Kafka路由到专门的日志搜索系统,比如ES。
提交日志
收集其他系统的变动日志,比如数据库。可以把数据库的更新发布到Kafka上,应用通过监控事件流来接收数据库的实时更新,或者通过事件流将数据库的更新复制到远程系统。
还可以当其他系统发生了崩溃,通过重放日志来恢复系统的状态。
流处理
操作实时数据流,进行统计、转换、复杂计算等等。随着大数据技术的不断发展和成熟,无论是传统企业还是互联网公司都已经不再满足于离线批处理,实时流处理的需求和重要性日益增长。
近年来业界一直在探索实时流计算引擎和API,比如这几年火爆的Spark Streaming、Kafka Streaming、Beam和Flink,其中阿里双11会场展示的实时销售金额,就用的是流计算,是基于Flink,然后阿里在其上定制化的Blink。