1

抱歉标题含糊不清 - 我想不出一个简洁的方法来问这个问题。我认为一个具体的例子会有所帮助。

我有一个资源密集型流程,我想转移到一个单独的服务中,然后发送一条消息来启动它。消息将通过单击网站上的按钮发送(在第一次迭代中)。

问题是要求单击按钮十次不会运行该进程十次甚至排队十次运行该进程,因为它是如此的资源密集型。我们的产品经理希望在进程运行时,基本上丢弃任何其他消息。但是,一旦进程完成并释放资源,消息传递端点将处理请求消息并再次运行该进程。

我们目前正在使用阻塞和丢弃消息的信号量来解决这个问题,但我总是对并行处理和线程保持警惕。

我认为 saga 可能是处理此问题的好方法,因为您可以让您的 saga 由请求消息开始,然后任何其他进入的人只会打开现有的 saga 实例,该实例将对这些附加消息执行无操作. 当 saga 完成时,请求该进程的下一条消息将启动一个新的 saga。

我也知道您可以在进程运行时禁用按钮,但如果可能的话,我们希望避免将按钮临时耦合到进程。这意味着,我们宁愿不从网站轮询该过程以查看它是否已完成。

是否有一种行业标准或优雅的方式来处理这个我可能没有想到的?如果可能的话,我真的很想避免并行性和信号量,但我也不想让我的解决方案过于复杂。任何帮助表示赞赏。

如果您可以提供 MassTransit 特定信息,因为那是我正在使用的 ESB,则可以加分。

4

1 回答 1

1

您可以ConcurrentConsumerLimit将该进程的 设置为 1,以便它一次只使用一条消息。如果一个人按了 10 次按钮,那么它就会排队。完成长时间运行的过程后,您可以跟踪完成时间并丢弃在该时间段之前启动的任何消息。

这个问题通常就是所谓的Idempotence。至少排序。如果没有关于您的要求的更多细节,我不能完全确定最好的方法是什么。我建议加入MassTransit 的邮件列表,看看其他人是否有一个好主意。

于 2013-06-26T02:26:55.810 回答