どのアプローチを採用するか、何がベストプラクティスであるかについて、私はかなり混乱しています。次のことを行う C# アプリケーションがあるとします。
キューからメールを送信します。送信するメールとすべてのコンテンツが DB に保存されます。
これで、C# アプリケーションをほぼスケーラブルにする方法はわかりましたが、もう少し先に進む必要があります。
たとえば、Xサーバー間でタスクを分散できるという何らかの形の責任が必要です。そのため、すべての処理を 1 つのサーバーで行うだけでなく、サーバー間で共有します。1 つのサーバーがダウンした場合、負荷は他のサーバー間で共有されます。NLBがこれを行うことは知っていますが、ここでNLBを探しているわけではありません.
確かに、DB テーブルに何らかの列を追加して、そのレコードを処理するためにどのサーバーを割り当てる必要があるかを示すことができます。サーバー上の各アプリケーションには、DB の値と一致する何らかの種類の ID があり、それらは独自のレコードを取得するだけです-しかし、これは安っぽく、悪い習慣であり、非現実的であると私は考えています。
DB テーブルの行ロックも行うことは、デッドロックの可能性やその他の問題が発生する可能性があるため、私が行うことではありません。
また、ここで「極端に」スレッド化を使用することを示しているわけではありませんが、はい、アイテムごとにスレッド化して処理するか、スレッドごとに x 量のスレッドをバッチ処理します。
スケーラブルで可用性の高い C# アプリケーションを作成するには、どのようにアプローチすればよいですか? 目的は、それぞれが同じアプリケーションを備えた X サーバーを持ち、それぞれがレコードを取得して処理できるようにすることですが、サーバー間で共有される処理/アイテムのレベルを持っているため、一方のサーバーまたはサービスが失敗した場合に備えて、もう一方のサーバー別のサーバーが元に戻されるまで、その負荷を引き受けることができます。
私の理解不足や知識不足で申し訳ありませんが、これについてかなり多くのことを考えていて、良い堅牢な解決策を考えようとして睡眠不足でした。