关于ddd:一条拍卖系统优化二-模型深化建立出价用户BidUser模型

40次阅读

共计 2467 个字符,预计需要花费 7 分钟才能阅读完成。

接上一篇拍卖系统优化(一)— 建设拍品 Lot 模型,实际 CQRS,分享一下组内小伙总结的后续优化

一、背景:现有拍卖零碎设计实现

1.1 外围畛域实体 ReadWriteLot 和 ReadonlyLot (CQRS)

   ReadWriteLot 通过 DB 数据结构,次要解决拍品的写场景问题,例如:开拍、出价、成交、流拍 等;ReadonlyLot 在竞拍中的拍品应用 redis 中的数据结构进行读减速解决竞拍过程中高频读问题(无缓存,redis 数据与 DB 数据强统一),非竞拍中的拍品数据已不再变动通过 ReadWriteLot 降级失去并进行缓存;

1.2 优化前的出价和流拍实现计划

因为业务场景下存在即为了应答线上或下线这不同业务场景下拍卖业务的差别流程,例如:线上出价受额度限度而线下代拍员不受该束缚、线上出价后须要发送出局揭示而同步拍不须要等等。为了应答这种差别咱们通过形象的出价策略接口定义,想借此隔离了不同出价策略 OnlineBidStrategy(线上出价策略) 和 OfflineBidStrategy(线下出价策略)的实现。

1.2.1  线下出价策略:

线下的出价蕴含三个局部。1、有效掉高于本人本次出价的历史出价,有效出价的后果 2. lot 调用出价畛域行为,长久化出价后果 3. 发送出价的相干告诉、IM 音讯、批改价格零碎价格

1.2.2 线上出价策略:

线上出价包含三个局部:1. 线下出价的前置校验。2. lot 调用出价畛域行为,长久化出价后果 3. 发送出价的相干告诉、IM 音讯、批改价格零碎价格,线下出价主动订阅

1.2.3 畛域实体 Lot 的 出价办法 :  
  1. 线上出价的校验 或 线下出价的校验;2. 出价变更相干出价信息

到这里咱们能够思考这样几个问题:

这里的咱们寄冀望引入出价策略的形象可能暗藏不同场景下的出价流程的差别,真的做到了吗?

咱们寄冀望与出价策略的形象可能隔离实现细节,但存在在策略中的一些操作往往又与拍品畛域对象的出价行为有肯定的相关性,并且这种相关性的感知最终还是扩散到了拍品中,这还是背离了咱们的设计初衷。

线上出价和线下出价的前置校验逻辑散落在 Lot 和 两种不同的出价策略中,显然如果出价逻辑变更,我须要批改的是 Lot 和 出价策略两个中央,要是能将这个差异性的逻辑对立写在一个中央就好了,比方当线下出价的校验逻辑扭转了,我只去批改 Lot 外部对于线下出价的校验或者我只去批改 OfflineBidStrategy(线下出价策略),这样看起来仿佛更加正当。

现实状况下咱们冀望这种差异化的行为能够通过畛域事件或者对象的不同行为实现,对外提供一个标准化的出价服务,无需感知不同场景下的实现差别,但显然以后采纳的出价策略的设计方案并没有可能隐藏住实现细节和逻辑内聚(Lot 实体还是辨别了不同场景做了一些差异化解决)。

2. 是不是只有把线上出价的逻辑和线下出价的逻辑都放到 lot 的 bid(出价行为)中而后一个简略的 if-else 就能将线上出价和线下出价的逻辑隔离,同时又将逻辑内聚到 lot 中,如下图?

     这个解决方案我感觉其实也不是齐全不可行的,只不过目前来说咱们对不同类型的出价场景(线上用户出价、线下用户出价)的差异性次要体现在:出价前置的校验、出价后后置的操作(比方发送音讯、订阅揭示等)、用户出价后会对本身信息进行变更(比方变更本身的额度信息等)。如果依照下面的设计貌似很难满足需要,因为很显著在出价这个上下文中,有两个不同的实体拍品(Lot)、出价用户 (BidUser),之前的设计中并没有构建出 BidUser 这个实体,次要是因为咱们对不同出价用户并没有粗疏差异化的辨别,然而随着业务倒退的须要很多时候一个 Lot 无奈撑持这个业务逻辑(这也是引入出价策略的起因之一)。3. 出价畛域服务次要解决的外围问题是出价,然而出价后的一些列行为比方发送告诉、IM 音讯、订阅拍品、批改 price 零碎的价格,这些实质上不属于出价行为,即便这些后置的操作执行失败也不应该影响到本次出价,那么应该在哪里触发这些出价的后置操作?这里很多出价的后置操作实质上与出价外围行为无关,并且后置操作失败或者报错都不应该影响到本次出价的胜利与否,这里咱们最好应用不与事务绑定的畛域事件来实现。具体实现见下文。

二、优化设计构建 BidUser 实体

构建 BidUser 实体的次要作用,解决线下用户出价、线上用户出价的差异性,优化出价的实现,优化成交的实现,最终达到的后果是,将原来散落在应用服务中的逻辑内聚在畛域实体中,应用畛域服务操作畛域对象,应用服务调用畛域服务,公布畛域事件

2.1 构建线下出价用户、线上出价用户实体


2.2 不同的 BidUser 外部实现

留神 BidUser 的畛域行为承受的拍品都为只读正本,通过这种形式平安的在不同畛域对象中进行对象的拜访

线上出价用户

线下代拍员

2.3 畛域事件的利用

一次出价的根本流程:

BidUserA 举牌(扣除出价额度)=> Lot(承受 BidUserA 出价,将 BidUserA 置为当先,出局 BidUserB)=== 公布出局事件 ==> BidUserB 出局(偿还出价额度)。以拍品为桥梁,隔离了竞价用户之间的关系,同时通过畛域事件模型,也解耦了出价当先、出局两者的关系。

2.4 畛域服务实现和应用服务的实现
出价的畛域服务

出价的应用服务

通过晋升出 BidUser 模型,咱们将原有的扩散在出价策略以及拍品实体中对于”出价用户“的差异化解决内聚到了 BidUser 模型中,拍品的模型最终达到了场景的无关性。

回到问题的原点咱们再想一下,既然拍品能反对线上拍或者线上线下同步拍,其自身就应该是场景无关的也就阐明拍品自身应该是场景无关的,真正与场景无关的应该是这个过程中参加的出价人是有差别的,从这一点上反观这个模型下面的论断可能失去相互的印证。

2.5 待优化

目前畛域对象的长久层,并不是一个稳固的逻辑,咱们要依据不同的畛域行为,写不同的长久化的办法,这样其实就相当于,畛域行为的逻辑扩散到了长久层

目前 bidUser 次要用于出价阶段,将来能够思考赋予 bidUser 更多的含意,比方让 bidUser 去实现领取保证金的逻辑等等

正文完
 0