求助 关于一个特征系统的存储选型问题 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
Tidusy
V2EX    程序员

求助 关于一个特征系统的存储选型问题

  •  
  •   Tidusy 248 天前 1689 次点击
    这是一个创建于 248 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近接手了公司的一个实时特征系统,属于陈年屎山项目,问题挺多的。老板让我看看怎么重构,但一直考虑不清楚,想来请教下大家。

    1. 系统现状

    这个系统主要是给各种模型提供实时的特征查询,比如:近 x 分钟的成交量,某 x 分钟的成交量.

    • 我们通过流式任务消费上游的 mq ,直接产生具体的特征值,写入到 redis 集群里。再通过一个接口,支持对特征的查询。

    • 按峰值来算,写入任务每秒要对 redis 执行 1000w+次写入相关命令;服务接口查询 qps 在 40w+,对 redis 的查询 qps 有 120w+。

    下面讲讲这样搞有啥问题,这草台系统居然也跑那么多年了。。。

    1.1 写入聚合的问题

    举个例子,假设当前时是第 x 分钟,对于特征 近 5 分钟的成交量 ,需要一个滑动窗口来实现。我们会在消费到一条订单消息时,分别给这 5 个 key 执行 +1: 成交量#x, 成交量#x+1,...,成交量#x+4.

    这样,在第 x 分钟时查询 成交量#x ;在第 x+1 分钟时查询 成交量#x+1…… 我们都可以得到一个当前时间节点对应的准确的特征值。

    这种方式使得一个特征的写入次数和 key 数量都产生激增

    1.2 查询聚合的问题

    对于另一类特征,比如 第 0~4 分钟的成交量 。我们需要 MGET 出第 0,1,...,4 分钟 5 个特征 key 的值,然后求和。当然,也可以提前生产按 5 分钟聚合的特征值,这就又引入了 1.1 的问题。

    这种方式使得一个特征的查询,对 redis 有很高的扇出

    1.3 难以维护的配置,摇摇欲坠的 redis 集群

    按上面的做法,每当业务需要一个新特征。我都得人工分析并进行配置,是写入时聚合好?还是查询时聚合好?并且配置复杂容易出错。

    另外,从实际表现看,不管哪种方式,对 redis 的 cpu 压力都很大……

    2. 一些想法

    目前我的思路主要是在系统底层补充一个 具有简单聚合能力的数据库 存储较为原始的特征信息,由数据库负责做统计、聚合。redis 仅作为缓存使用。

    这样我就不需要人工考虑一个特征到底该怎么生产,怎么查询了,大幅降低维护成本。也可以减少 redis 的存储压力。

    另外,我们的特征有一些特点:

    1. 特征都是简单的数值,不会是结构体
    2. 特征的查询维度不多,一般就 5 个左右。但是,部分维度的枚举值非常多(可能在十万级别),也意味着如果使用缓存,可能命中率不高
    3. 特征生命周期短,只保存 1 小时左右即可
    4. 查询实时性比较高,要能在秒级别同步

    于是,我调研了各种数据库:starrocks, clickhouse 这类 olap 数据库; influxdb 这类时序数据库。

    从网上收集到的资料看,功能上大概都能满足。但感觉他们都不太能扛得住我们这么高的查询量,并且提供一个与 redis 相近的查询延迟。

    这一块我纯小白,刚毕业没多久,是真不知道咋搞了。有没有 v 友能救救,跪谢

    4 条回复    2025-03-31 21:40:51 +08:00
    F281M6Dh8DXpD1g2
        1
    F281M6Dh8DXpD1g2  
       248 天前
    flink 开个时间窗口聚合完事
    6HWcp545hm0RHi6G
        2
    6HWcp545hm0RHi6G  
       247 天前
    对于分钟级实时、高并发查询的场景,Redis 或持久化 KV 存储是最优选择,其低延迟、高吞吐的特性能够满足高频轻量级查询需求。建议采用业务层预聚合+存储层简单查询的架构,避免直接对存储层施加复杂计算压力,从而保障系统的稳定性、可扩展性和成本可控性。

    相比之下,**时序数据库(如 InfluxDB )和 OLAP 数据库(如 ClickHouse )**虽然擅长高吞吐写入和高效压缩存储,但其查询模式更适合离线分析而非实时高并发访问。因此,在该场景下,它们无法替代 Redis/KV 存储的低延迟优势,更适合用于历史数据分析或批处理任务。
    qocja
        3
    qocja  
       246 天前
    原始数据落到 TSDB ,然后用预计算+KV 存储做就好了,预计可以用 flink ,TSDB+KV 都可以用 PGSQL 做了(不过 120w QPS 不知道要什么机器配置能搞定,50w 一下我们之前测过是没问题的)
    Tidusy
        4
    Tidusy  
    OP
       246 天前
    @qocja 今天调研了下,时序数据库的查询性能好像很不错。但公司里缺少相关基建,估计不太用得上,头疼
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     948 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 24ms UTC 22:32 PVG 06:32 LAX 14:32 JFK 17:32
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86