告别繁琐的底层网络套接字维护、HMAC-SHA256 签名拼接与高频增量报文合并。锐矩盘口API 官方出品的客户端开发工具包(Sports Data SDK),原生支持 Java、Python、Go 与 Node.js 生产环境,将盘口系统集成周期从数周缩短至数小时。
所有官方体育数据SDK均经过高并发滚球压力测试,支持中央仓库直接引入或下载离线编译包。内置统一的错误码映射模型与连接池配置接口。
适用于高吞吐交易撮合核心、Spring Boot 微服务集群
<dependency>
<groupId>cn.com.oddsapi.sdk</groupId>
<artifactId>ruiju-odds-sdk-spring-boot-starter</artifactId>
<version>2.4.1</version>
</dependency>
适用于极低延迟边缘网关、高并发协程流分发服务
go get -u github.com/odds-api-cn/ruiju-sdk-go@v1.9.4
# 导入核心包:
import "github.com/odds-api-cn/ruiju-sdk-go/oddsclient"
适用于量化赔率模型训练、凯利指数监控、DataFrame 导出
pip install ruiju-sports-sdk[uvloop,pandas]==3.1.0
# 或使用 Poetry:
poetry add ruiju-sports-sdk@^3.1.0
适用于实时比分看板 BFF 层、WebSocket 推送中台、NestJS
npm install @odds-api/realtime-sdk@2.8.2 --save
# 或使用 pnpm:
pnpm add @odds-api/realtime-sdk
在足球滚球高峰期(周六晚间同时进行 300+ 场赛事),每秒产生的盘口水位跳动与封盘信号超过上万次。自行编写 WebSocket 客户端极易遭遇消息乱序、断线期间数据黑洞、内存泄漏以及复杂让球线计算错误。官方 SDK 在客户端内部替您完成了以下 6 大核心工程模块:
网关仅推送变化的赔率字段(如主胜水位从 1.92 变为 1.88)。SDK 自动将其合并至本地全量赛事对象,向业务层暴露完整一致的 MatchOddsSnapshot 实体。
当赛场出现点球、红牌、VAR 介入或单刀进攻时,SDK 优先通过高优先级通道触发 onBetStopSignal 回调,并在微秒级将本地缓存中对应赛事所有盘口标记为 SUSPENDED。
内置定点数运算引擎(避免浮点数精度丢失),一键互转欧洲赔率 (Decimal)、香港盘 (HK)、马来盘 (MY)、印尼盘 (ID),自动拆解 -0.5/1 (-0.75) 等复合让球线与返还率(Margin)。
自动管理 X-Ruiju-Signature (HMAC-SHA256)、随机 Nonce 防重放池及短期 Session Token 自动续期。若宿主服务器 NTP 时钟偏差超过阈值,SDK 自动与服务端对齐时间戳。
当下游业务消费线程(如入库或推送给前端)跟不上滚球峰值速率时,SDK 自动启用滑动窗口聚合策略,将同一毫秒窗口内的多次微小跳水合并为最新状态帧,防止 OOM 崩溃。
开箱即用暴露 /metrics 观测端点:涵盖端到端报文传输延迟直方图(P50/P95/P99)、重连计数、SeqGap 补帧次数与本地缓存赛事总数,无缝对接 Grafana 监控告警。
跨境专线抖动或容器滚动发布时,普通长连接断开会导致盘口未及时封盘或丢失关键进球赔率跳变。锐矩盘口API SDK 采用「雙通道状态同步 + 序列号无损回放 (Sequence Replay)」机制,确保任何网络闪断下本地内存与主干引擎 100% 最终一致。
每 3,000ms 发送轻量级 Ping 帧;一旦连续 2 个周期未收到网关 Pong 响应或底层 TCP 触发 RST,SDK 立即在 10ms 内冻结本地盘口状态为 STALE_PROTECTED,防止业务层读取陈旧赔率接单。
自动在深圳、香港、新加坡及法兰克福边缘接入点之间切换。重连间隔遵循 min(50ms * 2^attempt + random_jitter, 3000ms),避免大规模客户端同时重连造成惊群效应。
重连握手时自动携带断线前最后确认的 last_seq_id。若断线时长 ≤ 60 秒,服务端直接回放缺失的增量帧队列;若断线 > 60 秒,SDK 自动拉取压缩全量快照并原子替换内存树。
提供标准 OddsCacheProvider 接口,支持单机内存零延迟读取(O(1) 复杂度查询任意比赛让球线),亦可配置自动同步至企业内部 Redis Cluster 供多业务节点共享。
package cn.com.oddsapi.demo;
import cn.com.oddsapi.sdk.RuijuOddsClient;
import cn.com.oddsapi.sdk.config.ClientOptions;
import cn.com.oddsapi.sdk.config.ReconnectPolicy;
import cn.com.oddsapi.sdk.model.MarketType;
import cn.com.oddsapi.sdk.model.OddsDeltaEvent;
import cn.com.oddsapi.sdk.model.MatchOddsSnapshot;
import java.time.Duration;
import java.util.List;
public class InPlayOddsBootstrap {
public static void main(String[] args) {
// 1. 构建客户端配置:启用本地 L1 缓存树与指数退避断线重连
ClientOptions options = ClientOptions.builder()
.appKey(System.getenv("RUIJU_APP_KEY"))
.appSecret(System.getenv("RUIJU_APP_SECRET"))
.endpoint("wss://stream-cn-sz.odds-api.com.cn/v3/inplay")
.fallbackEndpoints(List.of("wss://stream-hk.odds-api.com.cn/v3/inplay"))
.enableLocalMemoryTree(true)
.reconnectPolicy(ReconnectPolicy.exponentialBackoff(Duration.ofMillis(50), Duration.ofSeconds(3)))
.build();
RuijuOddsClient client = new RuijuOddsClient(options);
// 2. 注册危险球毫秒级封盘回调(最高优先级线程分发)
client.onBetStop(signal -> {
System.out.printf("[BET-STOP] 比赛ID=%d 触发封盘! 原因=%s, 发生时间戳=%d%n",
signal.getMatchId(), signal.getReason(), signal.getServerTimestamp());
});
// 3. 注册增量赔率更新回调(SDK 已自动合并至本地全量快照)
client.onOddsDelta((OddsDeltaEvent delta, MatchOddsSnapshot mergedSnapshot) -> {
System.out.printf("[DELTA] 比赛=%d | 亚盘主让球线=%s | 最新主胜香港盘=%s (Seq=%d)%n",
delta.getMatchId(),
mergedSnapshot.getMainAsianHandicap().getLine(),
mergedSnapshot.getMainAsianHandicap().getHomeOddsHk(),
delta.getSequenceId());
});
// 4. 启动长连接并订阅足球滚球全量亚盘与大小球
client.connectAndSubscribe(List.of(MarketType.ASIAN_HANDICAP_LIVE, MarketType.OVER_UNDER_LIVE));
}
}
package main
import (
"context"
"fmt"
"os"
"time"
"github.com/odds-api-cn/ruiju-sdk-go/oddsclient"
)
func main() {
// 1. 初始化 Go 客户端配置,开启 Protobuf 二进制流与自动 Seq 补帧
cfg := &oddsclient.Config{
AppKey: os.Getenv("RUIJU_APP_KEY"),
AppSecret: os.Getenv("RUIJU_APP_SECRET"),
PrimaryEndpoint: "wss://stream-cn-sz.odds-api.com.cn/v3/inplay",
StandbyEndpoints: []string{"wss://stream-sg.odds-api.com.cn/v3/inplay"},
WireFormat: oddsclient.FormatProtobuf,
HeartbeatInterval: 3 * time.Second,
EnableLocalCache: true,
}
client, err := oddsclient.NewClient(cfg)
if err != nil {
panic(err)
}
defer client.Close()
// 2. 监听危险球封盘与增量赔率管道 (Zero-Alloc Channel)
go func() {
for evt := range client.Events() {
switch evt.Type {
case oddsclient.EventBetStop:
fmt.Printf("[ALERT] 赛事 %d 立即锁盘! 触发信号: %s\n", evt.MatchID, evt.BetStopReason)
case oddsclient.EventOddsDelta:
// 直接从本地 L1 内存树 O(1) 读取合并后的完整亚盘快照
snap, ok := client.Cache().GetMatchSnapshot(evt.MatchID)
if ok {
fmt.Printf("[SYNC] Seq=%d | 赛事=%d | 滚球比分=%d-%d | 亚盘水位=%v\n",
evt.SequenceID, evt.MatchID, snap.HomeScore, snap.AwayScore, snap.MainAH)
}
}
}
}()
// 3. 发起连接并订阅全球一级联赛滚球流
if err := client.Start(context.Background(), oddsclient.SubAllInPlayFootball); err != nil {
panic(err)
}
select {}
}
import asyncio
import os
from ruiju_sports_sdk import AsyncOddsClient, MarketFilter, OddsFormat
async def main():
# 1. 初始化异步客户端,内置 uvloop 加速与断线自动回放缺失帧
client = AsyncOddsClient(
app_key=os.environ.get("RUIJU_APP_KEY"),
app_secret=os.environ.get("RUIJU_APP_SECRET"),
odds_format=OddsFormat.DECIMAL,
enable_local_cache=True,
auto_reconnect=True
)
@client.on_bet_stop
async def handle_bet_stop(signal):
print(f"[BET_STOP] Match={signal.match_id} locked! reason={signal.reason}")
@client.on_odds_update
async def handle_odds_update(delta, snapshot):
# snapshot 为自动合并后的 Pydantic 强类型对象,可直接转 Pandas DataFrame
ah = snapshot.main_asian_handicap
print(f"[SEQ:{delta.seq_id}] {snapshot.home_team} vs {snapshot.away_team} "
f"| 让球:{ah.handicap_line} | 主:{ah.home_odds} 客:{ah.away_odds}")
# 2. 启动流式订阅:足球滚球亚盘、欧赔与角球盘口
await client.connect(
markets=[MarketFilter.FT_ASIAN_HANDICAP, MarketFilter.FT_1X2, MarketFilter.CORNERS_LIVE]
)
if __name__ == "__main__":
asyncio.run(main())
import { RuijuRealtimeClient, MarketType, OddsFormat } from '@odds-api/realtime-sdk';
const client = new RuijuRealtimeClient({
appKey: process.env.RUIJU_APP_KEY!,
appSecret: process.env.RUIJU_APP_SECRET!,
region: 'cn-shenzhen',
oddsFormat: OddsFormat.HONG_KONG,
localStateTree: { enabled: true, maxStaleMs: 5000 },
});
// 1. 监听高优封盘指令(如 VAR 介入、红牌或危险任意球)
client.on('betStop', (payload) => {
console.warn(`[BET-STOP] Match ${payload.matchId} suspended at ${payload.timestamp}ms`);
});
// 2. 监听增量赔率推送并读取合并后的本地状态树
client.on('oddsDelta', ({ delta, mergedMatch }) => {
const mainLine = mergedMatch.markets.asianHandicap?.mainLine;
console.log(`[Seq #${delta.seq}] Match ${mergedMatch.matchId} | Line: ${mainLine?.hdp} | Home: ${mainLine?.home}`);
});
// 3. 建立 WebSocket 连接并订阅滚球频道
await client.connect();
await client.subscribe({
sport: 'football',
inPlayOnly: true,
markets: [MarketType.ASIAN_HANDICAP, MarketType.OVER_UNDER, MarketType.EURO_1X2],
});
endpoint 指向 wss://sandbox-stream.odds-api.com.cn/v3/inplay 即可免费回放全真历史欧冠决赛滚球流。
| SDK 发行版本 | 语言生态 | 网关协议兼容 | 发布日期 | 核心变更与优化说明 | 生命周期状态 |
|---|---|---|---|---|---|
锐矩盘口API 研发团队提供完整的 Protobuf .proto 原始定义文件与跨语言脚手架生成工具。您可随时联系技术支持获取专属沙盒凭证或预约架构师远程联调。