Rust では、非同期プログラミングは、すぐに完了しない可能性のある長時間実行オペレーションを表す future の概念に依存しています。これらの future には、実行と完了を推進するメカニズムが必要です。ここで async エグゼキュータが登場します。
async エグゼキュータは、これらの future の管理と実行を担当します。future をスケジュールし、進行状況をポーリングして、最終的に完了させる環境を提供します。非同期タスクの複雑さを処理するオーケストレータと考えてください。これにより、コードの応答性と効率性を維持できます。
Rust にはさまざまな async エグゼキュータがあり、それぞれに独自の長所と特性があります。
非同期エグゼキュータ
Rust サービスの実行プログラムの選択は、ワークロードの性質に大きく左右されます。Tokio は強力な非同期ランタイムですが、すべてのシナリオで最適なソリューションとは限りません。
主に順次オペレーションを実行するサービスの場合、Tokio などの非同期ランタイムを導入すると、パフォーマンスを大幅に向上させることなく、不要なオーバーヘッドが発生する可能性があります。このような場合は、シングルスレッド エグゼキュータの方が適していて軽量な選択肢となる可能性があります。このアプローチにより、コードベースが簡素化され、リソース消費量が削減されます。
ワーカー スレッドを構成する
本質的に同時実行または非同期オペレーションを行うサービスを扱う場合は、Tokio などの非同期ランタイムの機能を活用することが重要になります。このようなシナリオでパフォーマンスを最大化するには、システムで使用可能な CPU コアの数に合わせてワーカー スレッドの数を使用するようにランタイムを構成します。これにより、ランタイムはワークロードを効率的に分散し、利用可能な処理能力を最大限に活用できます。
ワーカー スレッドを構成する際は、システム環境全体を考慮してください。同じ仮想マシンで複数のサービスがアクティブに実行されている場合は、サービスごとのワーカー スレッドの数を調整して、CPU の過剰使用を防ぎ、すべてのアクティブなプロセス間でリソースを公平に割り当てます。
ブロッキング オペレーション
非同期ランタイム内のワーカー スレッドが長時間実行オペレーションや同期オペレーションによってブロックされないようにすることが重要です。ワーカー スレッドをブロックすると、ランタイムが受信タスクを処理して応答性を維持する能力が大幅に低下する可能性があります。
ワーカー スレッドで実行されている関数がブロッキング オペレーションを実行する必要がある場合は、tokio::spawn_blocking
を使用します。この関数は、ブロッキング オペレーションをこのようなタスク専用の別のスレッドプールにオフロードし、非同期ワーカー
スレッドの中断を防ぎ、サービスの全体的な応答性を確保します。