Node.js
geo

ベクトルタイル生産の前処理に入れたバックプレッシャーのコード

これは、Node.js でのバックプレッシャーのコードの書き方についてのメモです。

ベクトルタイル生産を効率的に行うには、要はいかに効率の良いデータフローを設計・実装できるかということが鍵になってきます。行うことはデータ変換なので、データフローの下流のほうが常に帯域が広いことを、必ずしも保証できないはずです。

そこで、Node.js では一般的に行われていることですが、バックプレッシャーの手法で流量制御をすることが必要になってきます。そのためのコードを modularize.js に書く機会があったので紹介します。

このコードでは、上流から来たデータを 256 個くらいある下流により分けており、また、下流には gzip 圧縮が置いてあるので、上流の流量のほうが下流の容量を追い越す場合が多く、バックプレッシャーを書く必要がありました。

modularize.js
if (streams[key].write(s)) {
  resolve()
} else {
  input.pause()
  streams[key].once('drain', () => {
    input.resume()
    resolve()
  })
}

Node.js の書き込み可能ストリームに write した時、false が戻ってくるようであれば下流が詰まっているということなのだそうです。その場合には、書き込んだストリームから drain イベントが戻ってくるまでは、上流側のストリームを休止させる、ということを上のコードでは行っています。

書いてみれば簡単ですが、問題の特定から解決までに少し手間取ったので、ここにメモしておきます。