【问题标题】:Design: Queue Management question (C#)设计:队列管理问题(C#)
【发布时间】:2010-09-07 19:59:54
【问题描述】:

我想搭建一个windows服务,使用远程编码服务(如encoding.com、zencoder等)上传视频文件进行编码,编码完成后下载,并进行处理。

为了做到这一点,我正在考虑使用不同的队列,一个用于处理当前等待的文件,一个用于上传文件,一个用于等待编码完成的文件,另一个用于下载它们。每个队列都有一个限制,例如在某个时间只能上传 5 个文件进行编码。队列必须是可见的并且能够从崩溃中恢复 - 目前我们通过将队列写入 SQL 表并管理单独表中的项目数来做到这一点。

我还希望队列在后台运行,彼此独立,但能够随着进程的进行将文件从一个队列传输到另一个队列。

我最大的问号是关于如何构建和管理队列,而不是关于限制每个队列中的项目数量。

我不确定什么是正确的方法,非常感谢任何帮助。
谢谢!

【问题讨论】:

    标签: c# .net encoding queue


    【解决方案1】:

    您可能不需要将工作分成单独的队列,只要它们以某种方式在逻辑上分开(用不同的“作业类型”等标记)。

    在我看来,挑战在于不要根据作业类型从队列中提取和处理超过给定数量的作业。前段时间我遇到了一个类似的问题,导致了question here on SO,以及随后的blog post with my solution,这两个问题都可能会给你一些想法。

    简而言之,我的解决方案是保留一个“令牌”列表。每当我想执行一项有某种限制的工作时,我首先会拿起一个代币。如果没有可用的令牌,我将需要等待一个可用。然后,您可以使用任何适合处理队列的排队机制。

    【讨论】:

    • 谢谢,这很有帮助,但我的问题是试图更多地针对单独队列的管理。你的博文很有用。谢谢!
    • 我同意弗雷德里克的观点。如果您创建 4 个队列并为每个队列(或类似数量的线程)分配一个线程,那么慢队列(负责长时间运行的进程的队列)可能会减慢整个进程,因为该队列很忙但是其他队列中的线程正在坐着,什么也不做。无论如何,微调这些线程数可能很困难。
    • 事实证明,这篇博文非常有帮助。非常感谢!
    【解决方案2】:

    有多种方法可以解决此问题,这取决于在可靠性和弹性/开发成本/维护成本方面哪一种适合您的情况。您需要回答类似的问题,即如果服务器崩溃了,继续您正在做的事情是否重要?

    队列可以在 MSMQ、SQL Server 中实现,也可以简单地在代码中实现,所有队列都在内存中。对于工作流,您可以使用 Windows Workflow Foundation,或者自己实现它,这可能会更容易,但更改会更困难。

    所以如果你再给点提示,我应该可以更好地帮助你。

    【讨论】:

    • 谢谢。是的,如果服务器崩溃,从我离开的同一地点接机至关重要。我很乐意提供更多信息,请告诉我有什么帮助。
    • 如果您需要它是故障安全的,如果我能负担得起,我会将它存储在 SQL Server 中,因为它更易于使用并且可以备份。如果没有,我将使用 Windows 附带的免费 MSMQ。对于工作流程,我只会在代码中使用简单的状态机。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多