(状況を明確に説明しながら、この質問をできるだけ短くするように努めます。何か不足している場合はコメントしてください。)
状況
- 同じデータセンターで 3 台のサーバーを含むクラスターを実行しています
- 展開を容易にするために、各サーバーはまったく同じアプリケーション コードを実行します。
目的
- 1 つのサーバーで毎分1 つのタスク (タスク Xと呼びます) を実行すること。
これらの条件下で
- クラスターは引き続き分散され、高可用性を維持します
- 各サーバーは同じアプリケーション コードを実行し続けます。つまり、「コード A をマスター サーバーにデプロイし、コード B をすべてのセカンダリ サーバーにデプロイする」というようなことはありません。
サーバーの種類を区別したくない理由は、高可用性 (いわゆるマスターがダウンしたときの問題を回避する)、冗長性 (負荷の分散) を維持し、さまざまなサーバーを展開する必要がある複雑な展開手順を作成することを避けるためです。さまざまな種類のサーバーへのアプリケーション。
なぜこれが難しいのですか?このタスクを 5 分ごとに実行するコードを追加すると、各サーバーが同じアプリケーション コードを実行するため、各サーバーがタスクを実行します。そのため、各ティック中にどのサーバーが同じように実行されるかを調整できる必要があります。
Apache Kafka
またはなどの分散メッセージング メカニズムを使用できますRedis
。そのようなメカニズムを使用してそのようなタスクを調整する場合、そのような「アルゴリズム」はどのように機能しますか?
この質問を他の人に投げかけたところ、彼の答えはタスク キューを使用することでした。ただし、これでは問題が解決しないようです。なぜなら、どのサーバーがタスクをタスク キューに追加するのかという疑問が残るからです。すべてのサーバーがタスクをキューに追加すると、エントリが重複します。さらに、キュー内の次のタスクを実行するのはどのサーバーでしょうか? これらはすべて、異なる種類のサーバーを区別せずに、クラスター内で調整して決定する必要があります。