簡體   English   中英

堅持使用自定義過濾器獲取實時數據的方法

[英]Stuck on approach for real-time data with custom filters

我一直在撓頭並嘗試了大約一個星期。 所以我希望我能在這里找到我的幫助..

我正在制作一個向客戶端提供實時數據的應用程序,我考慮過 Server-Sent-Events 但這不允許每個用戶響應 AFAIK。

WebSocket 也是一個選項,但我不相信它,讓我勾勒一下我用 WS 做的場景:

  1. 服務器每秒獲取 20 條記錄,並將它們推送到數組
  2. 該數組每秒被發送到所有 websocket 連接,請參見下面的偽:
let items = [ { ... some-data ... } ];

io.on("connection", socket => {
  setInterval(() => {
    io.emit("all_items", items);
  }, 1000);
});
  1. 用戶可以在前端 select 一些項目,websocket 接收這個每個連接

然而,我確信我采取這種方式的方式不是一個好方法,而且效率極低。 讓我勾勒一下我想要實現的程序場景:

  • 有一個數據庫,假設有 1.000 條記錄
  • 用戶從(React)前端連接到后端,連接到主“流”,大約有 20 條獲取的記錄(沒有過濾器),服務器每秒獲取一次。 SELECT * FROM Items LIMIT 20

這是復雜的部分:

  • 用戶點擊一些帶有自定義過濾器的復選框(在前端),例如location = Shelf 2 現在,應該發生的是 websocket 總是顯示該用戶的 20 條記錄,無論過濾器是什么

我曾設想為每個用戶使用自定義選項進行自定義查詢,但我認為這很糟糕,如果你有 10.000 個用戶,這絕對會破壞服務器

我怎么能接受這個? 拜托,一切都有點幫助,提前謝謝你。

我必須對你的應用做一些猜測。 讓我在談論服務器的功能時嘗試說明它,而沒有提及 MySQL 或任何其他數據庫。

我猜您的服務器維護了大約 1k 個具有易失性值的數據點。 (它可能使用 DBMS 來維護這些值,但我們暫時忽略該機制。)我猜您的應用程序中的某些進程會根據某種外部刺激更改這些值。

您的客戶端在第一次連接到您的服務器時,開始每秒接收一次其中 20 個值的子集。 您沒有指定如何選擇該初始子集。 所有新連接的客戶端都獲得相同的 20 個值。

客戶端可以在連接時應用過濾器。 當他們這樣做時,他們開始從您擁有的所有值中獲得一個不同的、過濾的子集。 他們仍然得到二十個值。 部分或全部值可能仍在初始集中,有些可能不在。

我猜客戶端每秒都會為相同的 20 個數據點獲得更新的值。

您設想使用許多連接的客戶端大規模運行應用程序。

以下是關於系統設計的一些想法。

  1. 以合適的數據結構將數據點保存在 RAM 中。
  2. 編寫 js 代碼以將客戶端指定的過濾器應用於該數據結構。 如果該代碼高效,您可以通過這種方式處理數百萬個數據點。
  3. 將該 RAM 數據結構備份到您選擇的 DBMS; MySQL 沒問題。
  4. 當您的服務器首次啟動時,從數據庫中加載數據結構。

要達到您提到的規模,您需要在至少五台服務器上對所有這些進行負載平衡。 您沒有提到更新數據點的過程,但它必須以某種方式分散到多個服務器。 你需要記住這一點。 根據您提供給我們的信息,不可能就此向您提供建議。

但是, 雅格尼 讓事情發揮作用,然后弄清楚如何擴大規模。 (獲得 10K 用戶真的很辛苦;花時間讓你的應用在前 10 名用戶中表現出色,然后是 100 名用戶,然后擴大規模。)

您的服務器與客戶端的交互是這樣的(忽略身份驗證等)。

  1. 客戶端連接,隱式請求“無過濾”過濾器。
  2. 客戶端每秒推送 20 個值。
  3. 客戶端可以隨時隱式請求不同的過濾器。
  4. 然后客戶端繼續獲得由所選過濾器選擇的二十個值。

因此,大多數客戶端通信都被推遲了,偶爾會有傳入的過濾器請求。

這種大量的下行流量很少的上行流量是服務器發送事件的理想場景。 Websockets 或 socket.io 也可以。 你可以像這樣構造它。

  1. 新客戶端連接到位於https://example.com/stream的 SSE 端點

  2. 應用過濾器時,它們會重新連接到位於https://example.com/stream?filter1=a&filter2=b&filter3=b的另一個 SSE 端點

  3. 服務器每秒向應用過濾器的每個打開的 SSE 連接發送數據。 (流在 nodejs 中工作得很好;例如,看一下signalhub package 的服務器端代碼

暫無
暫無

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

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