分布式发布订阅消息系统 Kafka 架构设计---1
2014-10-26 21:07
966 查看
英文原文:Kafka Architecture Design
标签: Kafka250人收藏此文章, 我要收藏帝都老白 推荐于
2 年 前 (共 48 段, 翻译完成于 03-08) (14评)
参与翻译(4人):
fbm, CodingKu, Khiyuan, nesteaa
仅中文 | 中英文对照 | 仅英文 | 打印此文章
Kafka是一个消息系统,原本开发自LinkedIn,用作LinkedIn的活动流(activity stream)和运营数据处理管道(pipeline)的基础。现在它已为多家不同类型的公司 作为多种类型的数据管道(data | fbm 翻译于 2 年 前 6人顶 顶 翻译的不错哦! |
"动态汇总(News feed)"功能。将你朋友的各种活动信息广播给你 | fbm 翻译于 2 年 前 4人顶 顶 翻译的不错哦! |
这种由不可变(immutable)的活动数据组成的高吞吐量数据流代表了对计算能力的一种真正的挑战,因其数据量很容易就可能会比网站中位于第二位的数据源的数据量大10到100倍。 | fbm 翻译于 2 年 前 6人顶 顶 翻译的不错哦! |
下面的示意图所示是在LinkedIn中部署后各系统形成的拓扑结构。 | fbm 翻译于 2 年 前 4人顶 顶 翻译的不错哦! |
Kafka之所以和其它绝大多数信息系统不同,是因为下面这几个为数不多的比较重要的设计决策: | fbm 翻译于 2 年 前 3人顶 顶 翻译的不错哦! |
首先来看一些基本的术语和概念。 | fbm 翻译于 2 年 前 5人顶 顶 翻译的不错哦! |
| fbm 翻译于 2 年 前 2人顶 顶 翻译的不错哦! |
为了抵消这种性能上的波动,现代操作系变得越来越积极地将主内存用作磁盘缓存。所有现代的操作系统都会乐于将所有空闲内存转做磁盘缓存,即时在需要回收这些内存的情况下会付出一些性能方面的代价。所有的磁盘读写操作都需要经过这个统一的缓存。想要舍弃这个特性都不太容易,除非使用直接I/O。因此,对于一个进程而言,即使它在进程内的缓存中保存了一份数据,这份数据也可能在OS的页面缓存(pagecache)中有重复的一份,结构就成了一份数据保存了两次。 更进一步讲,我们是在JVM的基础之上开发的系统,只要是了解过一些Java中内存使用方法的人都知道这两点: Java对象的内存开销(overhead)非常大,往往是对象中存储的数据所占内存的两倍(或更糟)。 Java中的内存垃圾回收会随着堆内数据不断增长而变得越来越不明确,回收所花费的代价也会越来越大。 | fbm 翻译于 2 年 前 1人顶 顶 翻译的不错哦! |
由于这些因素,使用文件系统并依赖于页面缓存要优于自己在内存中维护一个缓存或者什么别的结构 —— 通过对所有空闲内存自动拥有访问权,我们至少将可用的缓存大小翻了一倍,然后通过保存压缩后的字节结构而非单个对象,缓存可用大小接着可能又翻了一倍。这么做下来,在GC性能不受损失的情况下,我们可在一台拥有32G内存的机器上获得高达28到30G的缓存。而且,这种缓存即使在服务重启之后会仍然保持有效,而不象进程内缓存,进程重启后还需要在内存中进行缓存重建(10G的缓存重建时间可能需要10分钟),否则就需要以一个全空的缓存开始运行(这么做它的初始性能会非常糟糕)。这还大大简化了代码,因为对缓存和文件系统之间的一致性进行维护的所有逻辑现在都是在OS中实现的,这事OS做起来要比我们在进程中做那种一次性的缓存更加高效,准确性也更高。如果你使用磁盘的方式更倾向于线性读取操作,那么随着每次磁盘读取操作,预读就能非常高效使用随后准能用得着的数据填充缓存。 | fbm 翻译于 2 年 前 2人顶 顶 翻译的不错哦! |
这就让人联想到一个非常简单的设计方案:不是要在内存中保存尽可能多的数据并在需要时将这些数据刷新(flush)到文件系统,而是我们要做完全相反的事情。所有数据都要立即写入文件系统中持久化的日志中但不进行刷新数据的任何调用。实际中这么做意味着,数据被传输到OS内核的页面缓存中了,OS随后会将这些数据刷新到磁盘的。此外我们添加了一条基于配置的刷新策略,允许用户对把数据刷新到物理磁盘的频率进行控制(每当接收到N条消息或者每过M秒),从而可以为系统硬件崩溃时“处于危险之中”的数据在量上加个上限。 这种以页面缓存为中心的设计风格在一篇讲解Varnish的设计思想的文章中有详细的描述(文风略带有助于身心健康的傲气)。 | fbm 翻译于 2 年 前 2人顶 顶 翻译的不错哦! |
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们
相关文章推荐
- 分布式发布订阅消息系统 Kafka 架构设计
- 分布式发布订阅消息系统 Kafka 架构设计
- 分布式发布订阅消息系统 Kafka 架构设计 (2)
- 分布式发布订阅消息系统 Kafka 架构设计
- 分布式发布订阅消息系统 Kafka 架构设计 - 目前见到的最好的Kafka中文文章
- 分布式发布订阅消息系统 Kafka 架构设计
- 分布式发布订阅消息系统 Kafka 架构设计
- 分布式发布订阅消息系统 Kafka 架构设计
- Kafka架构设计:分布式发布订阅消息系统
- 分布式发布订阅消息系统 Kafka 架构设计
- 分布式发布订阅消息系统 Kafka 架构设计
- 分布式发布订阅消息系统 Kafka 架构设计
- 分布式发布订阅消息系统 Kafka 架构设计
- 分布式发布订阅消息系统 Kafka 架构设计[转]
- 分布式发布订阅消息系统 Kafka 架构设计
- 分布式发布订阅消息系统 Kafka 架构设计
- 分布式发布订阅消息系统 Kafka 架构设计
- 分布式发布订阅消息系统 Kafka 架构设计 - 目前见到的最好的Kafka中文文章
- 分布式发布订阅消息系统 Kafka 架构设计
- 分布式发布订阅消息系统 Kafka 架构设计