1. 反向竞猜业务逻辑与赔率模型概述
反向竞猜平台的核心玩法是用户对某场体育赛事的“非指定赛果”进行投注,例如选择“全场比分不是 1:0”或“总进球数不为 2”。这种玩法不同于实时赛果预测,其赔率计算基于概率补集,需要更复杂的组合赔率模型。
赔率模型采用动态水位调节机制:基础赔率 = 1 / (1 - P(specific_score) - margin),其中 P 为泊松分布或历史数据拟合的概率。由于反向竞猜覆盖多个比分排除,实际计算通过聚合海量比分组合的概率和的倒数得到。
2. 前后端分离架构与微服务拆分
源码采用 Vue 3 + TypeScript 构建管理后台与用户端,后端基于 Spring Cloud Alibaba 微服务体系,拆分以下服务:
- gateway-service:统一鉴权、限流与路由。
- match-service:赛事数据接入与赛果管理。
- odds-service:赔率计算、水位调整与赔率快照。
- order-service:投注订单、撤单与资金流水。
- settle-service:实时结算引擎,监听赛果事件。
- agent-service:代理分佣、层级管理与佣金结算。
服务间通过 RocketMQ 消息队列解耦,使用 Redis 缓存实时赔率,MySQL 存储核心事务数据,TiDB 可选用于大数据报表。
3. 数据库表结构设计与比分数据建模
核心表设计如下:
| 表名 | 关键字段 | 说明 |
|---|---|---|
| t_match | match_id, home_team, away_team, start_time, status | 赛事主表 |
| t_score_odds | odds_id, match_id, exclude_score, odds_value, margin | 反向竞猜赔率配置 |
| t_bet_order | order_id, user_id, match_id, stake, odds, status, create_time | 投注订单表 |
| t_settle_record | settle_id, order_id, result, profit, settle_time | 结算记录 |
| t_agent_account | agent_id, parent_id, level, commission_rate, balance | 代理账户与分佣 |
比分数据建模采用 JSONB 字段存储全量可能比分与概率分布,例如 {"1:0":0.12,"2:0":0.08,...},便于赔率引擎快速聚合。
4. 投注引擎与实时结算核心算法
投注引擎采用 LMAX Disruptor 环形缓冲区实现单机每秒 10 万+ 订单处理。算法步骤如下:
- 步骤1:风控校验——校验用户余额、单注限额、单场总投注限额。
- 步骤2:赔率快照锁定——从 Redis 读取该场次排除比分组合的最新赔率,若水位变动超过阈值则触发重新报价。
- 步骤3:入队与持久化——订单写入 MySQL,同时发送 MQ 消息至结算服务。
实时结算核心算法:当赛果事件到达,结算服务根据 排除比分集合
