3

我有一个简单的 Web 应用程序模块,它基本上接受PageLoad来自移动客户端应用程序的保存 zip 文件的请求。

现在,我要做的是解压缩文件并读取其中的文件并进一步处理它......包括将条目输入数据库。

更新: zip 文件及其内容的大小将相当小,因此服务器不应承受太多负载。

更新 2:我刚刚阅读了IIS 何时对请求进行排队(在全局/应用程序级别)。那么这是否意味着我不需要实现复杂的请求处理机制并且 IIS 可以自己处理应用程序?

更新 3:我正在寻找卸载下载 zip 的处理,不仅是为了最大限度地减少开销(在性能方面),而且也是为了避免table-locking处理文件和记录更新到同一个表中的问题. 在多个设备请求页面和后台任务处理数据库并行更新的情况下会导致异常。

到目前为止,我已经将注意力集中在两个解决方案上:

  • 实现并发/消息队列
  • 将文件处理代码实现到一个单独的工具中,并在服务器上安排一个作业来检查未处理的文件并串行处理它们。

倾向于Queuing Mechanism我将尝试实现的是因为它似乎不太依赖于配置。v/s 在服务器端手动配置作业/计划。

那么,你们为此目的向我推荐什么?

此外,在请求并保存在服务器端的 zip 文件后,客户端和服务器端的连接在这样做之后被释放。不想给我的 IIS 带来负担。

想象一下有几百个客户同时请求该页面..

实际上,我之前都没有使用过它们,因此任何示例或操作方法都会受到更多赞赏。

4

3 回答 3

4

我推荐 TPL 和 Rx 扩展:您将解压缩的文件列表设置为可观察的集合,并为每个项目异步启动一个新任务。

于 2013-02-04T07:51:08.960 回答
1

我建议一个队列系统。

当您收到文件时,您会将路径保存到线程同步队列中。同时,后台工作人员(或最好是另一台机器)将检查此队列中的新文件并将条目出列以处理它。

这样您就不会启动未知数量的线程(每个 zip 文件),并且可以在一个位置处理 zip 文件。这样,当负载过重时,您还可以更轻松地将邮政编码处理代码移动到另一台机器上。您只需要访问一个公共队列。

最简单的可能是将静态对象Queue与对象一起使用lock。它是最容易实现的,不需要外部资源。但这会导致您的应用程序回收时队列丢失。

您提到丢失 zip 文件不是一种选择,如果您不想依赖外部资源,那么这种方法不是最好的。根据您的负载,可能值得利用外部资源——这意味着将 zip 文件上传到另一台机器上的公共存储,并将消息添加到另一台机器上的队列中。

这是一个本地队列的示例:

ConcurrentQueue<string> queue = new ConcurrentQueue<string>();

void GotNewZip(string pathToZip)
{
    queue.Enqueue(pathToZip); // Added a new work item to the queue
}

void MethodCalledByWorker()
{
    while (true)
    {
        if (queue.IsEmpty)
        {
            // Supposedly no work to be done, wait a few seconds and check again (new iteration)
            Thread.Sleep(TimeSpan.FromSeconds(5));
            continue;
        }

        string pathToZip;
        if (queue.TryDequeue(out pathToZip)) // If TryDeqeue returns false, another thread dequeue the last element already
        {
            HandleZipFile(pathToZip);
        }
    }
}

这是一个非常粗略的例子。每当一个 zip 到达时,您就将路径添加到队列中。同时,一个后台工作人员(或多个,示例的线程安全)将一个接一个地处理一个 zip,从队列中获取路径。zip 文件将按照它们到达的顺序进行处理。

您需要确保您的应用程序不会同时回收。但是你在本地机器上拥有的所有资源就是这种情况,当你的机器崩溃时它们会丢失。

于 2013-02-04T07:21:43.687 回答
0

我相信你过早地优化了。

您提到了表锁定-您使用的是哪种数据库?如果您添加新行或更新现有行,大多数配置中的大多数现代数据库将:

  1. 使用行级锁定;和
  2. 足够快,而无需担心锁定。

我建议从一个简单的方法开始

        //Unzip
        //Do work
        //Save results to database

并得到一些证明它太慢了。

于 2017-07-13T01:09:37.243 回答