功能概述
小象买菜系统需要实现动态价格展示功能,即根据市场行情、库存情况、促销活动等因素实时更新商品价格,并在用户端实时显示。
技术实现方案
1. 系统架构设计
```
前端应用 → API网关 → 价格服务 → 缓存层 → 数据库
↑
定时任务/事件驱动
```
2. 核心组件实现
2.1 价格数据模型
```javascript
// 商品价格实体
{
"productId": "12345", // 商品ID
"basePrice": 10.50, // 基础价格
"currentPrice": 9.80, // 当前价格
"priceRules": [ // 价格规则
{
"ruleType": "promotion", // 促销规则
"startTime": "2023-08-01T00:00:00",
"endTime": "2023-08-07T23:59:59",
"discount": 0.9 // 9折
},
{
"ruleType": "inventory", // 库存相关规则
"threshold": 50, // 库存阈值
"adjustment": 0.95 // 库存>50时打95折
}
],
"lastUpdated": "2023-08-05T10:30:00", // 最后更新时间
"version": 3 // 版本号,用于乐观锁
}
```
2.2 价格计算服务
```java
public class PriceCalculator {
public BigDecimal calculateCurrentPrice(ProductPrice priceData) {
BigDecimal currentPrice = priceData.getBasePrice();
// 应用所有有效规则
for (PriceRule rule : priceData.getPriceRules()) {
if (isRuleActive(rule)) {
switch (rule.getRuleType()) {
case "promotion":
currentPrice = applyPromotion(currentPrice, rule);
break;
case "inventory":
currentPrice = applyInventoryAdjustment(currentPrice, rule);
break;
// 其他规则类型...
}
}
}
return currentPrice;
}
private boolean isRuleActive(PriceRule rule) {
// 检查规则是否在有效期内等条件
// ...
}
// 其他辅助方法...
}
```
2.3 实时价格更新机制
方案一:定时任务更新
```java
@Scheduled(fixedRate = 60000) // 每分钟执行一次
public void refreshPrices() {
List
products = productRepository.findAll();
for (Product product : products) {
ProductPrice updatedPrice = priceUpdateService.calculateNewPrice(product);
priceCache.put(product.getId(), updatedPrice);
}
}
```
方案二:事件驱动更新(推荐)
```java
@Service
public class PriceUpdateEventHandler {
@EventListener
public void handleInventoryChange(InventoryChangeEvent event) {
// 库存变化时触发价格重新计算
ProductPrice newPrice = priceCalculator.calculateForInventoryChange(event.getProductId());
priceCache.put(event.getProductId(), newPrice);
}
@EventListener
public void handlePromotionUpdate(PromotionChangeEvent event) {
// 促销活动变化时触发相关商品价格更新
// ...
}
}
```
3. 缓存策略
使用Redis作为价格缓存:
```java
@Cacheable(value = "productPrices", key = " productId")
public ProductPrice getProductPrice(String productId) {
// 从数据库加载价格数据
return priceRepository.findByProductId(productId);
}
// 更新缓存
@CacheEvict(value = "productPrices", key = " productId")
public void updateProductPrice(String productId, ProductPrice newPrice) {
// 更新数据库
priceRepository.save(newPrice);
}
```
4. 前端实现
Vue.js示例:
```javascript
// 价格展示组件
export default {
data() {
return {
product: null,
price: null,
isLoading: false
}
},
async created() {
this.fetchPrice();
// 使用WebSocket或轮询实现实时更新
this.setupRealTimeUpdates();
},
methods: {
async fetchPrice() {
this.isLoading = true;
try {
const response = await axios.get(`/api/products/${this.$route.params.id}/price`);
this.product = response.data.product;
this.price = response.data.currentPrice;
} finally {
this.isLoading = false;
}
},
setupRealTimeUpdates() {
// 使用WebSocket
const socket = new WebSocket(wss://your-api-domain/prices);
socket.onmessage = (event) => {
const data = JSON.parse(event.data);
if (data.productId === this.$route.params.id) {
this.price = data.currentPrice;
}
};
// 或者使用轮询
// setInterval(this.fetchPrice, 5000);
}
}
}
```
5. API设计
获取商品价格
```
GET /api/products/{productId}/price
响应示例:
{
"productId": "12345",
"productName": "新鲜苹果",
"basePrice": 10.50,
"currentPrice": 9.80,
"priceRules": [...],
"lastUpdated": "2023-08-05T10:30:00"
}
```
价格更新WebSocket主题
```
/topic/prices/{productId}
消息格式:
{
"productId": "12345",
"currentPrice": 9.80,
"eventType": "PRICE_UPDATE",
"timestamp": "2023-08-05T10:35:00"
}
```
关键考虑因素
1. 性能优化:
- 使用缓存减少数据库查询
- 对高频访问商品实施本地缓存
- 考虑读写分离架构
2. 一致性保证:
- 使用乐观锁处理并发更新
- 实现最终一致性模型
- 对关键操作添加事务管理
3. 扩展性设计:
- 规则引擎模式支持灵活的价格规则配置
- 插件式架构便于添加新的价格影响因素
4. 监控与告警:
- 监控价格计算服务性能
- 对异常价格波动设置告警
- 记录价格变更历史
部署建议
1. 使用容器化部署(Docker + Kubernetes)
2. 实现蓝绿部署或金丝雀发布策略
3. 设置自动回滚机制
4. 实施A/B测试不同价格策略
测试方案
1. 单元测试:
- 价格计算逻辑
- 规则应用顺序
- 边界条件测试
2. 集成测试:
- 价格服务与缓存集成
- 事件驱动更新流程
- WebSocket通知机制
3. 性能测试:
- 模拟高并发价格查询
- 压力测试价格更新操作
- 缓存穿透/雪崩场景测试
4. 用户验收测试:
- 价格展示实时性验证
- 不同用户场景下的价格显示
- 促销活动期间的正确价格显示
通过以上方案,小象买菜系统可以实现高效、准确的动态价格展示功能,提升用户体验和运营灵活性。