去掉订阅快照的周期性重发

节点侧已改为按「收到主站的任何消息」判定新鲜度(过期 ⇔ 主站失联),
主站每 30 分钟的可用性检查即可持续刷新,因此主站不需要任何为续期的周期性推送。

- 删除上一版加入的 scheduledSubscriptionKeepalive(6 小时一次)。
- 保留「内容变化即推」(各处 requestSubscriptionSync)与「节点上线即推」
  (initChannel),两者覆盖变更下发与节点冷启动两种场景。
- 移除对应的 standby 保活配置项。

最终推送时机:只在订阅内容变化时推送,另在节点上线时补推一次;
空闲时零快照传输(此前 60 秒一次时为约 486 MiB/天)。

测试:433 项全过。新增 SubscriptionSnapshotPushTest 锁住两条约定——
RemoteService 不得再有定时任务(续期改由节点存活信号承担),以及订阅刷新成功后
仍必须触发一次推送(用真实 refreshDueAccounts 调用验证)。
This commit is contained in:
root
2026-09-21 16:49:55 +08:00
parent e3d4220997
commit 5f1066cdab
4 changed files with 84 additions and 72 deletions
@@ -18,7 +18,6 @@ import io.netty.util.concurrent.Promise;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;
import jakarta.annotation.PostConstruct;
@@ -254,21 +253,10 @@ public class RemoteService {
}
}
/**
* 低频保活推送。
*
* <p>快照推送改为「订阅内容变化时立即推」之后,内容长期不变时节点将收不到任何推送,
* 而节点的过期判定依据「最近一次收到快照的时刻」——于是它会在一周后永久判过期。
* 这个保活用于把「主站在线」这件事周期性告诉节点,刷新其新鲜度。
*
* <p>周期远小于节点 `SubscriptionMaxStaleSeconds`(默认 7 天):默认 6 小时一次,
* 约 1.4 MiB/天,相比原先每 60 秒一次的约 486 MiB/天 降低约三个数量级。
*/
@Scheduled(fixedDelayString = "${subscription.standby.keepalive-interval-ms:21600000}",
initialDelayString = "${subscription.standby.keepalive-initial-delay-ms:600000}")
void scheduledSubscriptionKeepalive() {
requestSubscriptionSync();
}
// 这里刻意没有「定期重发整份快照」的定时任务:
// 快照只在订阅内容变化时推送(各处 requestSubscriptionSync),节点上线时补推一次。
// 备机的过期语义是「主站失联」,由节点按「收到主站的任何消息」判定新鲜度——
// 主站每 30 分钟的可用性检查即可持续刷新它,因此不需要为续期而周期性传输快照。
private void drainSubscriptionSyncQueue() {
try {
+3 -4
View File
@@ -76,10 +76,9 @@ subscription:
standby:
sync-enabled: "${SUBSCRIPTION_STANDBY_SYNC_ENABLED:false}"
sync-secret: "${SUBSCRIPTION_SYNC_SECRET:}"
# 快照改为「订阅内容变化时立即推送」,另加低频保活刷新节点新鲜度。
# 周期须远小于节点 SubscriptionMaxStaleSeconds(默认 7 天),默认 6 小时。
keepalive-interval-ms: 21600000
keepalive-initial-delay-ms: 600000
# 快照只在订阅内容变化时推送(另在节点上线时补推一次),没有周期性重发。
# 备机的过期语义是「主站失联」,由节点按「收到主站的任何消息」判定新鲜度,
# 主站每 30 分钟的可用性检查即可持续刷新,无需为续期周期性传输快照。
bot:
token: "5222939329:AAHa6l9ZuVVdNSDLPI_H-c8O_VgeOEw5plA"