在云中的计算机上维护数据

时间:2014-08-19 22:28:07

标签: c# cloud persistence

我正在使用Cloud-Hosted ZipFile创建服务。

这是一个跨源WebApi2服务,用于从无法托管任何服务器端代码的文件系统提供ZipFiles。

基本操作如下:

  • 用户发出与string[]个与文件位置相关的网址的POST请求
  • WebApi将数组读入内存,并创建一个票号
  • WebApi将票号返回给用户
  • AJAX回调然后将用户重定向到附加了票号的网址,这将返回HttpResponseMessage
  • 中的zip文件

为了处理故障单系统,我的设计方法是设置一个全局字典,将随机生成的10位数字与List<String>值配对,字典与Queue配对一次存储10,000个条目。 ([参考这里] [1])

部分原因是WebApi不支持Cache

当我在本地进行AJAX调用时,它会100%有效地工作。当我远程拨打电话时,它的工作时间约占20%。

当它失败时,这就是我得到的错误:

The given key was not present in the dictionary.

意思是,在全局字典对象中找不到票号。

我们(在Stack的帮助下)将问题跟踪到云中的多个服务器。

在这种情况下,有三个。

这并不意味着这种工作有三分之一的机会,似乎正在发生的事情是:

  • 浏览器在云端站点上进行的呼叫100%的时间都在工作,因为同一台机器端到端处理整个操作
  • 从其他网站拨打的电话的工作频率要低得多,因为接受AJAX呼叫的机器与随后REDIRECT到网站下载文件的机器之间没有连续性。如果同一台机器处理两者,那么抽奖很简单。

现在,我确信我们可以创建一个数据库来处理请求,但在这些机器之间保持状态似乎要做得更多。

这些计算机是否有任何非数据库方式在所有会话中保持相同的Dictionary并且不涉及设置第四台机器来处理队列?

2 个答案:

答案 0 :(得分:1)

字典只是为了拥有一个操作队列?

看来你需要:

  1. 托管队列的第三台计算机(尽管您有异议)。如果您使用的是Azure,那么显而易见的选择可能是分布式Azure缓存服务。
  2. 要忘记字典,只需拥有服务器包并提供请求的结果,也许是在异步操作中。

答案 1 :(得分:0)

如果您的ASP.NET Web应用程序使用会话状态,则需要配置外部会话状态提供程序(Redis缓存服务或SQL Server会话状态提供程序)。

有一个分步指南here