iT邦幫忙

0

自 Server 定時向 Client 發送資料

  • 分享至 

  • xImage

大家好!

我正在設計一個資訊系統,需要實現的功能是每 5 秒檢查餐點狀態,如果餐點完成就向 Client 推播取餐通知。

查詢到的選擇有 SSEPollingWebSocket,但是目前沒有使用 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 環境接收,不知道能不能像新聞網站一樣,縱使關閉瀏覽器,也能即時向使用者發送通知?

我想知道是否有其他選擇能實現這樣的功能?
又或是上方選擇有其他最佳化的可能?

好問題,追蹤等看解答
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

5
Ray
iT邦大神 1 級 ‧ 2021-12-20 11:34:34
最佳解答

不知道你的應用情境, 先假設你的用戶端是使用常見的瀏覽器來看你的網站:

都已經用了 Service Worker, 為何不乾脆倚賴 Browser Vendor 提供的 Push Server:
https://ithelp.ithome.com.tw/articles/10225250

這樣你文中提到的所有問題, 都一次解決掉....

(順便提醒, 你那個 status.txt 的做法, 在多人使用時, 會發生 Race condition 甚至 Share violation 問題; 要不要考慮改成用 Redis 或者 Memcached 來做 DB cache 就好?)

Felix iT邦研究生 2 級 ‧ 2021-12-21 00:58:45 檢舉

感謝回答,我會試試看 Notification 的方法。

我記得 MySQL 也有快取機制,先來研究看看,不行就只能轉移了。

我要發表回答

立即登入回答