2011-06-07 40 views
2

是否有任何理由不在传奇数据中重复使用NServiceBus消息(IMessage)?我的意思是有一个消息是这样的:重复使用NServiceBus消息传奇数据

public class Order : IMessage 
{ 
    public virtual List<TillOrderLine> OrderLines { get; set; } 
} 

public class TillOrderLine : IMessage { ... } 

然后还要在这样的传奇和传奇数据使用它:

public class OrderProcessingSaga : 
    Saga<OrderProcessingSagaData>, 
    IAmStartedByMessages<Order> { ... } 

public class OrderProcessingSagaData : ISagaEntity 
{ 
    public virtual Guid Id { get; set; } 
    public virtual string Originator { get; set; } 
    public virtual string OriginalMessageId { get; set; } 

    // The message data is stored by the saga here. 
    public virtual Order Order { get; set; } 
} 

我认识到,该消息被传输层存储(MSMQ),而传奇数据持续到数据库与传奇。它适用于我目前的使用情况,似乎更加优雅地重用该类,而不是为消息创建一个,而为事务存储创建另一个。

我想知道这种方法是否有任何问题?

回答

2

如果你的外行传奇持续不断地抱怨数据,我不会想到这种方法有什么问题 - 只要你意识到你正在重用一个类用于两个目的,从而引入了传奇数据(这是私人的服务)和消息(这本质上是公开的)关于字段的存在,命名等。

然后,你可以建立所有的传奇数据类,如果当你需要偏离你的方式消息是结构化的。

PS:TillOrderLine如果其唯一目的是汇总在Order以内,则不需要标记为IMessage

+0

谢谢mookid,这很有道理。我没有注意到TillOrderLine中的IMessage - 很好的抓住:) – 2011-06-07 08:20:50

6

我同意一切mookid8000说,但我有一个更多的细节补充。

在您的传奇存储中通常会有很多争用。为了保证一致性,saga存储提供者通常会在数据上放置更新锁,以保证来自同一传奇的另一条消息不会同时发生状态变化。

如果您使用的是默认NHibernate的传奇留存(和你的虚拟性建议,我认为你是),那么NHibernate的使用一些假设,为了节省您的数据:

  • 复杂类型在佐贺数据将导致数据库列遵循ComplexTypePropName_ChildPropertyName语法(或其附近 - 在此从内存中操作)。因此,您的传奇数据仍将包含在一张表的1行内。
  • 如果您在传奇数据中有一个列表,它必须创建一个新表来存储列表项。现在,您的传奇数据包含在一个主行和多个详细信息行中。
    • 为了NHibernate映射这个,你的集合类型还必须有一个名为Id的Guid propery,这意味着你不能存储原语列表,并且你的TillOrderLine类(公共消息的一部分)需要这个Id财产,这对你的服务的商业目的没有意义。
  • 如果您的传奇数据(订单,基本上是消息重用)本身包含一个列表(TillOrderLines)的复杂类型,我不知道会发生什么情况。

在任何情况下,在更多表中,需要传奇持久存储器才能将数据拆分成多个表,更难以使用粒度行锁锁定涉及的行。有足够的争用,行锁将开始升级到页锁和表锁,然后你真的有问题。

这就是为什么一个文档数据库真的会为saga存储闪耀的原因,这就是为什么在NServiceBus 3.0中他们使RavenDB成为默认的传奇持久存储器。

在此之前,先看看XML Serialization based Saga Persister我写的,它可以带来一些即将RavenDB式传奇的收益留存您的应用程序今天。

如果您必须坚持使用NHibernate,我会强烈建议您将您的消息与您的传奇持久性解决方案紧密结合。我几乎保证它会回来困扰你在路上。

+0

感谢您的回答大卫,我感谢您的观点。我也非常期待3.0版RavenDB的传奇故事。这更自然。我的使用案例是我自己网站的订购场景。不幸的是,由于竞争率很高,我不希望有太多的性能下降:(严格来说,它实际上是一个单一的机器网站,网络和合作伙伴的订单以及板上的实现。我更多地使用NSB来简化设计和开发 - 哦,还有测试。 – 2011-06-07 21:34:53