2010-05-05 123 views
1

让我首先定义问题以及为什么选择消息队列。我有一个数据层,它将是事务性的并且极其重要,并且当它们发生时尝试处理这些问题,我希望从头开始实现我的应用程序。MSMQ - 消息队列抽象和模式

我已决定通过使用Microsoft消息队列来解决这个问题,并执行插入时间允许异步。但是我很快遇到了一个问题。我执行的某些插入操作可能需要立即撤销(例如:检索)(想象这是针对POS系统的,如果您需要回忆上次事务 - 还没有插入事务)会发生什么情况。

我决定解决这个问题的方法是抽象MessageQueue并将其组合到我的数据访问层中,从而创建一组返回给数据层用户的错觉(我考虑过其他问题发生在这种情况下(即:本质上是脏的阅读等),并已达成我的目的,我可以控制这些问题)。

然而,这就是事情变得有点讨厌...我已经制定了如何找回这些邮件等(琐碎足够的问题),但我在哪里卡住的;我如何创建一个查询我的消息队列的通用(或至少有点通用)的方式?我可以最小化SQL查询和MessageQueue查询之间的重复。我已经考虑过使用LINQ(但对这项技术的理解非常有限),并且还尝试使用Predicates实现,目前它们非常难闻。

是否有我可以利用这样的问题的任何模式?我是否以这种错误的方式去做?有没有人对我如何解决这个问题有任何自己的想法?有人甚至明白我在说什么吗? :-)

任何和所有的投入将再次得到高度赞赏并认真考虑...

感谢。

任何有兴趣。我在 最终决定在其他位置根本缓存 交易和 使用MSMQ按预期和描述如下 。

回答

1

如果队列上有大量的消息,那么枚举这些消息将成为严重的瓶颈。 MSMQ是为先入先出类型的访问而设计的,任何不遵循该模式的东西都会导致你在性能方面产生很大的悲伤。

答案在很大程度上取决于那种你将要执行的查询,但答案可能是某种非SQL数据库(或CouchDB的BerkeleyDB的等等)

+0

嗨Codeka的,谢谢你的响应。你能定义“大型”吗?我的意图是为消息队列运行一个单独的服务器。这是否以任何方式改变你的回应? 最后的疑问是这种情况下,我discribing将主要运行沿的线条非常简单的SELECT语句.. SELECT * FROM RegisterTransactionHeader INNER JOIN RegisterTransactionDetail .... 再次感谢 – 2010-05-05 09:12:16

+0

队列中的位置并没有真正影响它。这主要是枚举所有消息的行为。与任何与性能有关的东西,很难给出一个难以回答的答案,但我会说如果你有超过100条消息,那么你很可能会开始注意到它。您还必须考虑到,当您列举消息时,其他进程将会关闭消息,因此也会使情况复杂化。 – 2010-05-07 01:15:31

相关问题