我正在尝试用MSMQ实现作业队列,以节省我在SQL中实现它的一些时间。在仔细阅读之后,我意识到MSMQ可能无法提供我想要的东西。如果我的计划使用MSMQ是现实的,你能给我建议吗?或者推荐一个替代方案?
我有多个从队列中拾取作业的进程(将来可能需要向外扩展),一旦拾取了作业,处理就会跟随,在此期间,作业按状态锁定到其他进程,如果需要,作业将被抛回队列(状态再次更改)以进行进一步处理,但在物理上,作业仍然位于队列中,直到完成。
MSMQ不允许我在处理消息时将其保留在队列中,例如我可以偷看或阅读。Read将消息从队列中取出,而peek不允许更改消息(状态)。
谢谢
发布于 2013-05-14 18:00:26
使用MSMQ作为数据存储可能很糟糕,因为它根本不是为存储而设计的。除非队列是事务性的,否则消息甚至不会写入磁盘。
当然,由于您所说的原因,不支持就地更新队列项。
如果你不想要一个成熟的关系型数据库,你可以使用某种类型的内存缓存,比如memcached,或者一个廉价的对象数据库,比如raven。
发布于 2017-07-19 12:50:53
看看RabbitMQ,或者许多其他的消息队列。大多数都提供这种开箱即用的功能。
例如。RabbitMQ将您所描述的称为工作队列。多个消费者可以从同一队列中拉取,而不是拉取相同的项目。此外,如果使用确认且处理失败,则不会从队列中删除该项。
.net示例:https://www.rabbitmq.com/tutorials/tutorial-two-dotnet.html
编辑:在我自己使用MSMQ之后,据我所知,它可能对你正在做的事情非常有效。关键是使用事务和多个队列。例如,每个状态都应该有自己的队列。将消息从一个队列“移动”到另一个队列是相当安全的,因为它发生在事务中。这种消息的移动本质上就是你状态的改变。
我们还使用消息扩展字节数组来存储消息元数据,如状态。这样,在将消息移动到另一个队列时,我们不必更改实际的消息。
一般来说,MSMQ和队列需要一组与大多数程序员不同的模式。请记住这一点。
也许,如果您能够提供更多关于为什么需要查看当前正在处理的消息的信息,就会有一种使用MSMQ处理这种情况的方法。您可以随时添加一个数据库以进行额外的跟踪。
https://stackoverflow.com/questions/16531271
复制相似问题