共计 2473 个字符,预计需要花费 7 分钟才能阅读完成。
背景痛点:为什么 skill 市场需要特别设计?
传统电商平台的技术架构直接套用到 skill 市场会遇到三个致命问题:

- 实时匹配效率低下:当用户搜索 ”Python 爬虫教学 ” 时,需要同时匹配技能名称、描述、标签、历史评价等多维度数据,传统 SQL 的 LIKE 查询会导致数据库压力爆炸
- 交易过程复杂:服务购买涉及预约时间、确认交付物、分阶段付款等场景,简单的订单表设计根本无法满足
- 评价系统失真:技能服务的非标特性使得简单的五星评分体系毫无参考价值
架构设计:微服务拆解方案
组件拓扑图
graph TD
A[客户端] --> B[API Gateway]
B --> C[用户服务]
B --> D[搜索服务]
B --> E[交易服务]
B --> F[评价服务]
D --> G[Elasticsearch 集群]
E --> H[分布式事务协调器]
关键决策对比
| 方案 | 优点 | 缺点 | 选型依据 |
|---|---|---|---|
| 单体架构 | 开发简单 | 扩展性差 | 排除,并发预估超 2000QPS |
| 服务网格 | 链路治理能力强 | 运维成本高 | 中小团队不适用 |
| 基础微服务 | 技术栈灵活 | 需要自研监控体系 | 当前选择 |
核心实现:三大关键技术解析
1. Elasticsearch 搜索优化
索引设计示例(使用 Python DSL):
from elasticsearch_dsl import Document, Text, Keyword, Integer
class SkillIndex(Document):
name = Text(analyzer="ik_max_word") # 中文分词
tags = Keyword(multi=True) # 精准匹配标签
price_range = Integer() # 价格区间过滤
class Index:
name = "skills"
settings = {
"number_of_shards": 3,
"number_of_replicas": 1
}
搜索技巧:
– 对价格、评分等数值字段使用 range 查询
– 对标签使用 terms 查询实现精准过滤
– 组合查询时注意 boost 参数调整权重
2. 分布式事务实现(Go 语言示例)
采用 TCC 模式处理预约锁定期:
// Try 阶段:预留资源
func (s *OrderService) TryCreateOrder(ctx context.Context, req *pb.CreateOrderReq) error {
// 1. 检查技能提供者时间可用性
// 2. 冻结用户账户金额
// 3. 生成预订单状态
return lockResources(req)
}
// Confirm 阶段:确认执行
func (s *OrderService) ConfirmOrder(orderID string) {
// 1. 更新订单为有效状态
// 2. 扣除实际金额
// 3. 标记时间为已占用
}
// Cancel 阶段:补偿释放
func (s *OrderService) CancelOrder(orderID string) {
// 1. 解除时间锁定
// 2. 返还冻结金额
// 3. 记录取消原因
}
3. JWT 安全实践
Token 刷新机制(Java 实现):
// 登录成功时生成双 Token
Map<String, String> tokens = new HashMap<>();
String accessToken = Jwts.builder()
.setSubject(userId)
.setExpiration(new Date(System.currentTimeMillis() + 15 * 60 * 1000)) // 15 分钟
.signWith(SignatureAlgorithm.HS512, secret)
.compact();
String refreshToken = UUID.randomUUID().toString();
redisTemplate.opsForValue().set("refresh:"+userId, refreshToken, 7, TimeUnit.DAYS);
// 刷新接口示例
@PostMapping("/refresh")
public ResponseEntity<?> refreshTokens(@RequestHeader("Authorization") String refreshToken) {
// 验证 refreshToken 有效性
// 生成新的 accessToken
// 返回新 token 对
}
性能优化:应对高并发场景
多级缓存设计
请求流程:1. 客户端请求 → Nginx 本地缓存(1s)
2. 未命中 → Redis 集群查询
3. 仍未命中 → 回源到服务查询 DB
Redis 数据结构选择:
– 技能详情用 Hash 存储
– 热门搜索用 ZSET 维护
– 分布式锁用 SETNX 实现
数据库分库分表
-- 按用户 ID 哈希分库
CREATE TABLE orders_${user_id % 4} (
order_id BIGINT PRIMARY KEY,
user_id BIGINT,
skill_id BIGINT,
shard_key INT GENERATED ALWAYS AS (user_id % 32) STORED
) PARTITION BY LIST (shard_key);
避坑指南:血泪经验总结
技能匹配三大误区
- 过度依赖关键词:应结合用户历史行为画像
- 忽视地理位置:同城技能服务响应更快
- 静态评分权重:需引入时间衰减因子
交易超时处理黄金法则
- 支付超时:15 分钟未支付自动取消
- 服务超时:根据服务类型动态设置(线上 / 线下)
- 采用状态机模式管理订单生命周期
敏感数据加密要点
# 银行卡号加密示例
from cryptography.fernet import Fernet
key = Fernet.generate_key()
cipher = Fernet(key)
encrypted = cipher.encrypt(b"6225888888888888")
decrypted = cipher.decrypt(encrypted)
延伸思考
- 如何设计技能服务的质量评估体系?
- 实时聊天功能该选用 WebSocket 还是 MQ 方案?
- 跨国交易时怎么解决汇率波动问题?
完整 Demo 地址:https://github.com/example/skill-market-demo (包含 Docker 部署脚本)
正文完
发表至: 技术架构
近一天内
