クライアント(ClientAと呼ぶ)が特定のMQTTトピックにリクエストを発行できるシステムがあります。ブローカーは、重要な場合には、アマゾンウェブサービスです。次に、常に同じトピックにサブスクライブしている別のクライアント(MainSubscriberと呼ぶことにします)を用意します。これにより、ClientAからの要求を取得し、最終的にはデータベース操作になるいくつかの作業を実行できます。重要な場合は、データベースはDynamoDBです。
MainSubscriberは常にアクセス可能/オンラインであるとは限らないため、フェイルオーバーサブスクライバーがメインサブスクライバーのフェイルオーバーバックアップになることが望まれます。考えは、メインサブスクライバーが要求をタイムリーに処理しない場合、フェールオーバーサブスクライバーが起動し、同等の作業/データベース操作を実行するというものです。課題は、「作業」とその結果の「データベース操作」をメインサブスクライバーとフェイルオーバーサブスクライバーの両方で複製してはならないことです。
これは、このシステムの論理システムアーキテクチャ図です。
-----> MainSubscriber ----
/ \
ClientA --> Broker ---> Database
\ /
---> FailoverSubscriber --
明らかに、このようなシステムにはいくつかの課題があります。
- メインサブスクライバーは、フェールオーバーサブスクライバーに対して、要求を処理していることをどのように示しますか?
- フェイルオーバーサブスクライバーは、メインサブスクライバーが要求を取得しておらず、要求の処理を開始する必要があることをどのように検出しますか
- フェールオーバーサブスクライバーは、突然突然オンラインに戻って要求を受け取った場合に、メインサブスクライバーをどのように保留しますか?
- メインサブスクライバーとフェールオーバーサブスクライバー間の同期の問題に対処する方法
そのようなスキームの既存のソリューションがすでに存在する場合は、ホイールを再発明する必要はありません。それで、私の最初の質問は、すでに何かがあるかどうかです。
そうでない場合は、DynamoDBを非常に一貫した読み取りで使用して、メインサブスクライバーとフェールオーバーサブスクライバーの間のメディエーターとして機能することを考えていました。それで、私の2番目の質問は、これを行うための確立されたスキームがあるかどうかです。