我遇到的情况是我需要在Azure WebRole上高度可用的WCF服务。但是有一个小问题,因为该服务应处理需要从Blob存储加载大量数据(3GB)的请求。只有在服务启动后才需要加载此数据!所以,会发生的是在服务的构造函数中我正在加载这些数据(大约需要2分钟)。每个服务请求只需要约100毫秒。
我遇到的第一个问题是服务的构造函数只在第一个请求时被调用。所以第一个使用这项服务的人必须等待2分钟,这真的很烦人。
第二个问题是,每隔一天(有时半周),服务必须再次加载该数据。所以我认为服务类已被处理?因此,再次使用该服务的人必须等待服务不负责的2分钟。
我不知道为什么会这样,以及如何阻止它发生。我的服务在InstanceContextMode.Single和ConcurrencyMode.Multiple。
任何想法都受到高度赞赏!!
答案 0 :(得分:1)
如果这些神奇的数据不经常更改,您应该从OnStart()
内部下载它,以便在OnStart()
返回之前不会将请求分派到角色实例。在OnStart()
中大约两分钟的额外工作不是很好,但它可能是可以容忍的,特别是因为用户不会再注意到延迟了。
答案 1 :(得分:0)
将3GB数据加载到辅助角色过程可能不是一个好主意。您提到“高可用性”,那么当您想要并排多个工作者角色以对请求进行负载平衡时会发生什么。每个工作人员都需要托管这些数据。此外,在多实例环境中,Azure保留对您的服务进行分解并将其移动并将其重新分配以用于资源分配等目的的权利。
您是否考虑过使用App Fabric / Windows Azure缓存托管数据?
http://www.windowsazure.com/en-us/pricing/details/caching/
您可以使用单独的辅助角色将其加载到缓存中,并在服务器负载较低的某个已知时间根据需要进行刷新。
然后,您可以让所有Web服务工作者角色根据需要在缓存中查询该数据。