DEV Community 日本語 フォロー Goにおけるsingleflight:負荷下での重複作業の集約 キャッシュスタンプは、キャッシュが期限切れになり、多くのリクエストが同時にミスしたときに発生し、重複した高コストな操作につながります。Goのgolang.org/x/sync/singleflightパッケージは、特定のキーに対して関数の実行を1回だけ保証することで、これを解決します。同じキーを持つ同時呼び出し元は待機し、その単一の実行からの結果を受け取ります。Doメソッドは、キーと関数を受け取り、最初の呼び出し元に対してのみ関数を実行します。後続の呼び出し元は、関数が完了するまでブロックされ、その結果を共有します。sharedブーリアンは、結果が複数の呼び出し元に配布されたかどうかを示し、メトリクスに役立ちます。Singleflight自体はキャッシュではありません。時間の重複がある場合にのみ呼び出しを折りたたみます。典型的なパターンは、キャッシュをチェックし、ミスした場合はgroup.Doを使用し、最後に結果をキャッシュに書き戻すことです。重要な注意点として、返される値は共有されるため、ポインタ、スライス、マップなどのミュータブルな型は、複数のゴルーチンによって変更されるとデータ競合を引き起こす可能性があります。これを回避するには、返される値をイミュータブルとして扱うか、呼び出し元が独立して所有および変更できるコピーを返すようにします。非ブロッキング動作のために、DoChanはチャネルを返し、呼び出し元がコンテキストキャンセルに応答できるようにします。ただし、関数は最初の呼び出し元のコンテキストで実行されるため、共有操作の場合はリクエスト固有のコンテキストから作業を分離することが推奨されます。Forgetメソッドは、キーをクリアするために使用でき、後続の呼び出しで新しい実行を開始できるようになります。これは、失敗した操作の爆発半径を制限するのに役立ちます。Singleflightは、キャッシュのロードや遅いアップストリーム呼び出しなど、重複作業が高コストになる境界に配置されるべきであり、ドメインロジック内ではありません。主な2つの落とし穴は、共有値と最初の呼び出し元のコンテキストです。 singleflight in Go: Collapsing Duplicate Work Under Load dev.to DEV Community 日本語 RSS thenote.app
golang.org/x/sync/singleflightパッケージは、特定のキーに対して関数の実行を1回だけ保証することで、これを解決します。同じキーを持つ同時呼び出し元は待機し、その単一の実行からの結果を受け取ります。Doメソッドは、キーと関数を受け取り、最初の呼び出し元に対してのみ関数を実行します。後続の呼び出し元は、関数が完了するまでブロックされ、その結果を共有します。sharedブーリアンは、結果が複数の呼び出し元に配布されたかどうかを示し、メトリクスに役立ちます。Singleflight自体はキャッシュではありません。時間の重複がある場合にのみ呼び出しを折りたたみます。典型的なパターンは、キャッシュをチェックし、ミスした場合はgroup.Doを使用し、最後に結果をキャッシュに書き戻すことです。重要な注意点として、返される値は共有されるため、ポインタ、スライス、マップなどのミュータブルな型は、複数のゴルーチンによって変更されるとデータ競合を引き起こす可能性があります。これを回避するには、返される値をイミュータブルとして扱うか、呼び出し元が独立して所有および変更できるコピーを返すようにします。非ブロッキング動作のために、DoChanはチャネルを返し、呼び出し元がコンテキストキャンセルに応答できるようにします。ただし、関数は最初の呼び出し元のコンテキストで実行されるため、共有操作の場合はリクエスト固有のコンテキストから作業を分離することが推奨されます。Forgetメソッドは、キーをクリアするために使用でき、後続の呼び出しで新しい実行を開始できるようになります。これは、失敗した操作の爆発半径を制限するのに役立ちます。Singleflightは、キャッシュのロードや遅いアップストリーム呼び出しなど、重複作業が高コストになる境界に配置されるべきであり、ドメインロジック内ではありません。主な2つの落とし穴は、共有値と最初の呼び出し元のコンテキストです。