我有一个简单的web应用程序模块,它基本上接受从移动客户端应用程序在PageLoad上保存压缩文件的请求。
现在,我要做的是解压缩文件并读取其中的文件,并将其处理为further..including,将条目输入数据库。
更新:压缩文件及其内容的大小将相当小,因此服务器不应该承受太多的负载。
更新2:我刚刚读到了when IIS queues requests (在全局/应用程序级别)。那么,这是否意味着我不需要实现复杂的请求处理机制,而IIS可以自己处理应用程序呢?
更新3:我希望卸载下载的zip处理,这不仅是为了最小化开销(就性能而言),而且也是为了避免在处理文件并将记录更新到同一个表时出现table-locking问题。在多个设备请求页面和后台任务的情况下,并行更新数据库将导致异常。
到目前为止,我集中讨论了两个解决方案:
倾向于Queuing Mechanism,我将尝试实现,因为它似乎不那么依赖于配置。v/s在服务器端手动配置作业/计划。
那么,你们有什么推荐给我的?
此外,在请求压缩文件并将其保存在服务器端之后,客户端和服务器端的连接就会被释放。不想给我的IIS带来负担。
想象一下,有几百个客户同时请求页面。
实际上,我以前都没有使用过它们,所以任何样品或者如何使用它们都会更受欢迎。
发布于 2013-02-04 07:51:08
我建议使用TPL和Rx扩展:您可以将解压缩的文件列表作为可观察的集合,并为每一项异步启动一个新任务。
发布于 2013-02-04 07:21:43
我建议建立一个排队系统。
当您收到一个文件时,您将将路径保存到线程同步队列中。同时,后台工作人员(最好是另一台机器)将检查这个队列中的新文件,并将条目排出队列以处理它。
这样,您就不会启动未知数量的线程(每个zip文件),并且可以在一个位置处理zip文件。这样,当负载变得太重时,您也可以更容易地将您的拉链处理代码移动到另一台计算机。您只需要访问一个公共队列。
最简单的方法可能是使用静态Queue和lock-object。这是最容易实现的,不需要外部资源。但这将导致应用程序回收时队列丢失。
您提到丢失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);
}
}
}这是一个非常粗略的例子。每当压缩到达时,就会将路径添加到队列中。同时,后台工作人员(或多个示例的threadsafe)将处理一个接一个的压缩,从队列中获取路径。压缩文件将按它们到达的顺序处理。
同时,您需要确保您的应用程序不回收。但是,对于本地机器上的所有资源来说,当您的机器崩溃时,这些资源就会丢失。
发布于 2017-07-13 01:09:37
我相信你是过早地优化了。
你提到了表锁定-你用的是哪种数据库?如果添加新行或更新现有行,大多数配置中的大多数现代数据库将:
我建议从一个简单的方法开始
//Unzip
//Do work
//Save results to database找点证据证明它太慢了。
https://stackoverflow.com/questions/14681974
复制相似问题