kafka只是消息引擎系统吗

kafka真的只是消息引擎系统吗?要搞清楚这个问题,就要从kafka的发展历史说起,纵观kafka的发展历史,它确实是消息引擎起家的,但它不仅是一个消息引擎系统,同时也是一个分布式流处理平台(distributed stream processing platform)。如果这一节你只能记住一句话的话,那我希望你能记住,kafka虽然是消息引擎起家,但它不仅是一个消息引擎,还是一个分布式流处理平台。

众所周知,kafka是LinkedIn公司内部孵化的项目,LinkedIn最开始有强烈的数据强实时处理方面的需求,其内部的诸多子系统要执行多种类型的数据处理与分析,主要包括业务系统和应用程序性能监控,以及用户行为数据处理等。当时他们碰到的主要问题包括:

  • 数据正确性不足。因为数据的收集主要采用轮询(polling)的方式,如何确定轮询的时间间隔就变成了一个高度经验化的事情。虽然可以采用一些类似于启发式算法来帮助评估间隔时间,但一旦指定不当,必然会造成较大的数据偏差。
  • 系统高度定制化,维护成本高。各个业务子系统都需要对接数据收集模块,引入了大量的定制开销和人工成本。

为了解决这些问题,LinkedIn工程师尝试过使用ActiveMQ来解决这些问题,但效果并不理想。显然需要有一个"大一统"的系统来取代现有的工作方式,而这个系统就是kafka。

因此kafka自诞生伊始是以消息引擎系统的面目出现在大众视野的,如果翻看比较老的kafka对应的官网的话,你会发现kafka社区将其清晰地定位为一个分布式、分区化且带备份功能的提交日志(commit log)服务。

因此,kafka在设计之初就旨在提供三个方面的特性:

  • 提供一套API实现生产者和消费者
  • 降低网络传输和磁盘存储开销
  • 实现高伸缩架构

在现如今的大数据领域,kafka在承接上下游、串联数据流管道方面发挥了重要的作用:所有的数据几乎都要从一个系统流入kafka,然后再流入下游的另一个系统中 。这种使用方式屡见不鲜以至于引发了kafka社区的思考:与其我把数据从一个系统传递到下一个系统进行处理,我为何不自己实现一套流处理框架呢?基于这个考量,kafka社区在0.10.0.0版本推出了流处理组件kafka streams,也正是从这个版本开始,kafka正式变身为分布式的流处理平台,而不再仅仅只是消息引擎系统了。今天kafka是和storm、spark、flink同等级的实时流处理平台了。

那么作为流处理平台,kafka与其他大数据流式计算框架相比,优势在哪里呢?

  • 第一点是更容易实现端到端的正确性(correctness)。流处理要最终替代它的兄弟批处理需要具备两点核心优势:要实现正确性和提供能够推导时间的工具。实现正确性是流处理能够匹敌批处理的基石。正确性一直是批处理的强项,而实现正确性的基石则是要求框架能提供’精确一次语义处理’,即处理一条消息有且只有一次机会能够影响系统状态。目前主流的大数据流处理框架都宣称实现了’精确一次语义处理’,但是这是有限定条件的,即它们只能实现框架内的精确一次语义处理,无法实现端到端的。这是为什么呢?因为当这些框架与外部消息引擎系统结合使用时,它们无法影响到外部系统的处理语义,所以如果你搭建了一套环境使得spark或flink从kafka读取消息之后进行有状态的数据计算,最后再写回kafka,那么你只能保证在spark或者flink内部,这条消息对于状态的影响只有一次。但是计算结果有可能多次写入的kafka,因为它们不能控制kafka的语义处理。相反地,kafka则不是这样,因为所有的数据流转和计算都在kafka内部完成,故kafka可以实现端到端的精确一次处理。
  • 第二点是kafka自己对于流式计算的定位。官网上明确表示kafka streams是一个用于搭建实时流处理的客户端库而非是一个完整的功能系统。这就是说,你不能期望着kafka提供类似于集群调度、弹性部署等开箱即用的运维特性,你需要自己选择合适的工具或者系统来帮助kafka流处理应用实现这些功能。读到这里可能觉得这怎么是有点呢?坦率的说,这是一个双刃剑的设计,也是kafka剑走偏锋不正面pk其他流计算框架的特意考量。大型公司的流处理平台一定是大规模部署的,因此具备集群调度功能以及灵活的部署方案是不可或缺的要素。但毕竟世界上还存在着很多中小企业,它们的流处理数据量并不巨大,逻辑也不复杂,部署几台或者十几台机器足以应付。在这样的需求下,搭建重量级的完整性平台实在是’杀鸡用宰牛刀’,而这正式kafka流处理组件的用武之地。因此从这个角度来说,未来在流处理框架当中,kafka应该是有着一席之地的。

这里再来解释一下什么是精确一次语义处理。举个例子,如果我们使用kafka计算某网页的pv,我们将每次网页访问都作为一个消息发送给kafka,pv的计算就是我们统计kafka总共接收了多少条这样的消息即可。精确一次语义处理表示每次网页访问都会产生、且只产生一条消息。

处理消息引擎和流处理平台,kafka还有别的用途吗?当然有,kafka甚至能够被用作分布式存储系统,但是实际生产中,没有人会把kafka当中分布式存储系统来用的。kafka从一个优秀的消息引擎系统起家,逐渐演变成现在的分布式的流处理平台。我们不仅要熟练掌握它作为消息引擎系统的非凡特性以及使用技巧,最好还要多了解下其流处理组件的设计与案例应用。

小结:

  • kafka在设计之初就旨在提供三个方面的特征:提供一套API实现生产者和消费者;降低网络传输和磁盘存储开销;实现高伸缩架构。
  • 作为流处理平台,kafka与其他主流大数据流式计算框架相比,优势有两点:更容易实现端到端的正确性;它自己对于流式计算的定位。
  • Apache Kafka是消息引擎系统,也是一个分布式流处理平台。除此之外,kafka还能够被用作分布式存储系统。不过我觉得你姑且了解下就好了,我从没见过在实际生产环境中,有人把kafka当做持久化存储来用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值