質問: Redis等のpub-subモデルで連携しているアプリケーションで、 1. あるメッセージをSubscriberが受け取る 2. そこそこ負荷のかかる処理を実行する 3. 処理結果をPublishする というプロセスがあるとします。 このプロセスを冗長化(+負荷分散)したい場合、どういった方法が考えられるでしょうか? イメージとしては、単なるHTTPで動いているWebサーバの前にロードバランサを置くような構成を、Pub/Subモデル動いているアプリケーション(群)で実現したいといった感じです。 パッと思いつくのは、 1. LoadBarance用のプロセスを作り、それをSubscriberにする 2. 当該の負荷のかかるプロセスはRest等でKickできるようにしておく 3. LoadBarance用プロセス内部で自分でラウンドロビン等の処理を書き、割り振るサーバを決定する 4. 割り振られたサーバはRestでメッセージを受け取り、処理結果をPublishする といったところですが、何かデファクトスタンダード的な手法があるようであれば、ご教示いただけると幸いです。
回答: Pub/Subというと、通常は購読者(Subscriber)に対してメッセージを 発行(Publish)することをいうと思いますが、ここではSubscribeをメッセージの受信、 Publishをメッセージの送信としている様に読めましたが、その認識であっているでしょうか? 一般的には、Pub/Subで冗長化というと、 ブローカーやメッセージバスを冗長化するのだと思います。 Publishしたら、Subscriberに確実にメッセージが届くことを 保証するイメージです。 TatsuyaZamaさんが気にされているのは、 Subscriberが確実に処理を完了する事を保証するための冗長化と思いますが、 それはPub/Subはあまり関係しないので、質問に記述されている方法を含め、 ある意味どんな方法でもよい気がします。 ある程度Pub/Subの特徴を活かすなら、 1. その負荷のかかる処理を実行するSubscriberを複数登録しておく。 2. Publishされた時にそれらのSubscriberが同じ処理をする。 3. 終わったら結果をまたPublishする。 4. (同じ処理を複数のSubscriberで実行するので、複数のSubscriberが処理に成功すると、無駄にはなるが、それは許容する。) という方法もあると思います。 ある種の投機的実行ですね。