我们正在使用 NServicebus 来设计一个必须解决拍卖场景的系统:我们想向一组可以竞标某个项目的公司发送一条消息。在我们收到所有出价后,我们希望将该项目发送给出价最高的人。
我们最初认为这种场景非常适合 NServicebus:Pub/sub 用于发送消息(例如 BidOnItem 或 ItemAvailable),为每个感兴趣的公司订阅该消息的消息处理程序以及用于存储我们收到的不同出价和我们完成了。
在正常的拍卖中,我们可以将超时设置为 5 分钟,然后根据我们收到的最高价格决定谁获得该物品。我们没有那种奢侈。我们遇到的问题是我们的特定场景有一个棘手的、不可协商的业务需求:拍卖对时间非常敏感。分秒必争。我们想要做的是,一旦所有公司都做出回应,就决定谁可以获得该项目。通常这会在几秒钟内发生。我们要决定所有订阅者响应的第二个。显然,我们仍将实现超时,但这将是异常(exception)而不是规则。如果我们想确定是否每个人都回复了,我们需要类似于订阅 BidOnItem 消息的所有端点的所有处理程序的列表。 NServicebus API 似乎不提供此信息。
我们必须实现一些 future 的要求,这些要求也以数据丰富和批准/拒绝决策为中心,这将从了解发布/订阅 channel 上的所有处理程序是否都做出响应中受益匪浅。我知道这种请求/回复的臭味是 NServicebus 不鼓励的,因为它会导致耦合,但这种要求对于许多在核心总线基础设施之外很难实现的进程来说是非常重要的。从这个意义上说,它感觉很像 NServicebus 提供的 Saga.ReplyToOriginator。
解决这个问题的“NServicebus方式”是什么?
最佳答案
在这些拍卖场景中,Pub/Sub 通常不是可行的方法。如果您的传奇会向您的投标人提出请求/回应怎么办?
S:OnAuctionCreated(携带投标人名单,或者你可以在某处获取他们)
foreach bidder in event.Bidders
-bus.Send(RequestBidFrom(bidder))
设置超时(X)
S:OnBidResponse
bids.Add(response.Bidder,response.Bid)
if(bids.Count()== Data.TotalBidders)
完成拍卖();
S:超时
完成拍卖()
关于NServicebus 时间敏感拍卖实现,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7323725/