高可用性
Chrisが言うように、APIサーバーはレイアウトの単一障害点です。セットアップしているのは、メッセージキューイングインフラストラクチャです。これは、多くの人が以前に実装したものです。
同じ道を進む
APIサーバーでリクエストを受信し、各サーバーで実行されているMySQL DBにジョブを挿入するとします。このパスを続行する場合は、APIサーバーレイヤーを削除して、APIユーザーから直接コマンドを受け入れるようにワーカーを設計することをお勧めします。ラウンドロビンDNSのような単純なものを使用して、各APIユーザー接続を使用可能なワーカーノードの1つに直接配布できます(接続が成功しない場合は再試行します)。
メッセージキューサーバーを使用する
より堅牢なメッセージキューイングインフラストラクチャでは、ActiveMQのような、この目的のために設計されたソフトウェアを使用します。ActiveMQのRESTful APIを使用してAPIユーザーからのPOSTリクエストを受け入れることができ、アイドル状態のワーカーはキューの次のメッセージを取得できます。ただし、これはおそらくあなたのニーズにとってはやり過ぎです。1秒あたりの遅延、速度、数百万のメッセージを考慮して設計されています。
Zookeeperを使用する
中立的な立場として、具体的にはメッセージキューサーバーではありませんが、Zookeeperを確認することをお勧めします。この正確な目的のために$ workで使用します。Zookeeperサーバーソフトウェアを実行する3つのサーバー(APIサーバーに類似)のセットがあり、ユーザーとアプリケーションからのリクエストを処理するためのWebフロントエンドがあります。WebフロントエンドとワーカーへのZookeeperバックエンド接続には、サーバーがメンテナンスのためにダウンしている場合でも、キューの処理を続行できるようにするロードバランサーがあります。作業が完了すると、ワーカーはZookeeperクラスターにジョブが完了したことを通知します。労働者が死亡すると、そのジョブは別の作業に送られ、完了します。
その他の懸念
- ワーカーが応答しない場合にジョブが完了するようにします
- APIはジョブが完了したことをどのように認識し、ワーカーのデータベースからそれを取得しますか?
- 複雑さを減らすようにしてください。各ワーカーノードに独立したMySQLサーバーが必要ですか、それともAPIサーバー上のMySQLサーバー(または複製されたMySQL Cluster)と通信できますか?
- セキュリティ。誰でもジョブを送信できますか?認証はありますか?
- 次の仕事を得るのはどの労働者ですか?タスクに10ミリ秒かかるのか1時間かかるのかは明記しません。高速な場合は、レイテンシを抑えるためにレイヤーを削除する必要があります。それらが遅い場合は、短いリクエストがいくつかの長時間実行されているものの後ろに行き詰まらないように注意する必要があります。