2017-12-12 1 views
0

は、私のようなAPIゲートウェイからエンドポイントを呼び出す:microservicesにおけるベストプラクティスによると非同期マイクロサービス通信はUIの観点からどのようにしてベターを実行できますか?私の角度UIで

this.http.post(`/order`).subscribe(order => addNewOrderToList(order)); 

/orderハンドラは、一つ以上のmicroservicesによって消費するイベントを発行する代わりに、必要があります同期RESTを使用して互いに呼び出します。だから、私は次のハンドラ記述:UIの観点から

@RequestMapping 
public Future<Order> addOrder() { 
    CompletableFuture<Order> future = new CompletableFuture<>(); 
    // publish event 
    // ... 
    // wait for final event raised by a service. 
    future.complete(createdOrder); 
    return future; 
} 

を、私のエンドポイントが新しい順に返されるまで、そのユーザーが新しい順は表示されませんではないでしょうか?バックエンドが非同期であっても、UIはまだ同期しているように感じます。この場合のUIを改善するベストプラクティスは何ですか?

答えて

0

おそらく、この場合、非同期性と最終的な整合性を取り入れることです。

あなたのHTTPエンドポイントは、実際に何もしません。UIコマンドを受け付けるだけで、他のバックエンドマイクロサービスがエンキューして最終的に処理します。

したがって、おそらくコマンドを受け入れ、検証し、エンキューし、クライアントにHTTPステータスコード202 Acceptedを返すだけです。レスポンスにETAヘッダーを含めると、クライアントが別のエンドポイントをポーリングして結果の準備ができているかどうかを確認できます。 truly RESTful approachに従っている場合は、クライアントが準備ができたら結果をポーリングするために使用できるリソースへのリンクを含めることができます。

あなたは以下の記事を読むことをお勧めします

+0

「UIの最終的な一貫性を処理する4つの方法」の記事で私の問題が説明されています。私は最終的に記事の中で解決策3を選択します:「それを偽造する」。そこで、私はバックエンドと呼ばれるとすぐにAngularの新しいOrderを作成しました。バックエンドはidのような偽のオブジェクトを作成するのに必要な情報を返します。しかし、どういうわけか、ユーザーがこの偽の「注文」とすぐにやりとりすると、私は安全ではないと感じます(実際の「注文」が保存されるまで数秒かかる)。あなたがこのUIの問題についてより多くのリンクやパターンを提供できるなら、私はそれを高く評価します。 –

+0

バックエンドが202 Acceptedと応答した場合、バックエンドから400または500のエラーが発生する可能性がありますので、偽装しないでください。あなたができることは、ユーザーがバックエンドで完了する前に注文とやり取りする場合、限られた機能しか提供できないということです。フロントエンドではすでに知られている小さな部分しか見ることができず、バックエンドで注文が再確認されたら残りの機能が有効になることをユーザーに知らせることができます。あなたはそれが起こったときにユーザーに通知する機能を追加することができます。 –

0

はこれを行うには2つの方法がありますが、例のUI /クライアントの両方を非同期

  1. が同期にアクセスされるが、非同期の性質をブラウザから追加することができRestControllerを実装するサービスを呼び出します。これはより伝統的な方法です
  2. コントローラメソッドを有効にします。 UIはサービスを呼び出し、データが利用可能であるときに通知します。これは新しく、SPring 5.0でサポートされています

どちらも良いですが、#1アプローチは古いですが、#2はUIとサーバーの両方でより多くの処理を必要とします。非同期動作を追加すると、ユーザーの操作性が向上します。つまり、データを待たずにUIで他の操作を行うことができます。

+0

あなたがアプローチ#1のためのより多くの例を追加してもらえますか?私は非同期的にコメントするために新しい "返信"を追加するとします。私はバックエンドからの応答を待たずにすぐに新しいダミーの "Reply"オブジェクトを作成し、Angular2リストに追加して、できるだけ早く返信を見ることができます。このオブジェクトにはIDがありません。バックエンドの準備が整う前にユーザーが「好き」をクリックするとどうなりますか? –

関連する問題