Kafka Over View

Posted 完齿猪

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Kafka Over View相关的知识,希望对你有一定的参考价值。

    Kafka是最初由Linkedin公司开发,是一个分布式、分区的、多副本的、多订阅者,基于zookeeper协调的分布式日志系统(也可以当做MQ系统),常见可以用于web/nginx日志、访问日志,消息服务等等,Linkedin于2010年贡献给了Apache基金会并成为顶级开源项目。

    (注:Message Queue即消息系统,本来Linkedin只想把Kafka做成日志系统,谁知道Kafka越来越强大,变成消息系统,后来还发展出stream process。)


    与其他Message Queue(消息系统)对

    其他消息系统还包括RabbitMQ,Redis,ZeroMQ,ActiveMQ,尚未有了解。但网上说,Kafka比其他消息中间件强大,而且是快得变态:

    (1)以时间复杂度为O(1)的方式提供消息持久化能力,即使对TB级以上数据也能保证常数时间的访问性能

    (2)高吞吐率。即使在非常廉价的商用机器上也能做到单机支持每秒100K条消息的传输

    (3)支持Kafka Server间的消息分区,及分布式消费,同时保证每个partition内的消息顺序传输

    (4)同时支持离线数据处理和实时数据处理


    何谓消息系统?

    传统的关系数据库(Oracle, mysql)保存数据,就像记账本一样,白纸黑字,写错了擦掉(rollback),还要审核确认(commit),非常严谨

    而消息系统,顾名思义就是向目标用户发布公开的消息、公告、通知、提示等。可以点对点,也可以点对面(TOPIC)。如果是点对面,就要考虑方法:是挨家挨户通知?还是开广播通知?还是贴公告栏?

   挨家挨户通知可以知道谁收到,谁没有收到,但很累,如果那家人不在要不要等?

   开广播通知很省事,但消息播完就消失了,不知道哪些人收到。


    Kafka就是用贴公告栏的方法:

    发布者(producer)不定时将公告(message)贴到公告栏(broker)预先定好的栏目(partition)上;

    如果订阅者(consumer)订阅了某主题(TOPIC)的公告,自己按时去读取便是;

    如果订阅者今天没空,公告会一直留着,超过设定时间,就会撕掉。(这就是优于其他消息系统之处,其他消息系统消息过了就没了。)

    如果订阅者明天有空,还可以去读取公告(事实上,只要公告在,订阅者怎么读取都可以:从头读取、读未读的、读最新的...)


    何谓高吞吐?

    打个低俗的比方:

    你挖鼻孔,1次/秒很爽;

    如果10次/秒你能受得了吗?

    而Kafka居然可以做到100000次/秒! 还可以很多人一起来进进出出(进=写数据,出=读数据)!而且,还是在非常廉价的商用机器上,这就是厉害之处。(我觉得比喻换成ooxx更贴切,吞吐嘛,但是我怕被封号)


    发展由来

    原来,对于Linkin这样的互联网企业来说,用户和网站上产生的数据有三种:

    (a)需要实时响应的交易数据,用户提交一个表单,输入一段内容,这种数据最后是存放在关系数据库(Oracle, MySQL)中的,有些需要事务支持。

    (b)活动流数据,准实时的,例如页面访问量、用户行为、搜索情况,这些数据可以产生:广播、排序、个性化推荐、运营监控等。这种数据一般是前端服务器先写文件,然后通过批量的方式把文件导入Hadoop这种大数据分析器里面慢慢整。

    (c)各个层面程序产生的日志,例如httpd的日志、tomcat的日志、其他各种程序产生的日志。码农专用,这种数据一个是用来监控报警,还有就是用来做分析。


    Linkin的厉害之处在于,他们发现了原先(b),(c)的数据处理方式有问题.

    对于(b)而言,原来动辄一两个小时批处理一次的方式已经不行了,用户在一次购买完之后,最好马上就能看到相关的推荐;

    对于(c)而言,传统的syslog模式等也不好用,而且很多情况下(b)和(c)用的是同一批数据,只是数据消费者不一样,如下图。


    这2种数据的特点是:

    (1)准实时,不需要秒级响应,分钟级别即可。

    (2)数据量巨大,是交易数据的10倍以上。

    (3)数据消费者众多,例如评级、投票、排序、个性化推荐、安全、运营监控、程序监控、后期报表等。

    于是,Linkin就自己开发了一套系统,专门用来处理这种性质的数据,这就是Kafka,如下图:


    根据官网的介绍,ApacheKafka®是一个分布式流媒体平台,它主要有3种功能:

    (1)It lets you publish and subscribe to streams of records.

      发布和订阅消息流,这个功能类似于消息队列,这也是kafka归类为消息队列框架的原因

    (2)It lets you store streams of records in a fault-tolerant way.

      以容错的方式记录消息流,kafka以文件的方式来存储消息流

    (3)It lets you process streams of records as they occur.

      可以在消息发布的时候进行处理


    使用场景

    (1)Building real-time streaming data pipelines that reliably get data between systems or applications.

      在系统或应用程序之间构建可靠的用于传输实时数据的管道,消息队列功能

    (2)Building real-time streaming applications that transform or react to the streams of data。

      构建实时的流数据处理程序来变换或处理数据流,数据处理功能


    Push vs. Pull

    作为一个消息系统,Kafka遵循了传统的方式,选择由Producer向broker push消息并由Consumer从broker pull消息。一些logging-centric system,比如Facebook的Scribe和Cloudera的Flume,采用push模式。事实上,push模式和pull模式各有优劣。

    push模式很难适应消费速率不同的消费者,因为消息发送速率是由broker决定的。push模式的目标是尽可能以最快速度传递消息,但是这样很容易造成Consumer来不及处理消息,典型的表现就是拒绝服务以及网络拥塞。而pull模式则可以根据Consumer的消费能力以适当的速率消费消息。

    对于Kafka而言,pull模式更合适。pull模式可简化broker的设计,Consumer可自主控制消费消息的速率,同时Consumer可以自己控制消费方式——即可批量消费也可逐条消费,同时还能选择不同的提交方式从而实现不同的传输语义。


    版本更新  

    我开始学习的版本是0.9.0.1,目前最新版本是1.0.0(2017.11月发布),据说1.0.0有很多重要特性,我会尽努力在分享中讲到版本间的差异。



    [后记]:为什么这个系统名称叫Kafka?

    个人觉得是写Kafka的工程师也喜欢文学,而且是个卡夫卡迷或但丁迷,因为代码中充斥着“炼狱”等词语。

    Franz Kafka(弗兰兹·卡夫卡),生活于奥匈帝国统治下的捷克德语小说家,本职为保险业职员,主要作品有小说《审判》、《城堡》、《变形记》等。“卡夫卡”在捷克语中是“寒鸦”的意思,在希伯来语中是“穴鸟”的意思。

    卡夫卡被认为是现代派文学的鼻祖,是表现主义文学的先驱,其作品主题曲折晦涩,情节支离破碎,思路不连贯,跳跃性很大,语言的象征意义很强,这给阅读和理解他的作品带来了一定的困难。

    这是因为,他生活和创作的主要时期是在一战前后,当时,经济萧条,社会腐败,人民穷困,这使得卡夫卡终生生活在痛苦与孤独之中。卡夫卡一生都在苦苦地探求人生的价值与意义,但至死都无法对他的思考和探索给出令他自己满意的答案和结论,所以没有结尾。



主要参考文章

[1]日志:每个软件工程师都应该知道的有关实时数据的统一概念

[2]Building LinkedIn’s Real-time Activity Data Pipeline

[3]分布式发布订阅消息系统 Kafka 架构设计

[4]Kafka文件存储机制那些事

[5]Kafka是个奇葩!

[6]百度


以上是关于Kafka Over View的主要内容,如果未能解决你的问题,请参考以下文章

How Hulu Uses InfluxDB and Kafka to Scale to Over 1 Million Metrics a Second

etcdraft vs kafka

Spring stomp over websocket SubscribeMapping 不起作用

Kafka partition的数量问题

Kafka shell 查看指定topic partition offset的信息

如何在Kafka上对一个Topic增加partition