一、架构层:分布式设计 + 分层解耦,提升抗风险能力
1. 微服务拆分与职责隔离
核心服务拆分:
自有平台采集服务(处理高 QPS 自有商城数据);
第三方平台采集服务(对接淘宝 / 京东等开放 API);
公域采集服务(合规爬虫场景);
采集管理服务(任务调度、规则配置);
隔离机制:
线程池隔离:每个服务独立线程池(如第三方采集服务核心线程数 20,公域采集服务核心线程数 10),避免某类采集任务耗尽全局资源;
数据源隔离:自有平台走主库,第三方 / 公域采集走从库 / 独立缓存,避免采集压力影响交易核心数据库。
2. 集群部署 + 负载均衡
多实例部署:核心采集服务(如自有平台采集)部署≥3 个实例,分布在不同服务器 / 可用区,通过 K8s 实现自动扩缩容;
负载均衡策略:
网关层(Nginx/APISIX)采用「轮询 + 权重」策略,热点实例(如处理爆款商品采集)分配更高权重;
第三方平台采集服务按「平台 + 店铺」哈希分片,避免单实例承载过多同一平台的高频调用(如淘宝店铺集中在一个实例导致 QPS 过载)。
3. 异步化 + 队列削峰
// 批量采集接口异步化示例@PostMapping("/api/v1/collect/own/batch")public Result<BatchCollectVO> batchCollect(@RequestBody BatchCollectReq req) {
// 1. 同步校验参数+生成任务ID
String taskId = UUID.randomUUID().toString();
if (req.getSkuIds().size() > 100) {
return Result.fail("单次批量采集不超过100个SKU");
}
// 2. 任务入队(RocketMQ/Kafka),异步处理采集逻辑
CollectTaskDTO taskDTO = new CollectTaskDTO(taskId, req.getSkuIds(), req.getScene());
mqProducer.send("collect_batch_topic", taskDTO);
// 3. 同步返回任务ID,前端通过任务状态接口查询结果
return Result.success(new BatchCollectVO(taskId, "任务已提交,处理中"));}// 消费者异步处理采集@KafkaListener(topics = "collect_batch_topic")public void handleBatchCollect(CollectTaskDTO taskDTO) {
try {
// 批量采集逻辑(调用自有平台底层API)
List<ProductDetailDTO> detailList = ownPlatformCollector.batchCollect(taskDTO.getSkuIds());
// 存储采集结果
collectResultMapper.save(taskDTO.getTaskId(), detailList);
// 更新任务状态为成功
taskMapper.updateStatus(taskDTO.getTaskId(), TaskStatus.SUCCESS);
} catch (Exception e) {
log.error("批量采集失败:taskId={}", taskDTO.getTaskId(), e);
taskMapper.updateStatus(taskDTO.getTaskId(), TaskStatus.FAIL, e.getMessage());
}}队列选型:高并发场景用 Kafka(吞吐量 10 万 +/ 秒),普通场景用 RocketMQ(支持事务消息、重试机制);
任务优先级:紧急任务(如商品上架后采集详情)设为高优先级,普通任务(如定时增量同步)设为低优先级,避免优先级倒置。
二、技术层:性能优化 + 容错兜底,降低故障概率
1. 缓存策略:减少重复采集与底层依赖调用
多层缓存设计:
本地缓存(Caffeine):缓存热点商品采集结果(如 TOP 1 万 SKU),过期时间 5 分钟,命中延迟 1-5ms;
分布式缓存(Redis):缓存非热点商品采集结果,过期时间 30 分钟,支持批量查询(
mget);缓存 key 设计:
collect:own:{skuId}(自有平台)、collect:third:{platformCode}:{skuId}(第三方平台);缓存更新机制:
主动更新:商品信息变更时(如改价、改库存),通过消息队列触发缓存更新;
被动更新:缓存过期后自动刷新,刷新时加互斥锁(避免缓存击穿)。
2. 采集效率优化:减少无效消耗
字段筛选:支持
fields参数指定返回字段(如fields=name,price,stock),避免采集冗余字段(如商品创建时间、冗余图片 URL);批量处理:
自有平台采集:用
IN (skuId1, skuId2)批量查询数据库,减少 SQL 执行次数;第三方平台采集:优先调用平台批量 API(如京东
jd.item.batch.get),替代多次单商品调用;连接池优化:
数据库连接池:设置合理大小(如 MySQL 连接池 100,Redis 连接池 200),避免连接等待;
第三方 API 连接池:复用 HTTP 连接(如 OkHttp 设置
maxIdleConnections=50),减少 TCP 握手开销。
3. 容错机制:应对各类异常场景
| 异常类型 | 应对策略 | 技术实现 |
|---|---|---|
| 网络超时 | 重试 + 超时控制 | 单接口超时设为 1-3 秒(自有平台 1 秒,第三方平台 3 秒),重试 3 次(间隔 1s/3s/5s) |
| 第三方平台限流 | 排队 + 降级 | 记录平台限流阈值,超额时将任务加入延迟队列(如 1 分钟后重试),降级返回缓存数据 |
| 公域平台反爬封禁 | 代理池 + 采集间隔控制 | 集成 IP 代理池(动态切换 IP),采集间隔≥3 秒,随机 User-Agent,避免高频请求 |
| 数据解析失败 | 降级 + 人工介入 | 公域采集解析失败时,返回基础字段(如名称、价格),标记为 “待人工处理”,触发告警 |
| 服务节点故障 | 熔断 + 故障转移 | 用 Sentinel/Hystrix 熔断故障节点(如某实例连续 5 次失败则熔断 5 分钟),流量转移到健康实例 |
4. 资源管控:避免资源耗尽
限流控制:
接口级限流:通过网关设置单接口 QPS 上限(如自有平台单商品采集 QPS≤5000,第三方平台≤1000);
租户级限流:按商户 / 店铺分配限流配额(如普通店铺 QPS≤100,VIP 店铺≤500),避免单个租户占用过多资源;
内存管控:
批量采集任务分批处理(如每批 50 个 SKU),避免一次性加载大量数据导致 OOM;
本地缓存设置最大容量(如 Caffeine 缓存 1 万条),采用 LRU 淘汰策略,避免内存泄漏;
磁盘 IO 管控:采集日志异步写入、按天轮转,避免日志写入频繁导致磁盘 IO 打满。
三、运维层:监控告警 + 应急响应,快速解决故障
1. 全链路监控:实时感知状态
核心指标监控(对接 Prometheus+Grafana):
监控维度 核心指标 正常范围 告警阈值 接口性能 响应时间(P99/P95/P50)、QPS P99≤300ms,QPS≤阈值 80% P99>500ms,QPS 超阈值 90% 可用性 接口成功率、采集成功率 ≥99.9% <99%(持续 1 分钟) 资源状态 CPU 使用率、内存使用率、磁盘 IO CPU≤80%,内存≤85% CPU>90% 或内存 > 90%(持续 5 分钟) 依赖状态 第三方 API 响应时间、缓存命中率 第三方响应≤1s,缓存命中率≥95% 第三方响应 > 3s,缓存命中率 < 90% 任务状态 异步任务失败率、队列堆积数 失败率≤1%,堆积数≤1000 失败率 > 5%,堆积数 > 5000 链路追踪:通过 SkyWalking/Pinpoint 记录采集全链路(网关→采集服务→底层 API / 数据库),定位慢调用(如某第三方 API 耗时过长);
日志监控:用 ELK 收集接口日志、异常日志,支持按
taskId/skuId/platformCode检索,快速排查问题。
2. 分级告警机制
告警级别:
P0(紧急):核心接口成功率 <95%、服务宕机、队列堆积> 1 万 → 电话 + 短信 + 工单,10 分钟内响应;
P1(重要):接口 P99>500ms、采集成功率 < 99% → 短信 + 邮件,30 分钟内响应;
P2(普通):缓存命中率 < 90%、第三方 API 响应慢 → 邮件告警,1 小时内响应;
告警降噪:
相同告警合并(如同一第三方 API 超时,5 分钟内只告警 1 次);
告警抑制(如服务宕机已告警,不再重复告警依赖该服务的接口失败)。
3. 应急响应流程
故障发现:通过监控告警 / 业务反馈发现问题;
故障定位:
查看接口日志 / 链路追踪,确认故障范围(如自有平台 / 第三方平台、单个 SKU / 批量任务);
检查依赖服务(数据库、Redis、第三方 API)状态,判断是否为依赖故障;
应急处理:
依赖故障:切换备用依赖(如 Redis 主节点故障切换到从节点)、降级返回缓存数据;
接口性能问题:临时限流、扩容实例、关闭非核心采集任务(如公域竞品采集);
数据异常:回滚采集规则(如解析规则变更导致采集失败)、恢复缓存数据;
故障恢复:修复根因后,验证接口性能 / 成功率恢复正常,恢复被关闭的任务;
复盘优化:记录故障原因、处理过程、优化措施(如增加某第三方 API 的超时重试次数),避免重复发生。
4. 定期压测与演练
全链路压测:每季度模拟高并发场景(如 1 万 QPS 自有平台采集、5000QPS 第三方平台采集),验证系统承载能力,提前发现瓶颈;
故障演练:每半年进行故障注入测试(如关闭某采集实例、模拟第三方 API 限流、Redis 缓存击穿),验证容错机制与应急响应流程有效性;
配置优化:根据压测结果调整参数(如线程池大小、缓存过期时间、限流阈值)。
四、关键场景专项保障
1. 大促场景(双 11/618)
提前预热:大促前 24 小时全量采集热点商品数据,缓存命中率提升至 99.9%;
资源扩容:核心采集服务实例数扩容 2 倍,Redis 集群扩容 1 倍,数据库只读副本增加 2 个;
限流调整:临时提高核心接口限流阈值(如自有平台采集 QPS 上限提升 50%),限制非核心接口(如公域采集)流量;
降级策略:大促峰值期间,暂停非核心采集任务(如竞品分析、增量同步),优先保障业务核心采集(如商品上架、库存更新)。
2. 第三方平台 API 变更场景
提前感知:订阅第三方平台开放平台公告(如淘宝 / 京东 API 版本更新),预留 1-2 周适配时间;
灰度适配:新增平台 API 适配版本,先灰度 5% 流量验证,无异常后全量切换;
兼容处理:旧版本 API 未下线前,支持双版本兼容(通过配置中心动态切换),避免切换故障。
3. 公域平台反爬升级场景
动态调整:监控公域采集成功率,若成功率骤降(如从 99% 降至 50%),判断为反爬升级,立即调整采集策略(如增加采集间隔、切换 IP 代理池);
规则更新:快速更新 HTML 解析规则(如 XPath/CSS 选择器),适配平台页面结构变更;
降级兜底:反爬升级期间,减少公域采集频率(如从每小时 1 次改为每 6 小时 1 次),避免 IP 被永久封禁。
五、总结
架构上通过拆分、集群、异步化,提升系统抗并发与容错能力;
技术上通过缓存、批量处理、容错机制,降低延迟与故障概率;
运维上通过全链路监控、分级告警、应急演练,确保故障快速发现与恢复。