[英]Stuck on approach for real-time data with custom filters
我一直在撓頭並嘗試了大約一個星期。 所以我希望我能在這里找到我的幫助..
我正在制作一個向客戶端提供實時數據的應用程序,我考慮過 Server-Sent-Events 但這不允許每個用戶響應 AFAIK。
WebSocket 也是一個選項,但我不相信它,讓我勾勒一下我用 WS 做的場景:
let items = [ { ... some-data ... } ];
io.on("connection", socket => {
setInterval(() => {
io.emit("all_items", items);
}, 1000);
});
然而,我確信我采取這種方式的方式不是一個好方法,而且效率極低。 讓我勾勒一下我想要實現的程序場景:
SELECT * FROM Items LIMIT 20
這是復雜的部分:
location = Shelf 2
。 現在,應該發生的是 websocket 總是顯示該用戶的 20 條記錄,無論過濾器是什么我曾設想為每個用戶使用自定義選項進行自定義查詢,但我認為這很糟糕,如果你有 10.000 個用戶,這絕對會破壞服務器
我怎么能接受這個? 拜托,一切都有點幫助,提前謝謝你。
我必須對你的應用做一些猜測。 讓我在談論服務器的功能時嘗試說明它,而沒有提及 MySQL 或任何其他數據庫。
我猜您的服務器維護了大約 1k 個具有易失性值的數據點。 (它可能使用 DBMS 來維護這些值,但我們暫時忽略該機制。)我猜您的應用程序中的某些進程會根據某種外部刺激更改這些值。
您的客戶端在第一次連接到您的服務器時,開始每秒接收一次其中 20 個值的子集。 您沒有指定如何選擇該初始子集。 所有新連接的客戶端都獲得相同的 20 個值。
客戶端可以在連接時應用過濾器。 當他們這樣做時,他們開始從您擁有的所有值中獲得一個不同的、過濾的子集。 他們仍然得到二十個值。 部分或全部值可能仍在初始集中,有些可能不在。
我猜客戶端每秒都會為相同的 20 個數據點獲得更新的值。
您設想使用許多連接的客戶端大規模運行應用程序。
以下是關於系統設計的一些想法。
要達到您提到的規模,您需要在至少五台服務器上對所有這些進行負載平衡。 您沒有提到更新數據點的過程,但它必須以某種方式分散到多個服務器。 你需要記住這一點。 根據您提供給我們的信息,不可能就此向您提供建議。
但是, 雅格尼。 讓事情發揮作用,然后弄清楚如何擴大規模。 (獲得 10K 用戶真的很辛苦;花時間讓你的應用在前 10 名用戶中表現出色,然后是 100 名用戶,然后擴大規模。)
您的服務器與客戶端的交互是這樣的(忽略身份驗證等)。
因此,大多數客戶端通信都被推遲了,偶爾會有傳入的過濾器請求。
這種大量的下行流量很少的上行流量是服務器發送事件的理想場景。 Websockets 或 socket.io 也可以。 你可以像這樣構造它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.