分享一下组内小伙伴张聪、庆红在年初对拍卖领域建模的总结
一、背景:原拍卖零碎设计(基于数据模型)
原拍卖零碎的构建了SkuBidRedisInfo(数据对象) 用来记录拍品在竞拍中的热点信息,并且将这个实体放入Redis中。
在拍品的生命周期中间接应用SkuBidRedisInfo进行逻辑判断,尽管通过SkuBidRedisInfo(拍品)和 AuctionSkuDTO(拍品)结构了 InnerSkuLotInfo (仅作为一个Value object)对象,然而InnerSkuLotInfo并不能残缺的形容一个拍品残缺的生命周期比方 竞拍前、竞拍中、竞拍完结、生成订单中等状态。
二、重构拍卖设计及改良过程
- 裁减数据对象 LotRedisInfo 信息,简化结构过程:
通过LotRedisInfo 存储拍品在竞拍中的信息,竞拍期间仅依赖LotRedisInfo即可构建拍品实体。一方面通过双写AuctionSkuDTO以及LotRedisInfo,放弃竞拍中的数据一致性;另一方面简化了原有拍品实体构建的过程,失去更好的性能晋升;
- 构建拍品畛域实体 Lot ,定义了拍品的不同生命周期、以及各个生命周期的行为:
这里咱们的初始做法是将Lot 的构建分为两种状况:1、竞拍中的拍品Lot,利用LotRedisInfo 进行结构 ,2、非竞拍中的拍品,从DB中取出数据结构Lot,放入Local&Redis缓存;
拍品生命周期内的行为
3.围绕实体进行数据变更:
当拍品信息产生变更时,比方开拍、出价、截拍、成交等行为产生,咱们通过变更Lot,在基于Lot实体转化失去须要长久化的AuctionSkuDTO或LotRedisInfo,进行长久化;
长久化的过程如下:
变更Lot自身的信息
这里长久化Lot信息的时候,咱们会依据Lot的预期截止工夫和Lot对应 InnerActivityInfo 的预期截止工夫比拟判断是否须要延期流动截止工夫,这里对 InnerActivityInfo 的信息进行批改并且长久化刷新缓存(潜在问题1)
长久化 Lot 信息 , Lot 导出相应的 AuctionSkuDTO(长久到DB) 、 流动未完结LotRedisInfo(长久到Redis)
- 新模型存在的问题
这里Lot畛域实体的构建曾经可能详细描述一个拍品的残缺生命周期及各个行为,然而存在两个问题:
问题1 :InnerActivityInfo的批改不平安:
咱们在构建Lot的时候,依赖了流动信息的实体InnerActivityInfo,然而 InnerActivityInfo 在Lot的整个生命周期外面并不是固定不变的,咱们通过一个InnerActivityInfo A构建了一个Lot A,这个时候如果有其余Lot信息变更,导致InnerActivityInfo产生了变更,那么Lot A中应用了InnerActivityInfo A的局部信息就可能是脏数据了;
问题2 :因为引入了Lot在零碎中存在了存储正本(缓存),对于Lot的读写存在了不统一:
利用实例A 获取拍品Lot 的本地缓存Lot A,而后对Lot A进行批改,比方批改拍品程序,长久化,这个场景在单实例下没有问题,然而多实例下,如果在A操作之前,如果利用实例B上也想对同一个拍品Lot 进行批改,读取本地缓存Lot B批改了起拍价,长久化,那么利用实例A上读出来的数据就是脏数据,那么通过一系列操作,A只是想批改一个拍品程序,然而却把B批改起拍价的数据给笼罩了,问题的要害就是咱们不能基于缓存进行信息变更,再长久化到数据库;
解决方案:
问题1----解决方案:对象隔离
在Lot中咱们不要强依赖InnerActivityInfo实体,而是每次应用时,传入一个最新的InnerActivityInfo(最佳做法是传递一个只读正本),这样就保障了在Lot的生命周期中,每次应用到InnerActivityInfo的相干信息都是最新的(这个是不是InnerActivityInfo的一致性问题由InnerActivityInfo保障,通过其畛域服务进行对应的批改);
问题2----- 解决方案:CQRS,将拍品分为两种实体 ReadonlyLot(只读实体)、ReadWriteLot(可读写实体)
ReadonlyLot不蕴含对本身信息变更的能力,这样防止了误用。咱们的内存cache和缓存都是建设在ReadonlyLot上的可能会读取到过期数据,但写场景是不容许过期数据的读取(写建设在读上,读过期,会产生写笼罩问题),通过实体层面的隔离咱们杜绝了这种过期读的产生。 当咱们须要批改Lot的信息时,即便咱们获取了ReadonlyLot,也无奈对其进行信息变更,从根本上杜绝了这种不平安公布的产生。
ReadonlyLot&ReadWriteLot
ReadonlyLot、ReadWriteLot的构建