Skip to content

设备指纹(yidun-device-fingerpint) ​

回答一个基础问题:这是不是同一台设备? 答案是一个稳定 ID —— sid。

目录名说明

源码目录是 yidun-device-fingerpint(历史拼写漏了 f),产品和注释中一律叫「设备指纹 / Device Fingerprint」。

1. 业务定位 ​

客户端 SDK 采集数百维设备信息(系统、硬件、应用、网络、模拟器与改机特征),服务端据此:

  1. 为每台真实设备签发全局稳定的 sid;
  2. 同一台物理设备多次上报时召回同一个 sid。

这两件事决定了风控能否做设备维度判定。sid 召回不一致的后果很直接:同一设备被识别成多台 → 放行黑产;不同设备被合并 → 误伤正常用户。

2. 部署形态 ​

部署单元说明
facade/upload-http上传接入,需外网(客户端 SDK 调用 /v1/ad/d 等)
facade/query-http查询服务,服务端访问,无需外网
facade/innerapi内部服务接口
mq/storageKafka 异步消费持久化
scheduler统计与计费定时任务
console/backend管理后台

分层:upload-http → service/business(找回、风控、脚本校验)→ service/base(DAO/缓存/存储)→ mq/storage + scheduler。

3. 核心链路 ​

sid 来源四类(SidFromEnum),可信度与优先级由检索规则决定:

来源含义
NEID本地 neid 索引直接找回,最快
RULE字段匹配规则找回
ES向量相似度找回,适合改机场景
NEW新设备签发

4. 关键数据模型 ​

对象说明
RetrievalRule / 检索规则集决定找回顺序与判定条件
VerificationRule验证脚本,异步校验上报真实性
DeviceVec平台设备向量抽象
设备黑名单DeviceIdBlack,按 sid 拦截
SDK 配置各端版本与能力开关

5. 存储与中间件 ​

组件存储内容
MySQL配置、规则、产品、账户、计费
HBase设备明细(宽表,写多读少)
Redis实时名单、计数、nonce 防重放
Elasticsearch设备向量与 sid 索引(rule/neid/vector)
Kafka上报明细异步落库
NOS大字段与附件

6. 加解密与协议 ​

上传报文支持多版本协议:P1/P2/P3、WAES、RSA、AES、XOR,由 CryptoRouter 路由到对应实现(如 NisCryptoImplV200)。protobuf 定义集中在 AndroidFingerPrint.proto、EncryptMsg.proto。

改动协议意味着 SDK 与服务端必须同步发版,且要兼容存量 SDK 版本。

7. 设计模式与扩展点 ​

扩展点位置说明
平台差异SDKType + DeviceVec新增端类型实现对应向量与解析
找回策略retrieve 包(neid/rule/vector 三路)调整找回顺序与阈值
加密协议CryptoRouter + NisCryptoImplV*新增协议版本
验证脚本AsyncScriptValidator异步真实性校验

8. 上下游依赖 ​

方向模块说明
上游各端 SDK上报加密设备数据
上游mplatform-strategy、intelligent-risk查询设备画像
下游mplatform-business产品与套餐、计费
下游checker-preprocess设备维度预处理配置
下游mplatform-clickhouse设备统计入仓
下游mplatform-event配置变更事件

9. 工程约束与变更红线 ​

  • 主流程只做解析/找回/风控/返回,明细落库全走 Kafka,禁止同步写存储。
  • nonce 防重放必须生效,否则重放报文会污染设备数据。
  • 检索规则索引不可随意删除:rule/neid/vector 索引缺失会直接降低找回率。
  • 协议变更必须双向兼容:存量 SDK 仍在用旧版本。
  • sid 一旦签发不可复用:错误合并设备是数据事故,无法简单回滚。

10. 关键代码索引 ​

主题路径说明
上传入口yidun-device-fingerpint/facade/upload-http/src/main/java/.../controller/AndroidUploadController.java上报接口
主流程yidun-device-fingerpint/facade/upload-http/src/main/java/.../DeviceInboundServiceImpl.javainnerProcess 全流程
sid 找回yidun-device-fingerpint/service/business/src/main/java/.../retrieve/neid/rule/vector 三路
检索规则yidun-device-fingerpint/service/business/src/main/java/.../retrievalrule/规则加载与执行
加解密路由yidun-device-fingerpint/crypto/src/main/java/.../CryptoRouter.java多版本协议
异步落库yidun-device-fingerpint/mq/storage/src/main/java/.../DeviceDataRecordConsumer.javaKafka 消费
查询服务yidun-device-fingerpint/facade/query-http/src/main/java/.../QueryDeviceController.java设备查询

11. 排查要点 ​

现象定位结论
同一设备拿到不同 sid看 sid 来源与检索规则命中多为 NEID 未命中、规则阈值过严、ES 索引缺失
不同设备被合并看规则条件与向量阈值规则过宽,需收紧
上报成功但查不到设备看 Kafka 消费与 HBase 写入异步落库堆积,与上传链路无关
上报大量解密失败看协议版本与密钥配置SDK 版本与服务端协议不匹配
找回率下降看索引健康与规则发布记录索引重建或规则调整导致

排查顺序

设备问题先看 sid 来源分布,再看 检索规则,最后才看存储。多数「sid 不一致」根因在找回规则,而不是数据丢失。

最近更新

内部资料,请勿外传