【问题标题】:Hosting a WCF service in Azure WebRole with high availability在具有高可用性的 Azure WebRole 中托管 WCF 服务
【发布时间】:2013-09-02 09:58:46
【问题描述】:

我需要在 Azure WebRole 上高度可用的 WCF 服务。但是有一个小问题,因为该服务将处理需要从 Blob 存储加载大量数据 (3GB) 的请求。这些数据只需要在服务启动后加载!所以,发生的事情是在服务的构造函数中我正在加载这些数据(大约需要 2 分钟)。对服务的每个请求只需要大约 100 毫秒。

我遇到的第一个问题是服务的构造函数只在第一个请求时被调用。所以第一个使用这个服务的人要等2分钟,真的很烦。

第二个问题是每隔一天(有时是半周)服务必须再次加载该数据。所以我想服务类已经被处理了?因此再次使用该服务的人必须等待2分钟,该服务不负责。

我不知道为什么会发生这种情况以及如何阻止它发生。我的服务在 InstanceContextMode.Single 和 ConcurrencyMode.Multiple 中。

非常感谢任何想法!

【问题讨论】:

  • 千兆字节的数据有变化吗?它多久改变一次?
  • 数据可能每个月只有一次变化,而且只有整个服务有新的更新,所以一般情况下不会有太大变化

标签: wcf iis azure


【解决方案1】:

如果神奇的数据不经常更改,您应该从OnStart() 内部下载它,以便在OnStart() 返回之前不会将请求分派到角色实例。 OnStart() 的额外工作大约两分钟不是很好,但它可能是可以容忍的,尤其是因为用户不会再注意到延迟了。

【讨论】:

  • WebRole 的 OnStart() 方法不是在与服务不同的 AppDomain 中吗?
  • @Christian:嗯...谁在乎?您将数据加载到磁盘,然后调用 WCF 服务(调用“localhost”)使其从磁盘加载内容 - 全部来自 OnStart()
  • 嗯,我会试一试,但它仍然需要在第一个客户端的第一次调用时从磁盘加载,这也可能需要几秒钟
  • @Christian:如果您向“self”发送请求,则不会。如果有某种“空闲超时”,您可以定期从Run() 内部发送请求。
  • 这实际上可能是解决方案,在 OnStart() 方法中,我只需要在 localhost 上调用服务本身,它就会负责初始化......我会尝试一下
【解决方案2】:

将 3GB 数据加载到辅助角色进程中可能不是一个好主意。您提到“高可用性”,所以当您想要并排启动多个工作角色以负载平衡您的请求时会发生什么。这些工作人员中的每一个都需要托管这些数据。此外,在多实例环境中,Azure 保留关闭您的服务并移动它们并重新启动它们以用于资源分配等目的的权利。

您是否考虑过使用 App Fabric/Windows Azure 缓存来托管您的数据?

http://www.windowsazure.com/en-us/pricing/details/caching/

您可以使用单独的工作角色将其加载到缓存中,并在服务器负载较低的某个已知时间根据需要刷新它。

然后你可以让你所有的 webservice worker 角色根据需要查询缓存中的数据。

【讨论】:

  • Windows Azure 缓存将不起作用,因为 3GB 的数据需要在每个服务角色的内存中。这是必须的,因为联系缓存服务需要很长时间。
  • @Christian - 我相信 Eoin 是在讨论在您的部署中的一组角色实例中运行缓存(共存缓存),它应该提供非常低的延迟(它在同一服务中的虚拟机之间)。还有一个缓存服务,它在您的部署之外,并且由于它是一个单独的服务而具有更多延迟。
  • 是的。这两个选项都可用。 (从帖子中很难知道您是否需要同时访问每个请求的所有 3 GB 数据/或者只是可以通过密钥获得的一小部分数据)。如果 azure 托管缓存(上面的定价)不合适,您可以在一组角色中启动自己的缓存,或者按照 david 的建议启动 win2k12 vm 并托管您自己的应用程序结构缓存。只是在构造函数中加载 3GB 数据,甚至 wcf Web 服务角色的 role_start 对我来说都是糟糕的设计。
猜你喜欢
  • 2011-06-22
  • 2011-02-24
  • 2011-05-17
  • 2020-01-05
  • 1970-01-01
  • 1970-01-01
  • 2012-01-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多