mirror of
https://gitee.com/xmz7891/ykxmz.git
synced 2026-10-18 13:40:45 +00:00
单次请求失败不再立刻判离线,改成连续 3 次
实测单个请求有 2~4% 的偶发失败(4G 丢包打在一条隧道连接上, 或者那条连接正在重连)。原逻辑是一失败就 online = false, 于是界面上会闪一下已断开 —— 用户点按钮时正好撞上那一闪, 看起来就像又连不上了。 而链路其实 1.5~15 秒就自己恢复(客户端本来就有退避重试)。 改成连续失败 3 次才判离线(手表至少 4.5 秒、电脑至少 6 秒): * 单次抖动完全不影响界面 * 真的断了仍然如实显示 这不是掩盖问题,而是把是否可用的判断从一次采样改成连续采样 —— 单点采样在有丢包的链路上噪声太大。 两边同步改: android .../RelayTransport.java failStreak + OFFLINE_AFTER windows/lanremote/relay.py _fail_streak + OFFLINE_AFTER 顺带记录 PC 端基准(真实用户视角,之前都是在设备上量的, 那等于把设备 4G 算了两遍): 公网可用率 98% 耗时 中位 911 P90 1889 P99 23868 ms 长轮询 5/6 耗时 60.8~62.1 秒 对比设备端(中位 1344 / P90 2563)—— 用户实际体验比设备端量出来的好。
This commit is contained in:
@@ -43,6 +43,11 @@ MAX_BODY = 8 * 1024 * 1024
|
||||
# 网络断了之后的退避
|
||||
RETRY_MIN = 2.0
|
||||
RETRY_MAX = 20.0
|
||||
# 连续失败几次才判定"离线"。
|
||||
# 单次失败就报离线太敏感:4G 链路上有 2~4% 的偶发失败,
|
||||
# 而链路通常一两秒就自己恢复,界面却已经闪了一下"已断开"。
|
||||
# 连续 3 次(至少 6 秒都不通)才判离线,真的断了仍然如实显示。
|
||||
OFFLINE_AFTER = 3
|
||||
# 多久没成功通信就算掉线(用于界面上显示状态)
|
||||
STALE_SECONDS = 90.0
|
||||
|
||||
@@ -521,9 +526,13 @@ class RelayLink:
|
||||
break
|
||||
continue
|
||||
except Exception as exc: # noqa: BLE001
|
||||
self.online = False
|
||||
# 偶发的连接超时/重置不算断线,连续几次才算
|
||||
self._fail_streak = getattr(self, "_fail_streak", 0) + 1
|
||||
if self._fail_streak >= OFFLINE_AFTER:
|
||||
self.online = False
|
||||
self.last_error = f"{type(exc).__name__}: {exc}"
|
||||
self._log(f"中转连接出问题:{self.last_error}")
|
||||
self._log(f"中转连接出问题(第 {self._fail_streak} 次):"
|
||||
f"{self.last_error}")
|
||||
# 网络断了:把当前会话关掉,让上层重开
|
||||
self._drop_socket()
|
||||
self.token = ""
|
||||
@@ -611,6 +620,7 @@ class RelayLink:
|
||||
raise
|
||||
|
||||
self.online = True
|
||||
self._fail_streak = 0
|
||||
self.last_ok = time.time()
|
||||
self.last_error = ""
|
||||
|
||||
|
||||
Reference in New Issue
Block a user