コード例 #1
0
        /// <summary>
        /// 将满足中断条件的响应放入缓存
        /// </summary>
        /// <param name="argument"></param>
        /// <param name="result">响应结果</param>
        public void SetFunseResult(RetryPolicyArgument argument, ResponseWrapperResult result)
        {
            //未开启中断配置,或成功响应跳过
            if (argument.Option == null || !argument.Option.FuseEnabled || argument.IsSuccessResponse(result.Response))
            {
                return;
            }

            var       key   = $"{argument.Service}.{argument.Module}";
            FuseEntry entry = default;

            if (_cache.TryGetValue <FuseEntry>(key, out entry))
            {
                if (entry.FailedCount >= argument.Option.FuseEnabledWhenFailedCount)
                {
                    _logger.LogWarning($"服务{key}连续失败次数:{entry.FailedCount}已达阈值:{argument.Option.FuseEnabledWhenFailedCount},触发中断,时间:{argument.Option.FuseDuration}ms");
                    entry.Result       = result;
                    entry.Result.Fused = true;
                }
            }
            else
            {
                entry = new FuseEntry();
            }
            entry.FailedCount++;
            _cache.Set <FuseEntry>(key, entry, TimeSpan.FromMilliseconds(argument.Option.FuseDuration));
        }