如果是 ASP 或 PHP 類的技術,可以透過設定 response 的 timeout 時間,再加上 flush (或類似機制)達成。這樣的處理用在需要較長執行時間的 api (或頁面)的情境相當適合,但如果是 nextjs 前端搭配 golang 後端,就沒有類似的機制,需要改用其他方式。
Golang WebSocket
以 fiber framework 為例, golang api backend 會長得類似這樣
nextjs 則需要建立 websocket connection
Golang Progressive Response
Go lang 裏頭,是使用 Stream 方式來做 progressive response,所以跟上面的 WebSocket 不同,這裡的 prResetFolder 這個 handler 的參數跟一般 api 呼叫一樣,都還是一個 *fiber.Ctx。
而且在 function 內可以看到 c.Context().SetBodyStreamWriter()
,直接用一個 streamwriter 來當作 body 內容輸出使用。
且裏頭還有設定一個 heart beat ticker,避免太久沒有 response 資料被browser client當作 idle 太久而斷線。
NextJS 部分會變成
實際測試與心得
因為 websocket 建立的連線跟實際 tcp/ip socke不完全一樣,所以當這個backend api 執行時間需要很久的時候,在瀏覽器這邊確實會發生以為連線已經中斷的情況。解決方式就是要自己加上程式碼,讓 backend 這邊可以定時(或者每做完一些事情)輸出一些資料去給前端。
使用 stream writer 方式加上了 ticker ,理論上就可以避免上述情況發生。但我自己實際上使用時,有時還是會發生這樣的情況,但已經比用 websocket 好很多。