2014-07-24 20 views
2

我在Azure上部署了一个Web角色,它使用套接字(C#)打开TCP连接到远程服务器。该连接必须始终打开。二十分钟后,似乎连接丢失。Azure Web Role是否设计用于托管永久打开的TCP连接?

所以我想知道如果Web角色设计/可以主持这样的连接?有没有可以关闭TCP连接的自动化进程(例如回收)?

当我在专用服务器上使用“标准”Windows服务时,运行代码在我的计算机上正常工作,并运行良好。

感谢您的帮助, 杰罗姆。

+0

听起来像会话超时。为什么你需要一个永远在线的连接? –

+0

我连接到金融市场。 –

+0

原则上不可能保证TCP连接保持打开状态(认为网络blip,应用程序重新部署,操作系统重新启动,崩溃,错误...)。无论如何,你必须有一个连接计划。可能,这将是一个重新连接/重试策略。 – usr

回答

0

我终于找到了符合我要求的解决方案。由于角色回收,我的TCP连接已关闭。 按照此处所述的解决方案:Disable IIS Idle Timeouts in Azure Web Role,我可以在部署我的服务时配置IIS AppPool。

所以基本上我需要禁用:

  • 空闲超时时间(20分钟默认情况下)
  • 周期的作用回收(被默认设置29小时)

谢谢大家!

4

移动到云时,您必须更改您的架构。在云中,至少最常用的云不存在100%的可用性。所以没有“永远打开”。

接下来,有相当多的因素可能会关闭您的连接。超过一些你有控制权,而另一些则没有控制权。下面是一些非结论性的列表:

  • 作用回收由于硬件故障(你无法控制)
  • 作用回收由于OS更新(你必须控制 - 设置特定的操作系统版本,但不推荐)
  • 空闲连接超时(你必须控制 - 保持连接通过定期或不定期地发送数据包,但不保持连接空闲超过60秒)
  • 别的

在或为了向所有用户提供使用云资源的平等机会,每个云提供商都将尝试以最佳方式管理这些资源。一种这样的资源是TCP套接字。

如果一个连接(任何连接)闲置超过XXX秒(这个数字随时间而改变,所以我不想引用任何具体的数字,只是假设它是1分钟),Azure将被终止。

最后 - 云中有太多因素会关闭您的连接,因此开始考虑云端方式 - 在您的协议中实施重试逻辑,并在您的服务中实施修复逻辑。最后但并非最不重要 - 如果您寻求高可用性,请不要使用单个实例角色。

有关连接超时的一个有趣的阅读可以发现here。尽管它只涉及同一数据中心内的连接(角色和虚拟机内),但它仍值得一读。

你已添加有趣的更新 - “我连接到金融市场”。即便如此,您仍然必须质疑100%的正常运行时间与99.95%的正常运行时间,这是WebRoles具有2个实例的标准SLA。从来没有说过它很容易,但是至少有2个webrole(或worker角色)实例和某种监视连接的监视程序,可以实现99.95%的可用性。始终只保留一个连接,如果发生故障 - 立即(检测到时)打开另一个连接。将所需数据保留在实例的Redis缓存中,或者将Azure缓存或角色缓存配置为实现高可用性。

云中有高可用性解决方案。但是,如果你寻找100%,这不是你的位置。云中没有100%的SLA。

+0

感谢您的回复。我有一个心跳机制来维持连接。我真的需要一个永远打开的连接,并且我必须确保连接或服务不会关闭(除非我的应用程序中存在错误或崩溃)。我不想依赖外部因素。所以也许云不是我的最佳选择... –

+0

我真的质疑你100%的可用性与重试逻辑的问题,并最大限度地减少TTR - 故障后恢复时间。您可能会发现一家提供100%SLA的云供应商,但是当您比较价格时,您确实会想回到Azure;)您将始终依赖外部因素。如果你认为自己能够以合理的价格创建100%的正常运行时间系统,那么你就是在愚弄自己 - 合理地面对它将产生的收入。 – astaykov

+0

我知道:)但我在云上很新,我虽然云服务的行为与标准的Windows服务相同。我要继续调查,一旦我确定问题出在哪里,我就会发布我的回复。 –

1

我怀疑由于Azure中使用的负载平衡器而断开连接。它用来在一分钟后断开空闲连接,但我相信这被更改为20分钟(我可以在稍后查找此参考并相应地更新此答案)。

这里要注意的重要部分是,它只是空闲的连接终止,所以如果你使用连接它不应该断开你(尽管我有一个偷偷摸摸的怀疑,可能有最大连接时间以及)。

另请注意,默认情况下,Azure角色中的IIS将在26小时后回收App池。这可以通过更改启动脚本中的IIS设置来更改。

此外,Azure中的任何实例都可以随时回收。它并不经常发生,但你无法阻止它发生。尽管您需要采取某种行动,但您的网络角色确实会收到一个事件来说明发生了这种情况。

所有这些都增加了一个事实,即如果您希望在Azure中托管,您的远程服务器将需要更灵活地处理此连接的方式。

+0

我在我的虚拟机的事件查看器中发现了问题的根源。在确切的时间,我丢失了TCP连接,出现以下事件:“进程ID为'3724'的服务应用程序池'd2995196-148a-4f49-93d9-b9e110188cc8'的工作进程由于处于非活动状态而被关闭。设置为20分钟,需要时将启动新的工作流程。“看起来应用程序池在20分钟后回收服务。我将尝试使用工作者角色而不是Web角色。 –