Skip to content

Instantly share code, notes, and snippets.

@dolphinsue319
dolphinsue319 / tienyu_chatQA.md
Created January 12, 2025 07:04
TienYu_處理斷線與漏掉訊息的聊天室

Q: 用戶 A 在聊天室中斷線並於 10 秒後重新連線,如何確保用戶 A 收到斷線期間(這 10 秒內)的所有訊息?

  • 前提:每則訊息都帶有一個可排序的唯一標識(例如 messageID 或「遞增的序號」),或使用「時間戳 (timestamp) + 伺服器的邏輯排序」來判斷訊息先後。
  • local 端儲存:在 local 端中,為每個房間記錄一個 lastReceivedMessageID(或 lastReceivedTimestamp),並在每次成功收到新的訊息後都更新。
  • 當用戶重新連線時,前端將 lastReceivedMessageID 傳給後端,後端依此回傳從這個 ID(或 Timestamp)之後的新訊息列表。
  • 當偵測到斷線(WebSocket 連線斷開事件),客戶端開始進行重連邏輯。
  • 在連線成功的初始握手或授權階段,客戶端告知伺服器「我在哪些聊天室,有哪些 lastReceivedMessageID」。。
  • 伺服器回傳遺漏訊息:
    • 從用戶提供的 lastReceivedMessageID 之後開始,批次或分頁 (pagination) 地將訊息傳回。
    • 為避免伺服器壓力,後端可設定一次最多回傳多少筆訊息,若訊息量過多則分多次回傳,讓客戶端透過多次請求或多次 WebSocket Event 接收。
  • 客戶端合併訊息:
@dolphinsue319
dolphinsue319 / TienHanQ3.swift
Created January 20, 2025 00:51
測速網域並儲存的物件
import Foundation
// 測速網域的物件
class DomainSpeedTester {
// 用來儲存測試結果的內部資料結構
private var results: [(domain: String, time: Double)] = []
// 請求圖片的 function,圖片不需儲存,最後回傳下載時間 (ms)
func downloadImg(domain: String) async throws -> Double {
let urlString = "https://\(domain)/test-img"