在云中跨机器维护数据

本文关键字:维护 数据 机器 | 更新日期: 2023-09-27 18:18:40

我正在研究云托管的ZipFile创建服务。

这是一个跨域WebApi2服务,用于从不能承载任何服务器端代码的文件系统中提供ZipFiles。

基本操作如下:

  • 用户使用与文件位置相关的url的string[]发出POST请求
  • WebApi将数组读入内存,并创建一个票号WebApi将票号返回给用户AJAX回调,然后重定向用户到一个web地址与附加的票号,它返回压缩文件在HttpResponseMessage

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

部分原因是WebApi不支持缓存

当我在本地进行AJAX调用时,它100%有效。当我远程打电话时,大约20%的时间是正常的。

当它失败时,我得到以下错误:

The given key was not present in the dictionary.

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

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

在这种情况下,有三个。

这并不意味着有三分之一的机会这样做,似乎是这样的:

  • 浏览器在云站点上进行的调用在100%的时间内工作,因为同一台机器端到端处理整个操作
  • 从其他站点发出的调用工作频率要低得多,因为在接受AJAX调用的机器和接受随后的重定向到该网站下载文件的机器之间没有连续性。如果同一台机器同时处理这两种情况,那只是运气。

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

是否有任何非数据库的方式让这些机器在所有会话中保持相同的Dictionary,而不需要设置第四台机器来处理队列?

在云中跨机器维护数据

字典只是有一个操作队列吗?

看来你要么需要:

  1. 承载队列的第三台机器(尽管您反对)。如果你正在使用Azure,一个显而易见的选择可能是分布式Azure缓存服务。
  2. 忘记字典,只拥有服务器包并交付请求的结果,可能在异步操作中。

. NET web应用程序使用会话状态,你需要配置一个外部会话状态提供者(Redis Cache Service或SQL Server会话状态提供者)。