引言
在电商运营和比价场景中,价格、促销和库存是三个最核心的动态指标。手动刷新页面查看商品详情,不仅效率低,而且容易错过促销窗口。本文介绍如何通过定时调用商品详情 API,构建一套价格监测与预警系统,在商品降价、促销开启或库存变化时自动触发提醒。系统整体架构
价格监测系统由四个核心模块组成:数据采集、数据存储、规则判断和通知推送。整体流程如下:
数据采集模块:定时调用商品详情 API,获取价格、促销信息和库存状态。
数据存储模块:将每次采集的快照写入数据库,保留历史价格曲线。
规则判断模块:对比最新快照与历史数据,判断是否触发降价、促销或库存预警。
通知推送模块:命中规则后,通过邮件、短信或 Webhook 推送提醒。
- 商品详情 API 调用设计
商品详情 API 是数据采集的入口。以常见的电商开放平台为例,请求参数通常包含商品 ID、平台标识和签名信息。下面给出一个 Java 实现的 API 调用示例:
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
public class ProductApiClient {
private static final String API_URL = "https://api.example.com/product/detail";
private static final String APP_KEY = "your_app_key";
private static final String APP_SECRET = "your_app_secret";
public static String fetchProductDetail(String productId) throws Exception {
String sign = SignUtil.generateSign(productId, APP_SECRET);
String url = API_URL + "?product_id=" + productId + "&app_key=" + APP_KEY + "&sign=" + sign;
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create(url))
.timeout(java.time.Duration.ofSeconds(10))
.GET()
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
return response.body();
}
}
调用时需要注意三点:一是签名参数必须按平台规则生成,二是设置合理的超时时间避免阻塞,三是对返回结果做异常兜底,防止单次失败影响整个监测任务。
- 定时任务调度
定时调度是监测系统的核心驱动。根据监测频率的不同,可以选择不同的调度方案:
低频监测:每小时或每天一次,适合库存变化不频繁的商品,使用简单的定时任务即可。
高频监测:每 5 到 10 分钟一次,适合价格波动大的热销商品,需要引入分布式调度保证稳定性。
下面给出一个基于 Spring 定时任务的调度示例:
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
@Component
public class PriceMonitorScheduler {
private final ProductApiClient apiClient = new ProductApiClient();
private final PriceAlertService alertService = new PriceAlertService();
@Scheduled(fixedDelay = 300000) // 每 5 分钟执行一次
public void monitorHotProducts() {
List<String> productIds = ProductRepository.getHotProductIds();
for (String productId : productIds) {
try {
String json = apiClient.fetchProductDetail(productId);
alertService.processSnapshot(productId, json);
} catch (Exception e) {
// 记录失败日志,避免影响其他商品
System.err.println("监测失败: " + productId + ", " + e.getMessage());
}
}
}
}
调度频率需要结合 API 限流策略来设计。如果平台对单账号的调用次数有上限,应把商品列表拆分成多个批次,错峰执行,避免触发限流封禁。
- 数据解析与快照存储
拿到 API 返回的 JSON 后,需要解析出价格、促销和库存三个关键字段,并写入数据库。下面给出一个解析示例:
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
public class ProductSnapshotParser {
private static final ObjectMapper mapper = new ObjectMapper();
public static ProductSnapshot parse(String json) throws Exception {
JsonNode root = mapper.readTree(json);
ProductSnapshot snapshot = new ProductSnapshot();
snapshot.setProductId(root.path("product_id").asText());
snapshot.setPrice(root.path("price").asDouble());
snapshot.setPromotionPrice(root.path("promotion_price").asDouble());
snapshot.setPromotionActive(root.path("promotion_active").asBoolean());
snapshot.setStock(root.path("stock").asInt());
snapshot.setCapturedAt(System.currentTimeMillis());
return snapshot;
}
}
存储层建议使用带时间序列能力的数据库,例如 InfluxDB 或带索引的 MySQL 表。每次采集都追加一条记录,这样后续可以绘制价格走势图,也能为降价判断提供历史基准。
- 降价与库存预警规则
预警规则是整个系统的业务核心。常见的触发条件包括:
降价提醒:当前价格低于用户设定的目标价,或低于历史最低价。
促销开启:促销价字段从无到有,或促销状态从关闭变为开启。
库存告急:库存数量低于阈值,例如低于 10 件。
下面给出一个规则判断的示例实现:
public class PriceAlertService {
public void processSnapshot(String productId, String json) throws Exception {
ProductSnapshot current = ProductSnapshotParser.parse(json);
ProductSnapshot previous = SnapshotRepository.findLatest(productId);
if (previous == null) {
SnapshotRepository.save(current);
return;
}
if (current.getPrice() < previous.getPrice()) {
AlertDispatcher.sendPriceDropAlert(productId, previous.getPrice(), current.getPrice());
}
if (current.isPromotionActive() && !previous.isPromotionActive()) {
AlertDispatcher.sendPromotionAlert(productId, current.getPromotionPrice());
}
if (current.getStock() < 10) {
AlertDispatcher.sendStockAlert(productId, current.getStock());
}
SnapshotRepository.save(current);
}
}
为了避免重复提醒,建议引入去重机制。例如同一商品在 24 小时内只对同一降价事件推送一次,防止价格在目标价附近反复波动时频繁打扰用户。
- 通知推送与提醒触达
预警命中后需要把消息推送给用户。常用的触达渠道包括:
邮件通知:适合低频、信息量大的提醒,可附带价格曲线。
短信通知:适合紧急库存告急,触达及时。
Webhook 推送:适合对接企业微信、钉钉或自建应用。
推送内容应包含商品名称、当前价格、历史价格和购买链接,方便用户直接决策。下面是一个邮件模板的简化示例:
您关注的商品 {productName} 已降价!
当前价格:{currentPrice} 元
历史价格:{previousPrice} 元
- 实践注意事项
在真实环境中落地这套系统,还需要关注以下几个问题:
API 限流与频控:合理设置采集频率,必要时申请更高配额。
异常重试:网络抖动或接口报错时,采用指数退避策略重试。
数据一致性:促销价可能为 0 或空值,解析时要做好默认值处理。
监控告警自身:监测任务本身也要有健康检查,避免调度挂掉后静默失联。
- 总结
价格监测与预警系统的核心在于定时采集、快照存储、规则判断和通知推送四个环节的闭环。通过商品详情 API 定时拉取价格、促销和库存数据,再结合历史快照做对比,就能在降价或库存告急时第一时间触达用户。实际落地时,重点把握好调度频率、限流策略和去重机制,系统就能稳定运行并发挥实用价值。如有任何疑问,欢迎留言探讨!