web-dev-qa-db-ja.com

非同期で一貫性のない分散システムのエクスペリエンスをどのように設計できますか?

現在の動作:現在のシステムのほとんどは同期しています。つまり、リクエストを送信するとすぐにレスポンスが返されます。したがって、システムが即座に応答し、応答すると、システム内のすべてのユーザーが特定の時点で同じ状態を表示することが期待されます。

提案された動作:私たちのシステムは少し異なります。ここでは、システムがリクエストを非同期で(つまり、自由に)実行する可能性があるため、ユーザーがすぐに応答しない場合があります。代わりに、システムの状態はしばらくすると自動的に変更されます。
また、特定の時点でのシステムの状態はユーザーごとに異なるため、グループ全体で一貫性がありません。

これらの制約により、期待を正しく設定するユーザーエクスペリエンスをどのように設計できますか?

たとえば、人物Aがシステムに請求書を作成します。 Aは、操作が成功したかどうかの即時応答を取得しない場合があります。 Aが正常に応答しても、同じグループの同じアクセス権を持つBは、システムの請求書をすぐには表示しない場合があります。

2
bin

あなたは楽観的なUIパターンを探しています。これは meteor フレームワークによって非常にうまく行われています。

たとえば、人物Aが請求書を作成し、人物Aがサーバーにクエリを作成すると(請求書を作成)、このクエリの処理中に、人物AはUIに新しく作成された請求書を表示します(サーバーがはまだそれを処理していますが、サーバーがリクエストを正しく処理することを信頼しているため、これは仮定です)

その間、Bさんには何も起こりません。

クエリがサーバーによって処理されると、サーバーは、成功した場合にすべてのクライアント(ユーザーAとユーザーB)のUIを更新します。エラーの場合、ユーザーAは結果が変更され、エラーが表示されることを確認します。サーバーが十分に速く応答する場合、これは許容されます。 (処理に20秒必要な場合、パターンによりUXが低下します)

制限事項

ほとんどの場合に成功を返すと想定しない場合は、同じパターンを適用して、クエリの処理中に読み込みインジケーターを表示し、サーバーが処理した後でのみ結果を表示することもできます。

最善の方法は、特定のニーズに応じてオプティミスティックUIパターンをオプトインまたはオプトアウトすることです(このクエリはオプティミスティックUIが必要かどうか)。`

これは、多くの反応性をもたらし、ほとんどのユーザーが慣れているものから静的ではない、ヒューマンコンピューターインターフェイスの特定の考え方です。

しかし、多くのリアルタイムアプリで使用されています(Googleドキュメント、uber ...)

2
Leths