diff --git a/src/SJZY.Track.Application/Services/ForewarningServices/ForewarningNotifyService.cs b/src/SJZY.Track.Application/Services/ForewarningServices/ForewarningNotifyService.cs index cf9eb750..692a5646 100644 --- a/src/SJZY.Track.Application/Services/ForewarningServices/ForewarningNotifyService.cs +++ b/src/SJZY.Track.Application/Services/ForewarningServices/ForewarningNotifyService.cs @@ -104,6 +104,8 @@ public class ForewarningNotifyService : IForewarningNotifyService, ITransientDep addCounter = await RedisHelper.Client.ZAddNxAsync(redisKey, left); } + // tips:由于预警队列的设计 是悲观的认为所有预警都会在未来发生,实际上预警占真实业务的发生总比应该在少数,所以这里是有优化空间的 + // 右区间移出预警队列,【只要发生了就移除】 var right = dels.Select(x => new WarningNotifyCacheEntry(x.ruleId, x.orderId, x.counter)).ToList(); if (!right.IsNullOrEmpty()) diff --git a/src/SJZY.Track.Repository/Repositories/WarningRecordEsRepository.cs b/src/SJZY.Track.Repository/Repositories/WarningRecordEsRepository.cs index 5911da19..eccbec0c 100644 --- a/src/SJZY.Track.Repository/Repositories/WarningRecordEsRepository.cs +++ b/src/SJZY.Track.Repository/Repositories/WarningRecordEsRepository.cs @@ -46,8 +46,15 @@ public class WarningRecordEsRepository : ElasticSearchContextAbstract rules) { - foreach (var rule in rules) + foreach (var group in rules.GroupBy(x => new { + x.ruleId, + x.orderId + })) + { + var rule = group.First(); + + // 这里需要使用_update_by_query API,因为可能已经发生了多条预警记录,需要一次性更新 var r = await Context.UpdateByQueryAsync(u => u .Index(GlobalConst.TrackWarningRecordIndex) .Query(q => @@ -55,7 +62,7 @@ public class WarningRecordEsRepository : ElasticSearchContextAbstract f.OrderId, rule.orderId) ) .Script(s => s.Source("ctx._source.warningStatus = params.warningStatus") - .Params(p => p.Add("warningStatus", WarningStatus.Processed)) + .Params(p => p.Add("warningStatus", (int) WarningStatus.Processed)) ) );