当前位置: 首页 > 后端技术 > Java

一场拍卖系统优化(二)——模型深化,搭建BidUser模型

时间:2023-04-01 15:09:32 Java

接上篇文章一场拍卖系统优化(一)——搭建大量模型,实践CQRS,分享大佬总结的后续优化1.背景:现有拍卖系统设计与实现1.1核心领域实体ReadWriteLot和ReadonlyLot(CQRS)ReadWriteLot主要解决通过DB数据结构编写拍卖品场景的问题,如:开拍、竞拍、交易、未成功拍卖等;ReadonlyLot是拍卖品中redis中的数据结构,用于读取加速,解决拍卖过程中的高频读取问题(无缓存,redis数据与DB数据强一致),非拍卖品数据无longer变化通过ReadWriteLot降级获取并缓存;1.2业务场景存在预先优化的招拍挂实施方案,以应对不同业务场景下线上或线下拍卖业务的不同流程。约束条件,在线出价需要发出提醒,而同步出价不需要发出等。为了处理这种差异,我们定义了抽象的出价策略接口,想要隔离不同出价策略的实现OnlineBidStrategy(在线竞价策略)和OfflineBidStrategy(离线竞价策略)。1.2.1线下竞价策略:线下竞价由三部分组成。1.将高于您当前出价的历史出价作废,无效出价的结果2.批量调用出价字段的行为,并持久化出价结果3.发送出价相关通知,IM消息,修改价格系统价格1.2.2网上投标策略:网上投标包括三个部分:1.线下投标预验证。2.地块调用竞拍字段行为,持久化竞拍结果3.发送竞拍相关通知,IM消息,修改价格系统价格,自动订阅离线竞拍1.2.3现场实体Lot的竞拍方式:在线投标验证或离线投标验证;2.出价变化相关的出价信息这里我们可以思考以下问题:这里我们希望通过出价策略抽象的引入,能够隐藏不同场景下出价过程的差异。真的可能吗??我们希望竞价策略的抽象能够隔离实现细节,但策略中的一些操作往往与拍卖域中对象的竞价行为存在一定的相关性,而这种相关性的感知最终会扩散到拍卖中。这还是偏离了我们最初的设计意图。线上竞拍和线下竞拍的预验证逻辑分散在Lot和两种不同的竞拍策略中。显然,如果出价逻辑发生变化,我需要修改的是Lot和出价策略。如果能做到这一点,把逻辑写在一个地方就好了。比如当离线竞价的验证逻辑发生变化时,我只在Lot内部修改离线竞价的验证或者我只修改OfflineBidStrategy(离线竞价策略),这样看起来更合理。理想情况下,我们期望这种差异化的行为通过领域事件或者对象的不同行为来实现,对外提供标准化的竞价服务,而不需要去感知不同场景下的实现差异,但是显然目前的竞价策略设计方案确实做到了not不能隐藏实现细节和逻辑内聚性(Lot实体还是会区分不同的场景,做一些差异化处理)。2.是否需要将线上竞拍逻辑和线下竞拍逻辑都放到拍品的竞拍(竞拍行为)中,然后一个简单的if-else就可以隔离线上竞拍和线下竞拍的逻辑,在同时再把逻辑集成到地块中,如下图?我不认为这个方案是完全不可行的,但是目前我们在不同类型的竞价场景(线上用户竞价,线下用户竞价)上的差异主要体现在:pre-bidverification,Post-bidoperations(suchassending消息、订阅提醒等),用户竞价后会更改自己的信息(如更改自己的配额信息等)。按照上面的设计,似乎很难满足要求,因为显然在竞价的上下文中,有两个不同的实体手数(Lot)和竞价用户(BidUser),实体BidUser在之前的设计中并没有建立,主要是是因为我们没有详细区分不同的竞价用户,但是随着业务发展的需要,往往很多都不能支持这个业务逻辑(这也是引入竞价策略的原因之一)。3、竞价现场服务主要解决的核心问题是竞价,但竞价后的一些系列行为,如发送通知、IM消息、订阅拍卖、修改价格系统价格等,本质上不属于竞价行为,即使这些出价后操作执行失败也不应该影响这次出价,那么这些出价的后动作应该从哪里触发呢?这里投标的很多后期操作本质上与投标的核心行为无关,后期操作的失败或报错不应影响本次投标的成功。这里我们最好使用不绑定事务的领域事件来实现。具体实现见下文。2.优化设计构建BidUser实体构建BidUser实体的主要作用是解决离线用户出价和在线用户出价的差异,优化出价的实现,优化交易的实现。最终的结果是将原来分散在应用服务中的逻辑凝聚在领域实体中,使用领域服务操作领域对象,应用服务调用领域服务,发布领域事件2.1构建离线竞价用户和在线竞价用户实体2.2BidUser内部实现不同注意BidUser域行为的接受所有拍卖物品都是只读副本,这样可以在不同域中安全地访问对象。在线投标人和离线代理投标人2.3领域事件的应用一次投标的基本流程:BidUserA举牌(扣除投标金额))=>Lot(接受BidUserA的投标,设置BidUserA为leader,退出BidUserB)===发布退出事件==>BidUserB退出(返回出价金额)。以拍卖为桥梁,隔离出价用户之间的关系,同时通过领域事件模型,也解耦了领标与出标之间的关系。2.4领域服务和应用服务的实现BiddingDomainServicesBiddingapplicationservices通过升级BidUser模型,我们将原来分散的竞价策略和拍卖实体中“竞价用户”的差异化处理凝聚到BidUser模型中,地段模型最终实现场景独立。回到问题的本源,我们再想一想。由于地块可以支持在线拍摄或同时在线和离线拍摄,所以它应该是场景无关的,也就是说地块本身应该是场景无关的。真正与场景相关的应该是这个过程中涉及的投标人是不同的。从这个角度来看,这个模型的结论是可以相互印证的。2.5待优化当前领域对象的持久层不是一个稳定的逻辑。我们需要根据不同的领域行为,编写不同的持久化方法。这其实相当于领域行为传播到持久层的逻辑。目前bidUser主要用于竞价阶段。以后可以考虑赋予bidUser更多的含义,比如让bidUser完成交押金的逻辑等。