对于模糊的标题感到抱歉 - 我想不出一个简洁的方式来提出这个问题。我认为一个具体的例子会有所帮助。
我有一个资源密集型流程,我希望将其移至单独的服务中,然后发送消息以启动它。该消息将通过点击网站上的按钮发送(在第一次迭代中)。
问题在于,要求单击按钮十次不会使该过程运行十次,或者甚至排队十次运行该过程,因为它非常耗费资源。我们的产品经理希望在流程运行时,基本上丢弃任何其他消息。但是,一旦流程完成并释放资源,消息传递端点将根据请求消息执行操作并再次运行该流程。
我们目前正在使用阻塞和丢弃消息的信号量来解决这个问题,但我总是对并行处理和线程进行警惕。
我认为一个传奇可能是一个很好的方法来处理这个问题,因为你可以通过请求消息启动你的传奇,然后任何其他进来只会打开现有的传奇实例,这将做一个no-op on那些额外的消息。当saga结束时,请求进程的下一条消息将启动一个新的传奇。
我也知道您可以在进程运行时禁用该按钮,但是如果可能的话,我们希望避免将按钮临时耦合到进程。这意味着,我们宁愿不从网站上查看流程,看它是否已经完成。
是否有一种行业标准或优雅的方式来处理这个问题,或许我没有想过?如果可能的话,我真的想避免并行性和信号量,但我也不想让我的解决方案过于复杂。任何帮助表示赞赏。
如果您可以提供MassTransit特定信息,那么奖励积分就像我正在使用的ESB一样。
答案 0 :(得分:1)
您可以将该进程的ConcurrentConsumerLimit
设置为1,这样它一次只能消耗一条消息。如果一个人按下按钮10x,那么它只是排队。完成长时间运行后,您可以跟踪完成时间并丢弃在该段时间之前启动的任何消息。
这个问题通常被称为Idempotence。至少排序。如果没有关于您的要求的更多细节,我不完全确定最佳方法可能是什么。我建议你加入mailing list for MassTransit,看看别人是不是一个好主意。