我们用 SharpZipLib. 。我们需要能够在服务器上解压缩文件并将它们放在单独的文件夹中。解压缩文件的请求将来自网页上的用户。我想如果文件足够大,解压需要很长时间。 我们不希望用户在等待解压缩完成以继续浏览网站时被困在页面上。

处理这种情况的好方法是什么:分出一个不同的线程来处理解压缩文件,创建一个单独的 Windows 服务来解压缩文件,或者......什么?

通过单独的线程或窗口服务执行此操作有哪些优点和缺点?

有帮助吗?

解决方案

<强>单独的工艺的优点结果 在一个单独的进程所做的工作能及时分离,以及身体,并从安全角度看,从页面流。解耦的时间:如果让你选择,你可以缓冲解压东西的请求,直到“后来”当负载较低,当你有多余的CPU周期来做到这一点。

另外解耦物理;对于大规模的系统,你可以有多个工作进程,甚至部署在多个独立的机器,这样做异步工作,以及处理该层可以独立于网页处理的规模。在任何系统中存在的瓶颈,部署和分布式部署的好处是,你可以独立地扩展了独立的工作负载,能够更有效地消除瓶颈。

我想说虽然,后者的好处是只有在非常非常大规模的系统非常有用。在大多数情况下,你不会有那种交易量会由一个独立的物理尺度层中受益。这是真的不仅仅是的的工作量,但所有工作负载的98%。在YAGNI原则适用于可扩展性,太多。

物理的去耦也允许不同的工作负载(页面流和zip解包)被独立地开发。换句话说,假设工作项不是一个简单的“解压缩文件”,但更多的东西复杂,沿途多个步骤和决策点。在单独的过程设计工作处理器允许页面流待建并从工作项处理独立地进行测试。这可能是一个很好的优势,如果他们要独立发展。

此物理的去耦也很好,如果工作项将通过不同的通道到达。假设该网页是不是一个工作项到达的唯一途径。假设你有一个FTP下跌,Web服务,或机器监控的电子邮箱也可以接收工作项。在这种情况下,它会很有意义的从网页处理分离的工作项处理基于物理的。

最后,这些东西都在运行时解耦中的安全性。 Web服务器没有可写的磁盘存储 - 在某些Web应用程序服务器部署,安全规则从写入磁盘禁止Web服务器。一个单独的非同步工作进程可以在网络的一个独立部分部署,用大量的存储空间,并且它也许是由一组独立的安全要求的限制。这可能是也可能不是适用于您。

螺纹加工的优点结果 做的工作在一个单独的线程的优点是,它要简单得多。解耦介绍了复杂性和成本。管理在一个单独的线程的工作,你没有任何管理一个单独的进程,可能在不同的机器的运作开销。有没有额外的配置,没有新的构建/部署的一步。无需额外的备份。无需额外的安全标识维护。没有沟通交流担心(超出线程分派)。

您可以选择获得有关工作项的处理稍微更复杂,以及可选做工作时同步的zip文件看起来足够小。假设你建立4秒响应时间阈值 - 上面说,你需要异步工作量,低于4秒,你做“内联”。当然,你永远不知道肯定一个压缩文件需要多长时间,但你couldd基于文件的大小,建立了良好的启发。您是否使用异步工作,或者一个单独的线程的外部进程,但说实话,这是简单的使用一个单独的线程时,采取优化的优点,这种优化提供给您。较少的额外的工作要做。所以这是螺纹方法的优点。

<强>非微分器结果 如果您选择对的工作项状态通知的AJAX轮询机制,T帽子将与任一单独的进程或单独的线程工作。我不知道你会怎么做工作项跟踪,但我想,当一个特定的工作项(zip文件?)完成后,那么你将更新某处的记录 - 在一个数据库文件系统中的文件,表格。该更新是否会发生它是由一个线程所做的相同过程中,或通过单独的进程(Windows服务)。所以AJAX客户端投票将只检查数据库表或文件系统在任何情况下,和将得到的工作项状态通知以同样的方式,无论你的架构决定的。

如何确定点击 理论是有趣的,但最终无用,而无需实际的操作限制。

工作量是关键的真实世界的项目之一。你没有说这些压缩文件有多大,但我猜测他们是“常规大小”。趣谈4GB或更少。通常,这样的一个压缩文件需要20-60秒,以解开我的笔记本电脑,但当然有真正的存储系统和速度更快的CPU的服务器上的,它会少一些。您还没有定性交易的并发性 - 有多少这些东西会在任何一个时间发生。我假设并发性也不是特别高。

如果是这样的话,我会坚持到简单的异步线程的方法。您在ASP.NET这样做,我相信在一个服务器操作系统。该CLR具有良好的线程管理和ASP.NET具有良好的工艺向外扩展的能力。因此,即使在高负载,你会得到良好的CPU使用率和规模,没有一吨的配置努力。

如果工作项都不再运行 - 让我们的几小时甚至几天的量级上说,时间是不可预知的(像股票秩序的关闭) - 以及在这种情况下我会朝着一个异步过程倾斜。如果并发是在每秒上千次,或再次非常难以预测,这也将推荐一个单独的进程。如果故障模式足够复杂,我可能要工作项是在一个单独的进程刚刚进行管理。如果工作项处理有可能定期更改(添加附加的步骤,根据不断变化的业务状况),我可能希望它在一个单独的过程。

但没有这些事情似乎是真的在你的情况 - 解压缩zip文件。

其他提示

单独线程的缺点是:

  1. 当页面结束时,没有简单的方法可以获取其他线程正在执行的操作的通知。
  2. 该应用程序可以随时重新启动。
  3. 如果用户快速连续提交页面两次,则很容易意外启动该过程两次。
  4. 多线程代码很难调试。

单独线程的优点是:

  1. 更少的代码
  2. 如果解压完成时不需要通知用户,那么很容易做到“一劳永逸”。
  3. 无需额外的安装工作。

Windows服务的优点和缺点与上面大致相反。

我个人会去打倒消息的Windows服务路线它们之间的进步,如handle返回可用于监视状态解压。

不过你也可以我想也许分拆一个线程来做到这一点,那将愉快地执行和页面的回报。

我会用一个异步的过程,你可以很容易地从支持AJAX页面查询。当完成时,该页面的AJAX部分可呈现你通常会已经提出,而用户等待处理的细节,以同步地完成。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top