微批处理

搾取系统所有的的CPU 和 内存,减少使用过度导致的延迟!

  • 克林贡谚语

在读过一俩遍 101 种数据流崩溃说明 之后,你的黑客之心蠢蠢欲动,已经想尽快实验一下了。事实上,有效分派并非 处理中每秒百万级数据待办列表 中的唯一事项,这还远远不够。在分布式系统中,独立部分及缓冲 IO 写入的延迟成本依然是一个常见问题。当遇到这种问题,微批处理 (MicroBatching)小分块处理是一种组织独立数据操作的方法。而术语中所谓的 ,更具体的说来,就是指在内存中。尽管当今系统的限制已经是光速,内存读取依然比硬盘读取更加快捷。

延迟时间比较

L1 缓存参考 0.5 ns
分支错误预测 6 ns
L2 缓存参考 7 ns 14x L1 缓存
互斥锁 加锁/解锁 25 ns
内存参考 100 ns
使用 Zippy 算法压缩 1K 字节 3,000 ns
在 1Gbps 网络上发送 1K 字节 10,000 ns 0.01 ms
SSD 硬盘中随机读取 4K 字节 150,000 ns 0.15 ms
内存中按顺序读取 1MB 数据 250,000 ns 0.25 ms
在同一个数据中心中往返 500,000 ns 0.5 ms
SSD 硬盘中顺序读取 1MB 1,000,000 ns 1 ms 4x 内存
机械硬盘寻道 10,000,000 ns 10 ms 20x 数据中心往返
机械硬盘顺序读取 1MB 20,000,000 ns 20 ms 80x 内存,20x SSD 硬盘
发送数据包 CA->Netherlands->CA 150,000,000 ns 150 ms
备注
1 ns = 10^(-9) 秒
1 ms = 10^(-3) 秒
* 假设为读取速度约每秒 1GB 的 SSD 硬盘
致谢
作者:Jeff Dean
最初版本作者: Peter Norvig

数据流是序列化的数据,因此,寻找边界切分聚合的缓冲区是一种灵巧的API。

划分界限的两种方式

  • 缓冲区 (Buffer) :合并边界,将 onNext<T> 汇集在分组的 List<T> 中,然后给子订阅者(Subscriber)
    • 最好同要求 Lterable<T> 作为输入参数的外部 API 一同使用。
  • 窗口 (Window) :分离边界,将 onNext<T> 转发给不同的 Stream<T>,然后传递给子订阅者。
    • 最好同累加器一同使用,例如 reduce 或任何响应 onComplete() 的订阅者/ Action 。
    • 和可以结合 flatMapconcatMap 使用,这两个函数可以将独立的窗口合并回一个普通的 Stream<T>