1. 项目背景与核心挑战
去年双十一大促期间,我们团队负责的优惠券省钱APP经历了严重的查询性能瓶颈。当用户同时搜索"200元以下运动鞋"+"可用店铺券"时,平均响应时间从平时的800ms飙升到4.2秒,直接导致当天搜索转化率下降37%。事后分析发现,原有MySQL方案存在三个致命缺陷:
- 多条件联合查询时索引失效(特别是优惠券适用条件这类JSON字段)
- 高并发时数据库连接池被打满
- 模糊搜索(如"男士休闲鞋")需要全表扫描
经过压力测试,我们确认当QPS超过500时,现有架构已无法保证SLA要求的1秒响应。这就是我们启动Elasticsearch+Canal技术方案优化的背景。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 技术选型与架构设计
2.1 为什么选择Elasticsearch?
对比了Solr、MongoDB等方案后,我们最终选择ES的核心原因:
- 倒排索引优势:对"品牌+价格区间+优惠券类型"这类组合查询,ES的倒排索引比B+树快3个数量级
- 分词能力:内置IK分词器完美处理中文商品标题模糊匹配
- 横向扩展:实测单个分片可承载2000QPS,通过增加节点即可线性提升吞吐
2.2 为什么引入Canal?
传统双写方案存在数据一致性问题。我们采用Canal监听MySQL binlog的方案,关键考量:
- 零侵入性:不影响现有业务代码
- 秒级延迟:实测平均同步延迟仅400ms
- 断点续传:基于位点(position)恢复,网络异常时不会丢数据
2.3 最终架构图
code复制[MySQL] → [Canal Server] → [Kafka] → [Logstash] → [Elasticsearch]
↑
[监控告警系统]
3. 核心实现细节
3.1 商品索引设计
json复制{
"mappings": {
"properties": {
"product_id": {"type": "keyword"},
"title": {
"type": "text",
