2011-09-06 51 views
4

我们正在使用NServicebus设计有解决的方案拍卖系统:我们要发出一个消息,一组可以在一个项目投标的企业。在我们收到所有出价后,我们希望将商品发送给出价最高的出价商。NServicebus时间敏感的拍卖实现

我们最初认为这种场景非常适合NServicebus:Pub/sub用于发送消息(例如BidOnItem或ItemAvailable),为每个感兴趣的公司订阅该消息的消息处理程序以及用于存储不同的消息我们收到的出价,我们完成了。

在一个正常的拍卖,我们可以设定在比方说5分钟,超时,然后决定谁根据我们收到的最高价格的项目。我们没有那种奢侈。我们遇到的问题是,我们的具体情况有一个棘手的,不可协商的业务需求:拍卖对时间非常敏感。秒很重要。我们想要做的是在所有公司都做出回应后立即决定谁获得该项目。通常这会在几秒钟内发生。我们想要决定第二个所有用户已经做出回应。显然我们也会实现一个超时,但这将是例外而不是规则。如果我们想确定是否每个人都回复了,我们需要类似于订阅了BidOnItem消息的所有端点上的所有处理程序的列表。看来NServicebus API不提供这些信息。

有未来的一些要求,我们必须实现围绕数据丰富,并会从知道上发布/订阅频道的所有处理是否已作出回应受益匪浅批准/拒绝的决定以及居中。我知道这恶臭的请求/应答这是一件好事NServicebus鼓励,因为它会导致耦合,但这一要求感觉的东西,是一个为很多的过程,这是非常难以实现的核心总线基础设施之外的基础。在这个意义上,它感觉很像NServicebus提供的Saga.ReplyToOriginator。

会是什么“NServicebus路”来解决这个问题?

回答

2

的Pub/Sub通常不是在这些拍卖场景的路要走。如果你的传奇会对你的竞拍者做出回应/回应会怎样?

S:OnAuctionCreated(携带投标人的名单,或者你可以取的地方他们)在event.Bidders 的foreach投标人 -bus.Send(RequestBidFrom(投标人)) 的setTimeout(X)

S: OnBidResponse bids.Add(response.Bidder,response.Bid)

如果(bids.Count()== Data.TotalBidders) CompleteAuction();

S:OnTimeout CompleteAuction()

+0

看起来像 “变通办法” 之一,我们认为。您示例中的RequestBidFrom方法将返回RequestBidFromCompanyX,RequestBidFromCompanyY等的实例,并且处理程序与这些类(可选地分布在多个端点上)相匹配是否正确? –

+1

这取决于请求的不同。我可能会使用相同的消息,并让“集成”端点负责不同出价人之间的映射。然后,集成端点可以决定使用不同的消息来更好地进行扩展,监控等。集成端点也可以是保存活动竞标者列表的集成端点。请记住,在发送消息时,一个请求会导致多个响应 –

+0

谢谢Andreas。我明白你要去哪里。感觉就像我们会建立一些pub/sub可以免费提供给我们的东西。我们想听到的是为什么pub/sub不是这样的方式:是因为当前NServicebus API的限制还是因为它本质上不是一个好的模式,如果是这样,为什么? –