1

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

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

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

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

4

2 回答 2

4

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

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

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

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

于 2013-11-02T17:06:18.593 回答
2

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

一个建议(除了 David 的建议)是利用 Blob 的ETag功能。每当一个 blob 更新时,它的 ETag 值就会改变。当您在角色的 OnStart() 方法中下载 blob 时,您还可以获取它们的 ETag 并将其存储在某个地方(可能在缓存或本地存储中)。这将表明您的 blob 的初始状态。

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

于 2013-11-02T19:04:35.427 回答