簡體   English   中英

消耗Kafka主題后發送HTTP響應

[英]Sending HTTP response after consuming a Kafka topic

我目前正在編寫一個包含一堆微服務的Web應用程序。 我目前正在探索如何在所有這些服務之間正確通信,並且我決定堅持使用消息總線,或更具體地說是Apache Kafka。

但是,我有幾個問題不確定如何從概念上解決。 我正在使用API​​網關服務作為應用程序的主要條目。 它充當將操作轉發到適用的微服務的主要代理。 請考慮以下情形:

  1. 用戶將帶有一些信息的POST請求發送到API網關。
  2. 網關會產生一條新消息,並將其發布到Kafka主題。
  3. 訂閱的微服務會拾取主題中的消息並處理數據。

那么,我現在應該如何從網關響應客戶端? 如果我需要該微服務的一些數據怎么辦? 這樣的HTTP請求可能會超時。 我應該在客戶端和API網關之間堅持使用websockets嗎?

而且,如果客戶端發送GET請求以獲取某些數據,我應該如何使用Kafka來解決該問題?

謝謝。

您是否可以選擇在網關中創建更多終結點?

我將使POST端點專用於將消息生成到Kafka隊列,其他微服務將使用該消息。 作為端點返回的對象,它將包含某種引用或ID以獲取消息的狀態。

並在網關中創建另一個GET端點,您可以在其中使用創建消息時獲得的消息的引用來檢索消息的狀態。

假設您要創建一個訂單。 這是應該如何工作的:

  1. 傳統上,我們過去在RDBMS表中有一個自動遞增字段或一個序列來創建訂單ID。 但是,這意味着在我們將訂單保存到數據庫中之前不會生成訂單ID。 現在,在Kafka中寫入數據時,我們不會立即寫入數據庫,並且Kafka無法生成訂單ID。 因此,您需要使用諸如Twitter Snowflake之類的可伸縮ID生成實用程序或具有類似體系結構的東西,以便甚至在用Kafka編寫訂單之前也可以生成訂單ID。

  2. 有了訂單ID后,就可以自動(全有或全無)在Kafka主題上寫一條事件消息。 成功完成此操作后,您可以將成功響應發送回客戶端。 在此階段不要寫多個主題,因為寫多個主題會失去原子性。 您總是可以有多個將事件寫入其他多個主題的使用者組。 一個使用者組應將數據寫入某個持久性數據庫中以進行查詢

  3. 現在,您需要解決讀自己的寫問題,即在收到成功響應后,用戶將立即希望看到訂單。 但是您的數據庫可能尚未使用訂單數據進行更新。 為此,請將訂單數據寫入Kafka之后並返回成功響應之前,立即將訂單數據寫入Redis或Memcached之類的分布式緩存中。 當用戶讀取訂單時,將返回緩存的數據

  4. 現在,您需要使高速緩存保持最新狀態。 您可以始終讓Kafka消費者從Kafka主題中讀取訂單狀態

  5. 為確保您不需要將所有訂單都保留在緩存中。 您可以基於LRU逐出數據。 如果在讀取訂單時數據不在高速緩存中,將從數據庫中讀取數據並將其寫入高速緩存以備將來請求

  6. 最后,如果您要確保為訂單保留訂購的商品,以便其他人都不能拿走,例如預訂飛機座位或一本書的最后一本,則需要一種共識算法。 您可以為此使用Apache Zookeeper並在該項目上創建分布式鎖

暫無
暫無

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

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