Skip to content

Commit 35e4927

Browse files
committed
Improve async handling and add retry logic to services
Added ConfigureAwait(false) to async calls for better context management and improved performance. Enhanced KoalaHttpClientHandler with retry logic for HTTP requests. Refactored document generation and catalogue services to streamline kernel usage and document refinement. Removed unused code and improved error handling throughout the pipeline.
1 parent 428538b commit 35e4927

8 files changed

Lines changed: 292 additions & 240 deletions

File tree

‎src/KoalaWiki/BackendService/WarehouseTask.cs‎

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,10 @@ protected override async Task ExecuteAsync(CancellationToken stoppingToken)
9898
{
9999
document = await dbContext.Documents.FirstAsync(x => x.WarehouseId == value.Id,
100100
stoppingToken);
101+
102+
document.GitPath = info.LocalPath;
103+
document.LastUpdate = DateTime.UtcNow;
104+
document.Status = WarehouseStatus.Processing;
101105
logger.LogInformation("获取现有文档记录,文档ID:{Id}", document.Id);
102106
}
103107
else
@@ -122,7 +126,7 @@ protected override async Task ExecuteAsync(CancellationToken stoppingToken)
122126

123127
// 调用文档处理服务,其Activity将作为当前Activity的子Activity
124128
await documentsService.HandleAsync(document, value, dbContext,
125-
value.Address.Replace(".git", string.Empty));
129+
value.Address.Replace(".git", string.Empty)).ConfigureAwait(false);
126130
}
127131
else if (value?.Type?.Equals("file", StringComparison.OrdinalIgnoreCase) == true)
128132
{
@@ -162,7 +166,7 @@ await documentsService.HandleAsync(document, value, dbContext,
162166

163167
// 调用文档处理服务,其Activity将作为当前Activity的子Activity
164168
await documentsService.HandleAsync(document, value, dbContext,
165-
value.Address.Replace(".git", string.Empty));
169+
value.Address.Replace(".git", string.Empty)).ConfigureAwait(false);
166170
}
167171
else
168172
{

‎src/KoalaWiki/KernelFactory.cs‎

Lines changed: 17 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -46,45 +46,41 @@ public static Kernel GetKernel(string chatEndpoint,
4646
kernelBuilder.AddOpenAIChatCompletion(model, new Uri(chatEndpoint), apiKey,
4747
httpClient: new HttpClient(new KoalaHttpClientHandler()
4848
{
49-
//添加重试试
50-
AllowAutoRedirect = true,
51-
MaxAutomaticRedirections = 5,
52-
MaxConnectionsPerServer = 200,
53-
AutomaticDecompression = System.Net.DecompressionMethods.GZip | System.Net.DecompressionMethods.Brotli | System.Net.DecompressionMethods.Deflate | System.Net.DecompressionMethods.None
49+
AutomaticDecompression = System.Net.DecompressionMethods.GZip |
50+
System.Net.DecompressionMethods.Brotli |
51+
System.Net.DecompressionMethods.Deflate |
52+
System.Net.DecompressionMethods.None
5453
})
5554
{
56-
// 添加重试
57-
Timeout = TimeSpan.FromSeconds(240),
55+
Timeout = TimeSpan.FromSeconds(60),
5856
});
5957
}
6058
else if (OpenAIOptions.ModelProvider.Equals("AzureOpenAI", StringComparison.OrdinalIgnoreCase))
6159
{
6260
kernelBuilder.AddAzureOpenAIChatCompletion(model, chatEndpoint, apiKey, httpClient: new HttpClient(
6361
new KoalaHttpClientHandler()
6462
{
65-
//添加重试试
66-
AllowAutoRedirect = true,
67-
MaxAutomaticRedirections = 5,
68-
MaxConnectionsPerServer = 200,
63+
AutomaticDecompression = System.Net.DecompressionMethods.GZip |
64+
System.Net.DecompressionMethods.Brotli |
65+
System.Net.DecompressionMethods.Deflate |
66+
System.Net.DecompressionMethods.None
6967
})
7068
{
71-
// 添加重试
72-
Timeout = TimeSpan.FromSeconds(16000),
69+
Timeout = TimeSpan.FromSeconds(60),
7370
});
7471
}
7572
else if (OpenAIOptions.ModelProvider.Equals("Anthropic", StringComparison.OrdinalIgnoreCase))
7673
{
7774
kernelBuilder.AddAnthropicChatCompletion(model, apiKey, httpClient: new HttpClient(
7875
new KoalaHttpClientHandler()
7976
{
80-
//添加重试试
81-
AllowAutoRedirect = true,
82-
MaxAutomaticRedirections = 5,
83-
MaxConnectionsPerServer = 200,
77+
AutomaticDecompression = System.Net.DecompressionMethods.GZip |
78+
System.Net.DecompressionMethods.Brotli |
79+
System.Net.DecompressionMethods.Deflate |
80+
System.Net.DecompressionMethods.None
8481
})
8582
{
86-
// 添加重试
87-
Timeout = TimeSpan.FromSeconds(16000),
83+
Timeout = TimeSpan.FromSeconds(60),
8884
});
8985
}
9086
else
@@ -119,10 +115,10 @@ public static Kernel GetKernel(string chatEndpoint,
119115
kernelBuilderAction?.Invoke(kernelBuilder);
120116

121117
var kernel = kernelBuilder.Build();
122-
118+
123119
activity?.SetStatus(ActivityStatusCode.Ok);
124120
activity?.SetTag("kernel.created", true);
125121

126122
return kernel;
127123
}
128-
}
124+
}

‎src/KoalaWiki/KoalaHttpClientHander.cs‎

Lines changed: 47 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -63,10 +63,54 @@ protected override async Task<HttpResponseMessage> SendAsync(
6363
System.Text.Encoding.UTF8, "application/json");
6464

6565
// 1. 启动计时
66+
HttpResponseMessage response = null!;
6667
var stopwatch = Stopwatch.StartNew();
67-
// 2. 发送请求
68-
var response = await base.SendAsync(request, cancellationToken)
69-
.ConfigureAwait(false);
68+
for (int i = 0; i < 3; i++)
69+
{
70+
// 2. 发送请求
71+
try
72+
{
73+
response = await base.SendAsync(request, cancellationToken)
74+
.ConfigureAwait(false);
75+
if (response.IsSuccessStatusCode)
76+
{
77+
// 成功返回响应
78+
break;
79+
}
80+
else
81+
{
82+
// 如果是400系列错误,不重试
83+
if ((int)response.StatusCode >= 400 && (int)response.StatusCode < 500)
84+
{
85+
break;
86+
}
87+
var errorContent = await response.Content.ReadAsStringAsync(cancellationToken);
88+
Log.Logger.Warning("HTTP request failed, attempt {Attempt}: {StatusCode} {ErrorMessage}",
89+
i + 1, (int)response.StatusCode, errorContent);
90+
if (i == 2)
91+
{
92+
// 最后一次失败,抛出异常
93+
throw new HttpRequestException(
94+
$"Request failed with status code {(int)response.StatusCode}: {errorContent}");
95+
}
96+
97+
await Task.Delay(3000 * i, cancellationToken); // 等待一秒后重试
98+
continue;
99+
}
100+
}
101+
catch (Exception e)
102+
{
103+
Log.Logger.Warning("HTTP request failed, attempt {Attempt}: {ErrorMessage}", i + 1, e.Message);
104+
if (i == 2)
105+
{
106+
throw; // 最后一次失败,抛出异常
107+
}
108+
109+
await Task.Delay(3000, cancellationToken); // 等待一秒后重试
110+
continue;
111+
}
112+
}
113+
70114
// 3. 停止计时
71115
stopwatch.Stop();
72116

0 commit comments

Comments
 (0)