讯价详细设计

r

讯价的作用得到商品实时的价格。讯价的规则1. 不讯价的情况 3小时内更新的热门商品 1天内更新的非热门商品2. 自动讯价频率 热门商品2小时一次 热门商品2小时一次讯价的方式1. 考虑从购物车获得价格。购物车数据量最小,有可能需要通过Cookie传参数。2. 与供货商建立合作关系,由供货商提供价格接口。应用技术缓存 性能考虑Length为300万的HashTable会否有性能问题?如果对性能影响较大,可以考虑的几种拆分方式: 按频道(操作简单,但图书频道还是很大) 按InfoCode区间(大小不统一,拆分碎片可能过多) 热门/非热门 占用空间数据按300万计算: 商品InfoCodeList,占用17M左右。(InfoCode(6)*300万=17M) 商品价格,占用635M左右。(provider(40)+providerName(16)+price(6)+updateTime(10))*3>216*300万=635M 分类 商品价格数据作用:存储商品在各供货商实时售价。结构:HashTable(Key:InfoCode;Value:IList<ProviderPrice>) 商品InfoCode String[]作用:维护全部商品InfoCode列表,自动讯价使用结构:字符串数组。服务(自动讯价) 热门商品2小时一次 热门商品2小时一次多线程 线程池:讯价需要支持多并发。现有数据结构修改1. 增加热门商品记录字段。 GoodsInfo表加标识字段 索引加标识字段2. 商品分类 热门商品 非热闹商品接口定义讯价取商品最低价 参数:InfoCode 返回:ProviderPrice 逻辑:1. 接收InfoCode,判断是否讯价(通过UpdateTime)2. 生成最低价供货商URL和参数3. 抓取解析购物车HTML,取实时价格。4. 更新数据(如果价格改变)5. 返回ProviderPrice。取多个商品价格(推荐商品) 参数:"InfoCode,InfoCode,InfoCode" 返回:HashTable(Key:InfoCode;Value:IList<ProviderPrice>)指定商品在各供货商售价格比较 参数:InfoCode 返回:IList<ProviderPrice> 逻辑:1. 接收InfoCode2. 取缓存数据,判断是否讯价(通过UpdateTime)3. 调用讯价方法(foreach供货商)4. 更新数据(如果价格改变)商品价格更新 参数:InfoCode, IList<ProviderPrice> 返回:更新结果(成功/失败) 逻辑:1. 判断此次操作是 Insert还Update。新商品为Insert。2. 更新内容包括:缓存、数据库、索引。编辑热门商品状态 参数:InfoCode(可接收多个),状态(1表示热门商品 2表示非热门商品) 返回:更新结果(成功/失败) 逻辑:1. 更新数据库中商品状态2. 更新索引中商品状态3. 更新两个缓存实体类ProviderPrice属性 说明 类型providerId 供货商Id GuidproviderName 供货商名称 Stringprice 价格 DoubleupdateTime 更新时间 DateTime

接口

讯价取商品最低价

r

1.接收InfoCode,判断是否讯价(通过UpdateTime)2.生成最低价供货商URL和参数3.抓取解析购物车HTML,取实时价格。4.更新数据(如果价格改变)4.返回ProviderPrice。

参数:InfoCode

返回

ProviderPrice

providerId

providerName

price

updateTime

取多个商品价格(推荐商品)

参数:"InfoCode,InfoCode,InfoCode"

返回

HS

Key:InfoCode

Value:IList<ProviderPrice>

providerId

providerName

price

updateTime

指定商品在各供货商售价格比较

r

1.接收InfoCode2.取缓存数据,判断是否讯价(通过UpdateTime)3.调用讯价方法(foreach供货商)4.更新数据(如果价格改变)

接收InfoCode

返回

IList<ProviderPrice>

providerId

providerName

price

updateTime

商品价格更新

更新内容

缓存

数据库

索引

接收InfoCode, IList<ProviderPrice>

返回更新结果(成功/失败)

Insert/Update

编辑热门商品

r

1.数据库2.索引3.两个缓存

接收InfoCode(可接收多个)

单个性能要优于多个

r

在讯价中取商品价格优先级高于取同类商品价格。

讯价的规则

不讯价的情况

3小时内更新的热门商品

1天内更新的非热门商品

自动讯价频率

热门商品2小时一次

非热门商品1天一次

异常处理

讯价无结果使用原价格

延迟加载

讯价按功能按供货商及频道进行分类,便于维护。

现有数据结构修改

增加热门商品记录字段

GoodsInfo表加标识字段

索引加标识字段

商品分类

热门商品

非热闹商品

应用技术

缓存

性能考虑

300万长度的HS是否有性能问题?

几种拆分方式

按频道

简单

图书还是很大

按InfoCode安区间

各HS大小不等

HS可以会较多

热门/非热门

占用空间

预算

r

数据按300万计算商品InfoCodeList,占用17M左右。InfoCode(6)*300万=17M商品价格,占用635M左右。(provider(40)+providerName(16)+price(6)+updateTime(10))*3>216*300万=635M

分类

商品价格数据

r

作用:存储商品在各供货商实时售价。

缓存结构

HS

Key:InfoCode

Value:IList<ProviderPrice>

providerId

providerName

price

updateTime

商品InfoCode String[]

r

作用:维护全部商品InfoCode列表,自动讯价使用

服务

自动讯价

热门商品2小时一次

非热门商品1天一次

多线程、并行计算

线程池