c# - 等待网络会导致客户端超时吗?

标签 c# parallel-processing async-await

我有一台服务器正在执行 Azure 队列指示的工作。它几乎总是在非常高的 CPU 上并行执行多个任务,并且一些任务使用 Parallel.ForEach。 在任务运行期间,我通过使用 await 调用 CloudQueue.AddMessageAsync 将分析事件写入另一个 Azure 队列。

我注意到成千上万的分析文章因以下错误而失败:

WebException:远程服务器返回错误:(500) 内部服务器错误。

我检查了 Azure 的存储事件日志,我有很多 PutMessage 命令端到端需要 80.000 毫秒,但 Azure 本身只需要 1 毫秒。我得到的 HTTP 状态代码是 500,Azure 将原因描述为客户端超时。

我认为正在发生的事情是,我的代码调用了 AddMessageAsync,从那时起我的线程被释放,网络驱动程序正在发送请求并等待响应。获得响应时,网络驱动程序需要一个线程来获得响应,并安排一个任务来执行此操作并调用我的继续。因为我的服务器一直处于高负载状态,任务需要很长时间才能获得线程,到那时 Azure 服务器决定这是客户端超时。

调用azure的代码:

await cloudQueue.AddMessageAsync(new CloudQueueMessage(aMessageContent));

异常:

StorageException: The remote server returned an error: (500) Internal Server Error.
Microsoft.WindowsAzure.Storage.Core.Executor.Executor.EndExecuteAsync[T](IAsyncResult result):11
Microsoft.WindowsAzure.Storage.Core.Util.AsyncExtensions+<>c__DisplayClass4.<CreateCallbackVoid>b__3(IAsyncResult ar):45
System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task):82
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task):41
AzureCommon.Data.AsyncQueueDataContext+<AddMessage>d__d.MoveNext() in c:\BuildAgent\work\14078ab89161833\Azure\AzureCommon\Data\Async\AsyncQueueDataContext.cs:60
System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task):82
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task):41
AzureCommon.Storage.AzureEvent+<DispatchAsync>d__1.MoveNext() in c:\BuildAgent\work\14078ab89161833\Azure\AzureCommon\Events\AzureEvent.cs:354

WebException: The remote server returned an error: (500) Internal Server Error.
System.Net.HttpWebRequest.EndGetResponse(IAsyncResult asyncResult):41
Microsoft.WindowsAzure.Storage.Core.Executor.Executor.EndGetResponse[T](IAsyncResult getResponseResult):44

我对发生这种情况的原因是否正确?如果是这样,对我来说使用单线程同步上下文会更好吗?

Azure 存储日志中的一行。您可以找到有关每个属性含义的详细信息 here .

<request-start-time>            <operation-type>     <request-status>     <http-status-code>    <end-to-end-latency-in-ms>      <server-latency-in-ms>
2014-07-29T14:55:20.0794198Z    PutMessage           ClientTimeoutError   500                   86929                           1

谢谢。

最佳答案

错误 500 意味着服务器收到了错误的请求或由于各种其他原因而崩溃。我不认为这与线程的高负载有关。请考虑采取以下行动:

  • 检查您正在使用的队列的名称。名称需要小写,以字符开头。这是一个常见问题,会导致错误 500,但服务器没有发出任何启发性错误消息。
  • 设置 Azure 存储 SDK 客户端的重试策略,最好使用指数重试策略。
  • 确保您使用的是最新的 Azure 存储 SDK,因为底层协议(protocol)最近已更改为更高效的协议(protocol)。

关于c# - 等待网络会导致客户端超时吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25057888/

相关文章:

c# - 赛事管理应用——如何管理选手和队伍?

php - 建议 : 8 million send request

go - 通过上下文取消进入异步/等待模式

C# 异步,等待

c# - PHP、Javascript 或 C# 中的微分或无限集成?

c# - 将 IEnumerable 转换为 ICollection 时会发生什么

c# - Entity Framework 5.0 查询结果不同于对数据库的直接 SQL 查询

linux - SLURM 上的多线程

c++ - 线程管理和与 boost::thread 的并行性

.net-core - 当前线程与 Dispatcher 没有关联。触发渲染时使用 InvokeAsync() 将执行切换到 Dispatcher