分布式思考:批发Batch是个好东西,用足它

2022-04-15 00:00:00 客户端 分布式 请求 字节 是个

## 前言

你家是大户,你有辆五座小轿车,过年了,你要到火车站去接来访的亲戚。如果来了小妹,你可以马上接她,让她快点到家早点休息。但你付出的代价cost是时间和汽油费。你也可以稍微等一下,因为下趟车的舅妈一个小时候后就到,你可以两个人一起接上,的麻烦可能是小妹会埋怨你几句,让她干等1个小时(Latency变长了),但trade off是你省了路上的两趟时间和两次汽油。

但是,如果某一趟来了一大家人,你的叔叔家共三人,你肯定不会分三次,每次只在车中放一个乘客。否则,你就是个大傻子。

计算机世界里,也是同样的道理。

这个优化,我们叫做Batch。

## 磁盘上的Batch

在Throughput, Bandwidth, Latency里,我有个测试,对磁盘做同样的写,只是block size不同,一个是4K,一个是1024K,磁盘的Throughput差别竟然大到超过60倍。

这就是Batch的力量。因为如果是4K一次提交,磁盘这个轿车,就只能载4K这样一个人。而1024K一次提交,磁盘这个轿车就可以满载而归。

## 网络上的Batch

网络上同样存在Batch现象。

对于TCP/IP,一个数据包package,如果跑在底层Ethernet协议上,大可以到1500字节。但如果你只发送一个字节一个包,TCP/IP也得像上面的小轿车一样去跑,而且还得在里面加上40字节的head信息(TCP用20字节、IP用20字节),这相当于上面的汽油。

所以,TCP/IP里有[Nagle算法],专门对这个进行优化。

## 操作系统和应用软件的Batch

比如:RocksDB就提供Batch的专门接口:

对于写,有[WriteBatch]

对于读,有[MultiGet]

Redis也用到了,可以参考[Redis Pipeline]

Kafka用得更多,比如:

1. IO上的Batch,参考[Kafka Efficiency]

2. [Batch Compression]

3. [RdlibKafka High Performance]

## 一些常规代码里也经常用到Batch

比如:我们有一个动态数组(假设是整型),传入应该是空的,我们需要初始化连续的数字(从零开始)

C++

void init_continuouse_nums(const int count, std::vector<int>& nums)
{
  assert(count >  && nums.size() == );


  for (int i = ; i < count; ++i)
  {
    nums.push_back(i);
  }
}

相关文章