我有一个Web应用程序和Windows服务,访问相同的一组文件。 我使用一个已命名的信号量来阻止它同时访问信息(服务或Web服务器请求访问目录,快速使用它,释放信号量)。
我想在Windows Azure上运行这个应用程序。 我认为使用虚拟机会很好,因为这样我就可以使用命名信号来控制访问,然后在虚拟机上运行Web服务器和Windows服务。 问题在于虚拟机在空间上似乎有限 。 我需要使用比虚拟机提供更多的存储空间。 我也错过了地理上的冗余存储。
在Windows Azure中,是否有可能在Cloud Service和网站之间共享已命名的信号量? 也许我需要一个单独的服务,独家访问这些文件,并与服务和网站沟通? 这将吸吮不得不编程另一项服务,每月花费额外的钱。 有没有更好的办法?
编辑(更多信息):
- 缩放是绝对需要的。 将会有大量的数据存储,我担心将来会超出虚拟机。
- 他们不是数据库文件。 它们是具有许多不同索引的单独目录的单独文件。 我很担心Windows服务和Web服务器试图同时访问相同的索引(虽然很less发生)。
- 我相信在这种情况下,存储空间会很好。
- 租赁blob不会好。 15秒等待时间太长。
我想我会做什么:
我可能会有一个虚拟机运行上面提到的Windows服务和一个额外的服务,除了在位于blob中的特定索引和文件上“pipe理锁”之外什么也不做。 所以… Web服务器或Windows服务将要求从该服务“locking”。 这样,两个应用程序都可以直接与文件一起工作,并且花费更less的开发时间来完成这个任务。
编辑2:
或者,也许我可以把所有的东西放在虚拟机上,使用一个已命名的信号,然后访问存储blob(现在可能是最好的select)
这个问题有些开放,因为有很多方法可以解决这个问题。 具体思考Azure:
- 有额外的服务并不一定等于花费额外的钱。 您可以在现有的虚拟机上运行您的服务。 您可以将您的服务层设置为以串行方式运行,以确保没有两个请求会尝试同时访问文件。
- 关于有限的空间:你在哪里存储你的文件? 如果将它们放在OS磁盘中,则不会扩展到OS磁盘的大小(大约127GB)。 如果您连接一个磁盘,您将拥有高达1TB的磁盘空间,并且每个核心可以连接2个磁盘,最多可连接16个磁盘(总共16GB附加存储空间)。
- 如果将文件存储在文件系统中(无论是在操作系统磁盘上还是在连接的磁盘上),除非您有单独的虚拟机运行您的服务并pipe理存储,否则您将无法扩展到一台虚拟机之外。 不过,您将无法在一台“服务”虚拟机之外进行扩展。 对于Windows Azure,您应该考虑将文件存储在Azure存储Blob中。 一旦你这样做,你就可以从任意数量的虚拟机访问你的存储(这意味着你可以扩展你的服务层)。
- 前一个项目符号的跟进:我不知道你正在访问什么types的文件。 如果这些是数据库文件,那么我使用blob的想法是不实际的。
- 要在多台机器上进行独占访问,您需要自己的互斥体系; Azure中没有信号量结构跨越机器/服务。 虽然blob 租赁 ,我认为这是高效率的高交易场景。 但是:想象一下,您排队了特定的请求,然后让队列阅读器处理特定的请求。 这会消除你的对象争夺?
- 最后一个想法是:除非你使用Linux,否则你不必使用虚拟机。 您还可以查看云服务(web / workerangular色),因为这些是无状态的Windows Server虚拟机,并且具有更大的扩展灵活性。