Kafka设计原理以及在达观产品中的应用

达观数据作为一家提供大数据服务的公司,经常会遇到客户上报数据的需求。这样的请求不需要马上返回处理结果, 而是需要后台将一系列的上报数据进行统一归档整理挖掘, 然后将结果数据呈现给客户。这样的业务需求需要达观提供数据暂存服务,也就是说我们需要一个系统在生产者(客户上报数据)和消费者(后台数据处理)之间进行沟通,简而言之叫系统间通信消息系统,这种模型就是经典的生产者(producer)、消费者(consumer)模型。

然而有一个消息系统正好是为了应对这种业务场景而生,它就是kafka。那么kafka到底是一个什么样的系统?有什么特点?实际吞吐表现又如何?带着这些问题,我们一起来了解一下。

一, Kafka简介

首先根据官网介绍,知道kafka是一个分布式流处理平台,一个可处理企业级发布/订阅的消息系统,并且具有高容错性和消费及时性等特点,那么它是怎么做到这一点的呢?接着往下看。

1,主题和日志:

主题(topic)和日志(log)设置是kafka一大特色,一个kafka集群可以创建多个topic, 每个topic都相当于一个消息队列,这就意味着可以将不同格式的数据发布到不同的topic中,减小消费这些数据时的逻辑难度。那么每个topic中处理的数据结构是怎样呢?我们先来看一张topic的解剖图:

图1:topic原理解析图

从图1中可以看到, 消息传送过来时kafka会通过负载均衡将消息最终写入到磁盘上一个特定分区(partition)。由于在同一个partition上这些消息都是顺序存储的, 所以对一个特定分区每条消息都会有一个基于起始位置的偏移量(offset), 因此我们在后续消费时只需要指明从哪个partition中哪个offset开始消费,就能达到重复消费目的。

1)虽然kafka可以通过增加partition方式来增加负载,但是它的数据最终是被写入到磁盘中。比如机械磁盘写入效率是很低的, 难道我们需要增大一个topic的负载给它设置更多的partition吗?

机械磁盘驱动器吞吐量跟寻道延时是强关联,也就是说,线性读写速度远大于随机读写。例如,在67200rpm SATA RAID-5磁盘阵列中, 随机写速度大约是100k/s, 然而线性写速度可以达到600M/s,后者大约是前者的6000倍。通过图1可知, kafka采用的即是后者, 利用操作系统read-ahead和write-behind技术,极大提升磁盘访问性能;设置partition数量固然可以从磁盘读写角度增大topic负载,但是partition数量过多会导致cpu计算量增大,所以最佳办法是根据不同配置的机器, 不同的业务场景设置不同的partition数量。

2)偏移量offset存储类型是什么, 如果消息足够大,offset的值是否会重新置0, 如果置0,后续消费是否会紊乱?

kafka offset 是一个日志序列号( log sequence number),不必担心offset 长度问题。那么这个日志序列号到底有多大,举个例子:如果一个partition一天接收1T日志, 这个offset至少可以使用1百万年。由于offset足够用,而且不会被置0,所以从这个角度讲消费紊乱情况是不会出现的。

3)写入磁盘的日志会被永久保留吗?如果想删除过期消息, 需要怎么操作?

可以通过配置文件中log.retention参数设置消息过期时间,超过过期时间的消息会被系统删除,删除的消息不可再被重新消费。

2,分布式集群

通过前文介绍我们已经了解到kafka通过partition和顺序读写磁盘的方式达到很高吞吐量,可是单台机器吞吐量再高一旦该机发生故障宕掉就会对业务产生灾难性影响,怎么处理这个问题呢?想必你已经知道了,那就是采用集群的方式,一旦一台机器发生故障客户端可以选择链接其它机器, 保证业务稳定性。每一个partition 都会有一个服务器来作为领导者(leader), 另外一个或者多个服务器(server)来作为跟随者(follower),leader会处理所有的读写请求,而follower则会从leader那里备份数据, 如果一个leader失败了, 其它的follower会自动选举一个成为一个新的leader, 所以对于一个server来说,他可能是某些partition下的leader, 而对于另外一些partition来说则是follower,这样设计可以将负载更好均衡。

1)搭建kafka集群时有没有什么小细节需要值得注意的?

kafka官网已经有详细的搭建过程,在此不赘述。建议正式项目中不要采用伪集群(多个broker运行在同一台物理机上)的搭建方式,而且zookeeper集群和kafka集群最好不要出现在同一台实体机上,这样会影响kafka顺序读写效率。

2)在kafka集群中如果一个server失败, 怎样保证数据完整性?

在kafka配置文件中有一个复制因子控制参数,如果将该参数设置为N,则表示一份数据会被保存N次,而这些数据被备份到不同server中,所以当设置复制因子为N时即使有N-1台server失败,也会保证数据完整性。

3,生产者消费者和消息的顺序性:

上面讲了那么多,无非是要实现一个队列的数据结构。对于队列这种数据结构我们一点也不陌生,由此可以想到对于kafka的一个topic 队列来说,生产消费逻辑应该是这样:有很多生产者向topic中写入数据,另外一端则有许多消费者消费数据。(见图2)

图2:生产者消费者原理解析图

然而实际上kafka生产者消费者模式有它的特殊性,那么kafka这个队列是怎样实现入队和出队的?接下来我们一起来看看kafka生产者消费者模式。

生产者:生产者(producer)顾名思义,就是向kafka队列中发布消息的,即入队操作者。生产者功能是在topic中选择一个partion 然后向这个partition中发送数据。选择partition的过程就是一个负载均衡的方式, 比如可以采用轮询或者自己设定partition选择函数来实现负载均衡。当然如果使用封装的api比如(https://github.com/dpkp/kafka-python)就大可不必关心负载均衡问题。会有默认的负载均衡函数来实现这一功能。

消费者: 消费者(consumer)功能是从队列中读取数据并进行相应逻辑处理,但是kafka消费者有特殊之处。kafka增加了一个组(group)的概念,一个topic可以有多个group, 当多个consumer从属于一个组时,一条消息将被发往所有组,但是在组内,这条消息只会被一个consumer消费。由此说来一个group才是一个真正“逻辑消费者(logic consumer)”。相关逻辑如图3所示。

消息顺序性:通过图3我们知道消息的消费情况,那么一个消息流消费情况会是怎样的?其实在高等级api中由于指定了负载均衡规则,同一个生产者发布两条不同消息数据时会根据相应规则发送到一个特定partition中,在消费时会按照同样规则从partition中取出数据,这样就能保证两条数据消费的先后顺序,从而保证了消息顺序性。

1)对于一个具有多个consumer的topic,我要实现一条消息被多个consumer消费和一条消息只被一个consumer消费,那我需要怎么设置group?

将多个consumer设置为同一个组可以实现一条消息只被多个consumer消费, 将所有的consumer都设置为不同组,一条消息将会被所有consumer消费。

2)如果有一批数据消费时必须严格按照入队先后顺序来消费,需要怎样设置生产者和消费者。

如果数据量小,可以将topic设置为一个partition;如果数据量较大,可以将一个生产者写死负载均衡函数,将数据发送到一个特定partition上,消费数据时指定消费者消费的partition,和offset来顺序消费数据。

图3:多个消费者组时消息流向原理图

二, Kafka性能测试:

kafka是跨语言消息队列系统,github上提供了Java, Python等多种语言客户端,为了简单起见,我们这里采用kafka-python(https://github.com/dpkp/kafka-python)作为客户端来链接kafka集群做测试。

测试环境:

1, broker 数量:3
2, 备份因子数:2
3, 磁盘信息:200G普通机械硬盘
4, cpu参数:8核8线程
5, 语言: Python2.7
6, 客户端: kafka-python
7, partition 数量: 5

单进程producer 发送10条消息测试(如图4):

图4:一个生产者发送消息延时结果图

统计上图数据可知平均延时:0.004488707,也就是说qps可以达到2000,这样的成绩无疑是惊人的。那么在多进程情况下kafka表现还会好吗?我们设置10个进程,看看kafka在10个进程下的延时会有较大的变化吗?如图5(打印消息过多,截取部分结果图):

图5:多个生产者发送消息延时结果图(部分)

由图5可知10 个进程每个进程发送10条消息,平均延时为0.00050380466秒, qps接近200000,由于kafka支持数千个客户端同时读写,所以kafka吞吐能力是惊人的,更多测试欢迎大家去完成。

三,kafka在达观数据的应用介绍

1,在垂直搜索中的应用:

我们知道搜索引擎需要定时对文档进行更新, 如果我们把需要更新内容暂存到 kafka,这样索引更新时,只需要从对应 partition 中从上一次取过的 offset 处继续取数据,就能达到增量更新目的,而过期数据会被自动清理, 减少了操作冗余性和复杂性。

2,在用户画像以及相关推荐中的应用:

和用户画像之前上报的用户点击行为数据不同,相关推荐之前的海量 item 数据上报对数据准确性要求更高,试想如果一条 item 数据因为处理失败而没有正确入库,那么相关推荐时就永远不会出现这条 item, 所以这就对“可回滚”提出了更加严格要求。然而在 kafka 中,也只需要将消费的 offset 重新置为消费失败时的 offset,修复入库问题重新消费即可。

当然 kafka 还有更加广泛的应用,这里就不一一讨论,根据官网的介绍,kafka 在网站行为追踪(Website Activity Tracking)、数据监控, 流处理等众多方面有特长,如果你对 kafka 原理有研究或者有实际应用方面有心得,欢迎来讨论,谢谢!

本文作者:蹇智华

来源:51CTO

时间: 2024-09-20 04:19:33

Kafka设计原理以及在达观产品中的应用的相关文章

移动端界面中的版式设计原理(下)

  上篇教程:<超实用!移动端界面中的版式设计原理(上)> 4. 留白的艺术 不单单是文字和图片需要设计,留白也是构成页面排版必不可少的因素.所有的白都是"有目的的留白",带有明确的目的来控制页面的空间构成. 常见的手法有几种,第一通过留白来减轻页面带给用户的负担. 首屏对一个应用来说十分重要,因此一些比较复杂的应用首评都堆积了大量的入口.如果无节制的添加,页面中包含的内容太多时,会给人一种页面狭窄的感觉,给用户带来强烈的压迫感,所以元素太多有时候反而不是好事.留白能使页面

移动端界面中的版式设计原理(上)

  "我总觉得页面不太好看但是我又说不出来","我不懂设计,但是我就是觉得不协调","你觉得这好看?你的审美要加强啊"这些听着熟悉的话往往是产品和设计产生矛盾的开端.还有一种评价叫说不出哪里好也说不出哪里不好,相信很多人也有过感同身受的无奈. 其实设计本身就是一门理性的学科,审美因人而异,只有言之有理的设计才能够说服别人.当设计师拿到产品的原型开始做设计时,如果只是单纯的按照原型进行而不考虑任何规则,那么很多时候就会产生一些不协调的结果.设计完之

kafka入门:简介、使用场景、设计原理、主要配置及集群搭建

[本文转载自kafka入门:简介.使用场景.设计原理.主要配置及集群搭建] 问题导读: 1.zookeeper在kafka的作用是什么? 2.kafka中几乎不允许对消息进行"随机读写"的原因是什么? 3.kafka集群consumer和producer状态信息是如何保存的? 4.partitions设计的目的的根本原因是什么? 一.入门     1.简介     Kafka is a distributed,partitioned,replicated commit logservi

详解JavaScript中的客户端消息框架设计原理

  这篇文章主要介绍了详解JavaScript中的客户端消息框架设计原理,包括客户端和服务器端的通信等方面的内容,需要的朋友可以参考下 哇--是个危险的题目,对吗?我们对于什么是本质的理解当然会随着我们对要解决问题的理解而变化.因此我不会说谎--一年前我所理解的本质很不幸并不完整,因为我确信我将要写的已经快伴随我有6个月之久.所以,这篇文章是我在发现JavaScript中成功的运用客户端消息模式的一些关键要点时的一个掠影. 1.) 理解中介者与观察者的区别 大多数人在描述任何事件/消息机制的时候

网站设计分析:浅谈产品中的引导式设计

想象一下一些人初次去陌生城市旅游,有的人会因为省心.对陌生的不熟悉从而选择会报名团的方式来解决出行问题.还有另外一些人会选择自驾游,但也需要先准备好相关攻略,或通过当地亲朋好友的帮助解决出行的问题.殊不知我们在报团或者咨询的的方式来增加我们对陌生城市了解,这个过程我们称之为引导. 引导式设计在网站的产品设计中的重要程度不言而喻,优秀的引导设计能帮助解决用户实际的问题,使用户尽快完成自己的目标(报团.查攻略).同时也可以满足公司的商业目标.错误的引导设计能让用户在网站中迷失,网站的跳出率居高不下.

产品中的引导式设计

想象一下一些人初次去陌生城市旅游,有的人会因为省心.对陌生的不熟悉从而选择会报名团的方式来解决出行问题.还有另外一些人会选择自驾游,但也需要先准备好相关攻略,或通过当地亲朋好友的帮助解决出行的问题.殊不知我们在报团或者咨询的的方式来增加我们对陌生城市了解,这个过程我们称之为引导. 引导式设计在网站的产品设计中的重要程度不言而喻,优秀的引导设计能帮助解决用户实际的问题,使用户尽快完成自己的目标(报团.查攻略).同时也可以满足公司的商业目标.错误的引导设计能让用户在网站中迷失,网站的跳出率居高不下.

Kafka 设计与原理详解

一.Kafka简介 本文综合了我之前写的kafka相关文章,可作为一个全面了解学习kafka的培训学习资料. 转载请注明出处 : 本文链接 1.1 背景历史 当今社会各种应用系统诸如商业.社交.搜索.浏览等像信息工厂一样不断的生产出各种信息,在大数据时代,我们面临如下几个挑战: 如何收集这些巨大的信息 如何分析它 如何及时做到如上两点 以上几个挑战形成了一个业务需求模型,即生产者生产(produce)各种信息,消费者消费(consume)(处理分析)这些信息,而在生产者与消费者之间,需要一个沟通

数据产品中的图表设计原则和方法

大数据是近些年非常热门的一个词,马云曾说过阿里巴巴未来十年的战略目标是建立DT数据时代中国商业发展的基础设施.生意参谋就是在这个大环境下孵化的一款数据产品,旨在为中小卖家提供数据化运营的思路,通过监控店铺日常经营和活动情况,帮助卖家对店铺运营进行调整.有幸参与这个产品从建立到成长的全过程.数据产品最离不开的其实就是图表设计,既要保证图表本身数据清晰准确.直观易懂,又要在找准用户关注的核心内容进行适当的突显,帮助用户通过数据进行决策.生意参谋这种数据产品就是将数据化运营的思路融入设计中,引导用户通

kafka设计与原理

一.kafka的一些重要设计思想: 1. Consumergroup:各个consumer可以zuche组成一个组,每个消息只能组中一个consumer消费,如果一个消息可以被多个consumer消费的话,那么这些consumer必须在不同的组. 2. 消息状态:在Kafka中,消息的状态被保存在consumer中,broker不会关心哪个消息被消费了被谁消费了,只记录一个offset值(指向partition中下一个要被消费的消息位置),这就意味着如果consumer处理不好的话,broker