linux系统上的Azure Table/Blob/Queue随机超时(k8s .net core 3 app)

Posted

技术标签:

【中文标题】linux系统上的Azure Table/Blob/Queue随机超时(k8s .net core 3 app)【英文标题】:Azure Table/Blob/Queue random Timeout on linux system (k8s .net core 3 app) 【发布时间】:2020-12-14 04:35:51 【问题描述】:

这是我的场景:

Microsoft.Azure.Storage.Blob 11.2.0
Microsoft.Azure.Storage.Queue 11.2.0
Micorosoft.Azure.Cosmos.Table 1.0.7

我已经将很多代码从 Azure 函数转移到 Google k8s 和 Google Cloud,运行 Core .Net 应用程序,基本上使用 .net Standard 2.0 中内置的相同库,没有任何问题。

几天后,我注意到 Linux 系统出现了不同的行为。 很少有与 Azure 服务(blob、表、队列)交互的调用超时(子系统似乎失败,我尝试了不同的重试策略,结果相同)。 在 10,000 次呼叫中,我收到 10 到 50 个错误(或者在我更改超时之前 180 秒的非常长的呼叫)。这发生在所有 Azure 服务中:表、blob 和队列。

我尝试了不同的解决方案来找出原因:

我每次调用都会实例化客户端(blobClient、TableClient..etc),或者回收同一个客户端但没有区别 我更改了所有超时来处理这种行为。我在 ServerTimeout 和 MaximumExecutionTime 上工作,并使用我的重试机制在顶部放置一个层,这样我就可以最大限度地减少错误。现在我“只有”几个 20 秒的调用(而不是例如 2/3 秒)。 我尝试了在 *** 上发现的所有类似问题的解决方案:D ...但没有任何效果(目前)

同样的 dll 代码在 azure 函数上运行没有任何问题。

所以我得出的结论是,http 客户端中有一些东西在 azure sdk 内部使用,这取决于您运行代码的操作系统。 我认为在几篇文章之后它可能是 Keep-Alive 标题,所以我尝试了我的作文根:

ServicePointManager.SetTcpKeepAlive (true, 120000, 10000);

但没有任何变化。

有什么想法或建议吗? ...也许我走错了路,或者我错过了什么。

【问题讨论】:

自从您迁移到 Google 云后,您是否检查过部署应用程序的 GCP 区域和存储帐户所在的 Azure 区域之间的网络延迟? @KrishnenduGhosh-MSFT 谢谢,我会看看。区域之间的延迟会如此重要吗?我的一些电话被阻止了几分钟 这很重要:) 您是否有机会找到有关网络延迟/问题的任何线索? OK 区域明智的两者都非常接近。你介意分享你的存储访问代码sn-p让我看看吗?也看看这些docs.microsoft.com/en-us/azure/storage/blobs/… 和docs.microsoft.com/en-us/azure/storage/tables/… 【参考方案1】:

更新

在阅读了@KrishnenduGhosh-MSFT 在最后一条评论中链接的最后一篇文章后,我尝试更改此设置:

ServicePointManager.DefaultConnectionLimit = 100;

这是转折点。

由于它过去是随机发生的,我仍然不能 100% 确定问题是否已解决。 但在接到 50k 次电话后,我非常乐观。显然在生产中会有另一种行为,但我已经预料到了:)

更新 2 - 在产品中发布后

最后,它不起作用:( 我在 cmets 中写过,但在这里更新似乎是公平的(更具可读性)。 我还有很长的电话(缩写为MaximumExecutionTime),但我没有看到隧道尽头的光。 现在我正在考虑将一些 Azure 存储迁移到 Google 存储,但还没有完全放弃。

【讨论】:

这真的解决了您在生产中的问题吗?我们有完全相同相同的设置和问题(将计算移至 Google Cloud,但存储保留在 Azure 中),有时存储调用需要很长时间或恰好在 180 秒后失败。 AFAIK ServicePointManager.DefaultConnectionLimit 属性实际上在 .NET Core 中并没有 做任何事情并且是一个 noop,所以我真的很好奇为什么这会为你解决这个问题。 不,很遗憾,我仍在努力。由于缺乏兴趣,我认为这只是我的问题,因为我的文件中有一些奇怪的配置,所以我停止了更新信息。有消息我会第一时间通知你的。

以上是关于linux系统上的Azure Table/Blob/Queue随机超时(k8s .net core 3 app)的主要内容,如果未能解决你的问题,请参考以下文章

在 Linux 上的 Azure 上部署 R (centos 8.2.2004)

Linux 上 Azure 应用服务上 Wordpress 上的“cURL 错误 28:解决超时”

Azure Web App-当您选择Runtime stack作为Node.js时,为什么只让您选择Linux作为操作系统?

使用Azure Monitor监控服务运行状态

Azure 云服务上的 Asp.Net Core MVC?

Azure Linux 虚机图像化配置之一:CentOS配置