others-kafka
在0.10版本之前,Kafka仅仅作为一个消息系统,主要用来解决应用解耦、异步消息、流量削峰等问题。0.10版本之后,Kafka提供了连接器与流处理能力,所以它也从分布式的消息系统逐渐成为一个流式数据平台
作为一个流式处理平台,最重要的是具备下面的3个特点。
- 数据注入功能:类似消息系统,提供事件流的发布和订阅
- 数据存储功能:存储事件流数据的节点具有故障容错的特点
- 流处理功能:能够对实时对事件流进行流式处理和分析
Kafka是怎么实现并组合上面的3个功能特点的呢?
消息系统
消息系统(也叫消息队列)主要有两种消息模型:队列和发布订阅。Kafka使用消费组(consumer group)同意上面两种消息模型,Kafka使用队列模型时,可以将处理工作平均非配给消费组中的消费者成员;使用发布订阅模式时,可以将消息广播给多个消费组。采用多个消费组结合多个消费者,既可以线性扩展消息的处理能力,也允许消息被多个消费组订阅。队列模式(也叫做点对点模式)
多个消费者读取消息队列,每条消息只发送给一个消费者。发布-订阅模式
多个消费者订阅主题,主题的每条记录会发布给所有的消费者
存储系统
任何消息队列要做到“发布消息”和“消费消息”的解耦合, 实际上都要扮演一个存储系统的角色,负责保存还没有被消费的消息 。 否则,如果消息只是在内存中, 一旦机
器宕机或进程重启,内存中的消息就会全部丢失 。 Kafka也不例外,数据写入Kafka集群的服务器节点时,还会复制多份来保证出现故障时仍能可用 。 为了保证消息的可靠存储,Kafka还允许生产者的生产请求在收到应答结果之前,阻塞式地等待一条消息,直到它完全地复制到多个节点上,才认为这条消息写入成功 。流处理系统
流式数据平台仅仅有消息的读取和写入、存储消息流是不够的,还需要有实时的流式数据处理能力 。 对于简单的处理,可以直接使用Kafka的生产者和消费者API来完成;
但对于复杂的业务逻辑处理,直接操作原始的API需要做的工作非常多。 Kafka流处理 ( KafkaStreams )为开发者提供了完整的流处理API ,比如流的聚合、连接 、 各种转换操作 。 Kafka流处理框架内部解决很多流处理应用程序都会面临的问题 :处理乱序或迟来的数据、重新处理输入数据 、 窗口和状态操作等 。将消息系统、存储存储、流处理系统组合在一起:
传统消息系统的流处理通常只会处理订阅动作发生之后才到达的新消息,无法处理订阅之前的历史数据 。 分布式文件存储系统一般存
储静态的历史数据,对历史数据的处理一般采用批处理的方式 。 现有的开源系统很难将这些系统无缝地整合起来, Kafka则将消息系统、存储系统 、 流处理系统都组合在一起,构成了以Kafka为中心的流式数据-处理平台 。 它既能处理最新的实时数据,也能处理过去的历史数据 。Kafka作为流式数据平台的核心组件,主要包括下面4种核心的 API 。
·生产者 ( producer )应用程序发布事件流到JKafka的一个或多个主题。
·消费者 ( consumer )应用程序订阅Kafka的一个或多个主题,并处理事件流。
·连接器 ( connector )将Kafka主题和已有数据源进行连接,数据’可以互相导入和导出 。
·流处理 ( processor ) Kafka主题消费输入流,经过处理后,产生输出流到输出主题。