簡體   English   中英

使用REST API包裝基於事件的系統

[英]Wrap event based system with REST API

我正在設計一個使用微服務架構和基於事件的通信(使用Google Cloud Pub / Sub)的系統。

每個服務都在偵聽和發布消息,因此服務之間的所有功能都非常出色。

最重要的是,我想提供一個可供用戶使用的REST API,而不會破壞基於事件的方法。 但是,如果我有一個觸發事件X的端點,該如何將響應發送給用戶? 為“ ProcessXComplete”事件創建訂戶並返回200 OK是否有意義?

例如:

我有以下微服務:

  1. 服務A
  2. 服務B
  3. 前端服務-REST端點

我想向“ POST / posts”發送此請求-此請求已發送到前端服務。 前端服務應觸發“ NewPostEvent”。 服務A和服務B都將監聽此事件並執行某些操作。

到目前為止,一切都很好,但是在這里事情開始變得混亂起來。 現在,我想返回使請求成為有效操作完成操作的響應的用戶。 我如何知道所有服務都已完成其任務,以及如何創建處理程序以返回此響應?

這樣做是否有意義,或者有更好的設計來實現服務之間的基於事件的通信並提供REST API

您所描述的絕對是基於事件的編程的挑戰之一,以及最終一致性(和缺乏原子性)如何與本質上同步的UI / UX協調。

通常有一個EventXComplete事件是EventXComplete 我們的微服務會在所有可能失敗的事件完成時發布事件。 因此,有很多ServiceA.EventXSuccess事件流經隊列。 我對Google Cloud PubSub並不特別熟悉,但是在消息系統中,通常來說,發布具有很少(或沒有訂閱者)需要計算能力的消息的消息幾乎沒有額外的成本。 因此,默認情況下,我們傾向於過度闡明服務狀態; 稍后再返回並根據需要調低消息傳遞很容易。 實際上,我們的某些較新的服務具有可通過Admin API配置的消息傳遞詳細信息。

前端服務(在這里可能被認為是Gateway ServiceFacade Layer )已經擔負起UI響應式支持的責任,因此,實際上,它需要保持響應性。 在此示例中,我希望它能夠保留用戶的POST請求,返回200響應,然后根據從ServiceA和ServiceB訂閱的事件更新請求的本地副本。 它還需要提供一種機制(事件,電子郵件,webhook,gRPC等),以便在發生故障(甚至可能發生成功)時,從前端服務與任何UI進行通信。 您使用哪種通信取決於通知的重要性和時間敏感性。 一個很好的例子是從亞馬遜收到一封電子郵件,說明您下的訂單結算失敗。 他們會在幾分鍾內通過電子郵件通知您,但不會讓您等待ExecuteOrderBilling消息在UI中得到處理。

將微服務連接到UI是我們特定旅程中最具挑戰性的方面之一。 避免模​​型/數據結構的緊密耦合,與微服務流程無關的UI工作流,對於我們來說可能是最困難的一個:授權。 這些是此分布式體系結構模式的隱藏暗面,但也可以克服。 您可能需要對特定系統進行一些試驗。

這確實取決於您的業務案例。 如果REST svc將消息放入消息隊列中,則在刪除消息后,我們僅返回客戶端可以輪詢以檢查進度的參考ID。

例如,航班搜索,您的系統必須調用100個后端服務才能向您顯示航班優惠。 Search api會將消息放入隊列中,並使用一些參考ID將其保存在數據庫中,然后您將相同的ID返回給客戶端。 一旦工作人員完成了該消息,他們將使用結果更新數據庫中的引用,同時您的客戶端將進行輪詢(最好是使用Web套接字)以用結果更新UI。

想法是您不能阻止請求並使所有內容保持異步,這將使系統可伸縮。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM