Maven / PyPI / Go Proxy / npm 镜像节点正常
OFFICIAL SDK 原生封装 WebSocket 滚球流与本地盘口状态树

多语言体育数据SDK与实时赔率解析工具包

告别繁琐的底层网络套接字维护、HMAC-SHA256 签名拼接与高频增量报文合并。锐矩盘口API 官方出品的客户端开发工具包(Sports Data SDK),原生支持 Java、Python、Go 与 Node.js 生产环境,将盘口系统集成周期从数周缩短至数小时。

快速安装命令行 (CLI)
$
序列化吞吐耗时
< 0.8 ms
Protobuf 零拷贝解析
断线自动重连恢复
< 150 ms
携带 Sequence 游标
单实例并发订阅
2,500+ 场
全量滚球亚盘/欧赔
单元测试覆盖率
96.4%
长期 LTS 生产验证
ruiju-sdk-runtime-monitor.sh
STREAMCONNECTED
锐矩体育数据SDK实时盘口内存缓存与WebSocket增量流监控界面
Engine: OddsMemoryTree v2.4.1 Delta Patch: 18μs
[SDK-CORE] 本地活跃比赛状态树
[WS-POOL] 增量赔率帧吞吐率
[CACHE] 本地快照命中率 (L1 RingBuffer)
seq_id=99482104 | market=AH_LIVE | status=OPEN |crc32=OK
MULTI-LANGUAGE DISTRIBUTIONS

官方多语言客户端下载与环境依赖规范

所有官方体育数据SDK均经过高并发滚球压力测试,支持中央仓库直接引入或下载离线编译包。内置统一的错误码映射模型与连接池配置接口。

Java 体育数据客户端 SDK

v2.4.1 LTS

适用于高吞吐交易撮合核心、Spring Boot 微服务集群

JDK 11 / 17 / 21+
网络底层 Netty 4.1.108 Epoll
本地缓存结构 LMAX Disruptor + Caffeine
SHA-256 校验值 8f9d2a...c41e09
Maven pom.xml 依赖配置 GroupId: cn.com.oddsapi.sdk
<dependency>
    <groupId>cn.com.oddsapi.sdk</groupId>
    <artifactId>ruiju-odds-sdk-spring-boot-starter</artifactId>
    <version>2.4.1</version>
</dependency>

Go 盘口接入客户端 SDK

v1.9.4 Stable

适用于极低延迟边缘网关、高并发协程流分发服务

Go 1.20 / 1.22+
协程与复用模型 Goroutine Pool + sync.Pool
协议编解码 Protobuf v3 / Sonic JSON
SHA-256 校验值 3a7c11...e92b40
Go Modules 安装命令 Zero GC Allocation 优化
go get -u github.com/odds-api-cn/ruiju-sdk-go@v1.9.4
# 导入核心包:
import "github.com/odds-api-cn/ruiju-sdk-go/oddsclient"

Python 体育数据客户端 SDK

v3.1.0 Async

适用于量化赔率模型训练、凯利指数监控、DataFrame 导出

Python 3.9 - 3.12+
异步事件循环 asyncio + uvloop + aiohttp
数据模型与导出 Pydantic v2 / Pandas 桥接
SHA-256 校验值 6d2e89...f10a77
PyPI pip / Poetry 安装指令 内建 Cython 加速解析扩展
pip install ruiju-sports-sdk[uvloop,pandas]==3.1.0
# 或使用 Poetry:
poetry add ruiju-sports-sdk@^3.1.0

Node.js 实时数据 SDK (TypeScript)

v2.8.2 ESM

适用于实时比分看板 BFF 层、WebSocket 推送中台、NestJS

Node 18 / 20 / 22 LTS
类型系统 100% Strict TypeScript .d.ts
传输引擎 uWebSockets.js / ws + EventEmitter3
SHA-256 校验值 9b4f02...a83c12
npm / pnpm / yarn 安装命令 支持 CommonJS 与 ES Modules
npm install @odds-api/realtime-sdk@2.8.2 --save
# 或使用 pnpm:
pnpm add @odds-api/realtime-sdk
ENCAPSULATED CORE CAPABILITIES

客户端核心封装能力:为什么使用官方体育数据SDK而非裸调接口?

在足球滚球高峰期(周六晚间同时进行 300+ 场赛事),每秒产生的盘口水位跳动与封盘信号超过上万次。自行编写 WebSocket 客户端极易遭遇消息乱序、断线期间数据黑洞、内存泄漏以及复杂让球线计算错误。官方 SDK 在客户端内部替您完成了以下 6 大核心工程模块:

增量报文自动合并 (Delta Patching)

网关仅推送变化的赔率字段(如主胜水位从 1.92 变为 1.88)。SDK 自动将其合并至本地全量赛事对象,向业务层暴露完整一致的 MatchOddsSnapshot 实体。

节省带宽: ~78% | 校验算法: Sequence + CRC32

零延迟危险球封盘拦截 (Bet-Stop Guard)

当赛场出现点球、红牌、VAR 介入或单刀进攻时,SDK 优先通过高优先级通道触发 onBetStopSignal 回调,并在微秒级将本地缓存中对应赛事所有盘口标记为 SUSPENDED。

独立高优队列分发 | 规避打水套利风险

多格式赔率与复合亚盘高精度换算

内置定点数运算引擎(避免浮点数精度丢失),一键互转欧洲赔率 (Decimal)、香港盘 (HK)、马来盘 (MY)、印尼盘 (ID),自动拆解 -0.5/1 (-0.75) 等复合让球线与返还率(Margin)。

内置 OddsCalculator 工具类 | BigDecimal 精度

动态签名鉴权与时钟偏移自校准

自动管理 X-Ruiju-Signature (HMAC-SHA256)、随机 Nonce 防重放池及短期 Session Token 自动续期。若宿主服务器 NTP 时钟偏差超过阈值,SDK 自动与服务端对齐时间戳。

支持双密钥平滑轮转 (Key Rotation)

客户端背压控制与自适应限流保护

当下游业务消费线程(如入库或推送给前端)跟不上滚球峰值速率时,SDK 自动启用滑动窗口聚合策略,将同一毫秒窗口内的多次微小跳水合并为最新状态帧,防止 OOM 崩溃。

支持 TokenBucket 与 Conflation 合并模式

原生 OpenTelemetry 与 Prometheus 指标

开箱即用暴露 /metrics 观测端点:涵盖端到端报文传输延迟直方图(P50/P95/P99)、重连计数、SeqGap 补帧次数与本地缓存赛事总数,无缝对接 Grafana 监控告警。

内置 Grafana Dashboard JSON 模板导出
HIGH AVAILABILITY & LOCAL MEMORY TREE

内置 WebSocket 断线重连状态机与本地赔率缓存架构

跨境专线抖动或容器滚动发布时,普通长连接断开会导致盘口未及时封盘或丢失关键进球赔率跳变。锐矩盘口API SDK 采用「雙通道状态同步 + 序列号无损回放 (Sequence Replay)」机制,确保任何网络闪断下本地内存与主干引擎 100% 最终一致。

01

双向微秒级心跳与僵死连接探测 (Dead-Peer Detection)

每 3,000ms 发送轻量级 Ping 帧;一旦连续 2 个周期未收到网关 Pong 响应或底层 TCP 触发 RST,SDK 立即在 10ms 内冻结本地盘口状态为 STALE_PROTECTED,防止业务层读取陈旧赔率接单。

02

多接入点故障转移与指数退避重连 (Exponential Backoff + Jitter)

自动在深圳、香港、新加坡及法兰克福边缘接入点之间切换。重连间隔遵循 min(50ms * 2^attempt + random_jitter, 3000ms),避免大规模客户端同时重连造成惊群效应。

03

基于 Last_Sequence_ID 的增量断点续传与 Diff 快照对齐

重连握手时自动携带断线前最后确认的 last_seq_id。若断线时长 ≤ 60 秒,服务端直接回放缺失的增量帧队列;若断线 > 60 秒,SDK 自动拉取压缩全量快照并原子替换内存树。

04

二级缓存架构:L1 进程内无锁状态树 + L2 Redis 集群广播

提供标准 OddsCacheProvider 接口,支持单机内存零延迟读取(O(1) 复杂度查询任意比赛让球线),亦可配置自动同步至企业内部 Redis Cluster 供多业务节点共享。

INTERACTIVE SANDBOX

SDK 断线自愈与本地赔率内存树模拟器

连接状态机 (State)
本地游标 (Last Seq)
接入网关节点
L1 Memory Tree: match_id=849201 (英超 滚球 67')
全场亚盘 (AH -0.5)
HK 水位实时合并
大小球 (O/U 2.5/3)
Delta 增量更新
独赢欧赔 (1X2)
Margin: 1.85%
QUICKSTART INITIALIZATION SNIPPETS

5 分钟快速初始化代码片段:从鉴权到订阅滚球增量流

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],
});
需要沙盒测试环境 AppKey?初始化时将 endpoint 指向 wss://sandbox-stream.odds-api.com.cn/v3/inplay 即可免费回放全真历史欧冠决赛滚球流。
查看沙盒环境配置步骤 →
RELEASE MATRIX & CHANGELOG

多语言 SDK 版本兼容性矩阵与更新日志

筛选语言:
SDK 发行版本 语言生态 网关协议兼容 发布日期 核心变更与优化说明 生命周期状态
7×24 小时生产环境架构师直连支持

需要定制 C++ / C# (.NET) / Rust 客户端或遇到高并发压测瓶颈?

锐矩盘口API 研发团队提供完整的 Protobuf .proto 原始定义文件与跨语言脚手架生成工具。您可随时联系技术支持获取专属沙盒凭证或预约架构师远程联调。

dev-support@odds-api.com.cn +86-755-86729310