需要在启动和按需时将文件下载到Azure Web角色

时间:2013-11-02 16:39:03

标签: c# azure azure-web-roles

我有几个子网站,基本上都是powerpoint演示文稿的html版本。我需要在父应用程序的每个Azure Web角色上安装这些文件,因为这些文件必须来自同一个域(在SSL环境中会进行相关的跨框架操作。)

我只是将它们添加到项目文件中并上传它们,但这不能扩展,这些包可能超过5mb一块,最终存在大量。

在角色启动时,我怎么能/应该考虑从say,S3或Azure Blob中提取文件,并在有更新时由我手动触发?

对于按需,父应用程序是一个c#MVC应用程序,因此我可以使用该框架内的任何内容来触发作业。

2 个答案:

答案 0 :(得分:4)

首先:如果您在Azure中运行您的站点,则应考虑Azure blob与Amazon S3存储,以避免出口成本(在AWS端)和延迟。

现在:就从存储中获取内容而言,这是一种相当常见的模式,因为(看起来你已经看到过),部署包变得非常大。此外,更新单个文件并不容易,因为您需要重新捆绑/部署软件包。

在您的网络角色中,您有一个OnStart()事件,该事件会在您的实例添加到负载均衡器之前触发。这可能是放置内容下载代码的最佳位置(或通过触发init应用程序或脚本来执行下载而在启动脚本中)。在C#中,一旦您引用CloudBlockBlob,就可以执行DownloadToFile()DownloadToFileAsync()从Blob中获取内容并存储在本地Web应用程序的内容目录中。还有许多其他方法 - 只是以文件下载方式为例。

就自动更新而言:没有blob-watcher的概念;你需要实现一些东西来识别更新。也许是管理主题上的服务总线消息,其中每个实例都订阅此主题,侦听更新周围的消息?然后,每次推送新内容时,您都可以将消息推送到标识内容的主题(可能使用子网站名称)。您也可以在OnStart()期间启动每个Web角色实例中的侦听器。

答案 1 :(得分:2)

关于自动更新,大卫是对的,没有blob-watcher的概念。这是你需要自己做的事情。

一个建议(除了大卫之外)是使用Blob的ETag功能。每当blob更新时,其ETag值都会发生变化。当您在角色的OnStart()方法中下载blob时,您也可以获取它们的ETag并将其存储在某处(可能在缓存或本地存储中)。这将表明你的blob的初始状态。

您可以使用Quartz.net或类似的调度库触发计划任务,以定期获取blob列表并将blob的ETag作为列表的一部分。如果您拥有的ETag与服务器返回的ETag不同,则表示内容已更新,然后您可以为更改的blob启动下载过程。