16.6 処理の分岐と待ち合わせをしたい(ファンアウト・ファンイン)

データベースや外部のAPIアクセス、巨大ファイルのアクセスなど、比較的大きなタスクを並行で実行し、すべてが完了したら次の処理を行うといったコーディングをすることがよくあるでしょう。この場合、起点となるのは1つのロジックで、ここから多数のワーカーに分岐して並行処理をします。バッチ処理などはそのまま終了する可能性もありますが、すべてのタスクが終了するのを待ってから次の処理を行います。この分岐を ファンアウト 、待ち合わせを ファンイン と呼びます。

Goの業務アプリケーションで並行処理の適用を検討すべきは、1つのリクエストやバッチタスクの内部を高速したいときです。たとえば「1つのリクエスト中で、4箇所のストレージにアクセスして情報を取得し、結果を3箇所に格納しなければならない」というようなケースです。それぞれの処理を逐次処理するとリードタイムが遅くなるため、これらを並行処理することで高速化するのです。そのため、業務アプリケーションを実装する開発者がもっとも並行処理を意識して実装するのは、このファンアウト・ファンインとなるでしょう。

ファンアウトとファンインには、タスクの大きさに応じてさまざまな方法があります。同じプロセス内で処理する場合は、組み込みの言語機能を使い処理をゴルーチンとして実行させられます。大規模な場合はAmazon SQSやCloud PubSubのようなキューイングサービスにタスクを投げ、それを受け取ったワーカープロセスが処理するといった、プロセスやマシンをまたいだ大規模な分散処理になります。本節では、sync.WaitGrouperrgroup.GroupといったGoアプリケーション内部で使えるファンイン・ファンアウトの仕組みを紹介します。 ...