修复套餐接续停机竞态与轮询兜底
All checks were successful
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 11m13s
All checks were successful
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 11m13s
This commit is contained in:
@@ -132,6 +132,29 @@ func (b *PollingBase) releaseCardTrafficSyncLock(_ context.Context, cardID uint,
|
||||
}
|
||||
}
|
||||
|
||||
// ensureMissingTask 根据数据库最新卡状态,仅在对应分片队列缺失时补入任务。
|
||||
func (b *PollingBase) ensureMissingTask(ctx context.Context, cardID uint, taskType string) error {
|
||||
card, err := b.iotCardStore.GetByID(ctx, cardID)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
info, ok := b.configMgr.MergedTaskIntervals(card)[taskType]
|
||||
if !ok || info.Interval <= 0 {
|
||||
return nil
|
||||
}
|
||||
|
||||
added, err := b.queueMgr.EnsureQueued(ctx, cardID, taskType, time.Now())
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if added {
|
||||
b.logger.Info("卡状态轮询补齐缺失套餐任务",
|
||||
zap.Uint("card_id", cardID), zap.String("task_type", taskType))
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// requeueCardAt 使用独立短超时上下文执行真正的 ZADD 重入队。
|
||||
func (b *PollingBase) requeueCardAt(cardID uint, taskType string, nextCheckAt time.Time) error {
|
||||
ctx, cancel := pollingFallbackContext()
|
||||
|
||||
@@ -106,6 +106,12 @@ func (h *PollingCardStatusHandler) Handle(ctx context.Context, task *asynq.Task)
|
||||
h.base.logger.Info("独立卡命中风险状态,已关闭轮询", zap.Uint("card_id", cardID), zap.String("gateway_extend", decision.GatewayExtend))
|
||||
return nil
|
||||
}
|
||||
|
||||
// 卡状态任务仍正常但套餐任务丢失时,仅补入缺失项;不改写已有套餐任务的执行时间。
|
||||
h.base.invalidateCardCache(ctx, cardID)
|
||||
if err := h.base.ensureMissingTask(ctx, cardID, constants.TaskTypePollingPackage); err != nil {
|
||||
h.base.logger.Warn("卡状态轮询补齐套餐任务失败", zap.Uint("card_id", cardID), zap.Error(err))
|
||||
}
|
||||
return h.base.requeueCard(ctx, cardID, constants.TaskTypePollingCardStatus)
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user