大家好!
我正在設計一個資訊系統,需要實現的功能是每 5 秒檢查餐點狀態,如果餐點完成就向 Client 推播取餐通知。
查詢到的選擇有 SSE
、Polling
和 WebSocket
,但是目前沒有使用 Polling
的打算,至於 WebSocket
則是因為系統只需要單向推播而不考慮使用,最後實作 SSE
才發現 Server 的 CPU 資源很容易被消耗(一個連線數約使用百分之二)。
下方是實作 SSE
的程式碼:
<?php
header('Content-Type: text/stream');
header('Cache-Control: no-cache');
$json = unserialize(file_get_contents('status.txt'));
$data = json_decode($json, true);
echo 'retry: 5000' . PHP_EOL;
/* 如果餐點未完成則發送註解 */
echo in_array($_GET['rid'], $data) ? '' : ':';
echo 'data: true' . PHP_EOL . PHP_EOL;
?>
當 Server 更新餐點狀態到資料庫時,也會一併更新 status.txt
的內容,如此一來就不需要持續查詢資料庫了。
至於 Client 則是使用 Service Worker 環境接收,不知道能不能像新聞網站一樣,縱使關閉瀏覽器,也能即時向使用者發送通知?
我想知道是否有其他選擇能實現這樣的功能?
又或是上方選擇有其他最佳化的可能?
不知道你的應用情境, 先假設你的用戶端是使用常見的瀏覽器來看你的網站:
都已經用了 Service Worker, 為何不乾脆倚賴 Browser Vendor 提供的 Push Server:
https://ithelp.ithome.com.tw/articles/10225250
這樣你文中提到的所有問題, 都一次解決掉....
(順便提醒, 你那個 status.txt 的做法, 在多人使用時, 會發生 Race condition 甚至 Share violation 問題; 要不要考慮改成用 Redis 或者 Memcached 來做 DB cache 就好?)