簡體   English   中英

如何在微服務的多個實例之間維護 SseEmitters 列表?

[英]How to maintain SseEmitters list between multiple instances of a microservice?

語言:Spring Boot、JS

概述:我正在我的應用程序中實現服務器發送的事件功能,該功能將部署在 cloud foundry 中,其中基於隊列中的新消息(我已在我的微服務中訂閱),我將向我的客戶端發送一些更新/瀏覽器(使用 EventSource)。 為此,我在服務器端維護一個 SseEmitters 列表(用於維護所有活動的 SseEmitter)。 一旦我從隊列中收到一條新消息,我就會根據 id(隊列消息中的一個字段)將消息發送給相應的客戶端。

問題:當我通過創建應用程序的多個實例來擴展我的應用程序時,上述場景將如何工作。 由於只有一個實例會收到新的隊列消息,因此可能會發生在該特定實例中未維護活動 SseEmitter的情況,我該如何解決?

為了解決這個問題,可以觀察到以下方法。

域名系統概念

如果您考慮一下,知道您的用戶(SSE Emitter)在哪里,就像知道某個網站在哪里一樣。 您可以使用 DNS-look-alike 協議來確定您的用戶所在的位置。 協議如下:

  • 當用戶登陸您的任何實例時,將用戶與該實例相關聯。 關聯可以通過使用外部組件(例如 Redis)或分布式地圖解決方案(如 Hazelcast)來完成。
  • 每當用戶與 SSE 斷開連接時,刪除關聯。 有時斷開連接沒有正確注冊到 Spring SSEEmiter,因此可以在發送消息失敗時解除關聯。
  • 其他方(微服務)可以輕松查詢 Redis/Hazelcast 以確定用戶是哪個實例。

消息路由概念

如果您使用消息傳遞中間件在微服務之間進行通信,則可以使用 AMQP 協議提供的路由功能。 協議如下:

  • 每個 SSE 實例在啟動時創建自己的隊列
  • 用戶登陸任何 SSE 實例,實例添加交換隊列綁定,路由鍵 = 用戶 uid
  • 每當用戶與 SSE 斷開連接時,刪除關聯。 有時斷開連接沒有正確注冊到 Spring SSEEmiter,因此可以在發送消息失敗時解除關聯。
  • 其他方(微服務)需要向交換器發送消息並定義路由鍵。 AMQP 代理根據路由鍵確定哪個隊列應該接收消息。

綁定在像 RabbitMQ 這樣的現代 AMQP 代理上不是資源密集型的。

您的問題很老,如果您現在還沒有弄清楚,希望這會有所幫助。

暫無
暫無

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

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