我有一个 Web 应用程序和 Windows 服务,它们访问同一组文件。我使用命名信号量来阻止它们同时访问信息(服务或 Web 服务器请求访问目录,快速使用它,释放信号量)。
我想在 Windows Azure 上运行此应用程序。我认为使用虚拟机会很好,因为这样我就可以使用命名信号量来控制访问,然后在 VM 上运行 Web 服务器和 Windows 服务。问题是虚拟机似乎有点空间有限。我需要使用比虚拟机提供的更多的存储空间。我还会错过地理冗余存储。
在 Windows Azure 中,是否可以在云服务和网站之间共享命名信号量?也许我需要一个单独的服务,该服务可以独占访问这些文件并与服务和网站进行通信?这太糟糕了,不得不编写另一项服务并每月为此花费额外的钱。有没有更好的方法?
编辑(更多信息):
- 扩展是绝对必要的。将会存储大量数据,我担心将来它会超出虚拟机的规模。
- 它们不是数据库文件。它们是单独的文件,具有单独的目录,其中包含许多不同的索引。我担心 Windows 服务和 Web 服务器会尝试同时访问同一个索引(尽管这种情况很少见)。
- 我相信在这种情况下存储块会很好用。
- 租约 blob 不太好。等待 15 秒的时间太长了。
我想我会做的是:
我可能会有一个 VM,它运行上述 Windows 服务以及一个额外的服务,该服务除了“管理位于 blob 中的特定索引和文件的锁”之外什么都不做。因此……Web 服务器或 Windows 服务将向此服务请求“锁”。这样,两个应用程序都可以直接处理文件,并且开发时间会更短。
编辑2:
或者我可以将所有内容放在虚拟机上,使用命名信号量,然后访问存储 blob(可能是目前最好的选择)
答案1
这个问题有点开放,因为有很多方法可以解决这个问题。具体考虑一下 Azure:
- 拥有额外的服务并不一定意味着要花额外的钱。您可以在现有的虚拟机上运行您的服务。您可以将服务层设置为以串行方式运行,确保不会有两个请求同时尝试访问文件。
- 关于有限空间:在哪里您是否存储了文件?如果您将它们放在操作系统磁盘中,则不会超出操作系统磁盘的大小(约 127GB)。如果您连接磁盘,则最多可获得 1TB 空间,并且每个核心可以连接 2 个磁盘,总共最多可连接 16 个磁盘(16GB 连接存储)。
- 如果您将文件存储在文件系统中(无论是在 OS 磁盘还是附加磁盘上),则很难扩展到一台虚拟机之外,除非您有一台单独的虚拟机运行您的服务并管理存储。不过,您无法扩展到一台“服务”虚拟机之外。对于 Windows Azure,您应该真正考虑将文件存储在 Azure 存储 Blob 中。一旦您这样做,您就可以从任意数量的虚拟机访问您的存储(这意味着您可以扩展您的服务层)。
- 跟进上一条问题:我不知道您正在访问什么类型的文件。如果这些是数据库文件,那么我使用 blob 的想法就不切实际。
- 对于跨多台机器的独占访问,您需要自己的互斥方案;Azure 中没有跨机器/服务的信号量构造。虽然 blob 有租约,我认为这对于高交易场景来说效率不高。但是:想象一下,您将特定请求排队,然后让队列读取器处理特定请求。这会消除您的对象争用吗?
- 最后一个想法:除非您使用的是 Linux,否则您不一定非要使用虚拟机。您还可以查看云服务(Web/工作者角色),因为这些是无状态的 Windows Server 虚拟机,并且在扩展方面具有更大的灵活性。