private void OnTimerTask(Zeze.Util.SchedulerTask ThisTask) { long login = LoginCount.Get(); long logout = LogoutCount.Get(); int online = (int)(login - logout); int onlineNew = (int)(login - LoginCountLast); LoginCountLast = login; int onlineNewPerSecond = onlineNew / TimoutDelaySeconds; if (onlineNewPerSecond > App.Instance.Config.MaxOnlineNew) { // 最近上线太多,马上报告负载。linkd不会再分配用户过来。 App.Instance.Server.ReportLoad(online, App.Instance.Config.ProposeMaxOnline, onlineNew); // new delay for digestion StartTimerTask(onlineNewPerSecond / App.Instance.Config.MaxOnlineNew + App.Instance.Config.DigestionDelayExSeconds); // 消化完后,下一次强迫报告Load。 ReportDelaySeconds = App.Instance.Config.ReportDelaySeconds; return; } // slow report ReportDelaySeconds += TimoutDelaySeconds; if (ReportDelaySeconds >= App.Instance.Config.ReportDelaySeconds) { ReportDelaySeconds = 0; App.Instance.Server.ReportLoad(online, App.Instance.Config.ProposeMaxOnline, onlineNew); } StartTimerTask(); }
public void KeepAlive() { KeepAliveTask?.Cancel(); KeepAliveTask = global::Zeze.Util.Scheduler.Instance.Schedule((ThisTask) => { App.Instance.LinkdService.GetSocket(SessionId)?.Close(null); }, 3000000); }
// 考虑不再提供单个删除,由 Cleaner 集中清理。 // under lockey.writelock /* * internal void Remove(K key) * { * map.Remove(key, out var _); * } */ public void CleanNow(Zeze.Util.SchedulerTask ThisTask) { lock (this) { if (Capacity <= 0) { return; // 容量不限 } int size = map.Count; if (size <= Capacity) { return; // 容量足够 } List <AccessTimeRecord> sorted = new List <AccessTimeRecord>(size); foreach (var p in map) { sorted.Add(new AccessTimeRecord(p)); } sorted.Sort(); // 每次多回收 255个 int nclean = size - Capacity + 255; foreach (var r in sorted) { if (nclean <= 0) { break; } if (r.p.Value.AccessTimeTicks.Get() != r.accessTimeTicks) { continue; // 排序后,记录时戳发生了更新,直接跳过。 } if (TryRemoveRecord(r.p)) { --nclean; } // 运行的不频繁:不管删除是否成功,都继续循环。 } } }