V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
HolmLoh
V2EX  ›  程序员

想请教一下如何高效地甄别用户上传数据的唯一性

  •  
  •   HolmLoh · 2020-06-04 21:39:24 +08:00 via iPhone · 2136 次点击
    这是一个创建于 1427 天前的主题,其中的信息可能已经有所发展或是发生改变。

    需求如下

    1. 数据的处理要尽可能地高效,吞吐量要尽量大
    2. 数据是用户上传的,但是需要保证该数据是唯一的,需要甄别出来并立刻响应给用户告知已重复
    3. 这个有唯一约束的数据,数据量较大

    举个例子

    秒杀活动开始,用户下单购买商品,然后创建订单号发送到交易系统中,但是订单号并不是由系统生成的,而是由用户自己输入的(虽然这个需求很奇怪,但是就假设他一定要这么做吧),成功下单后会有下单记录,所以需要即时响应给用户告知其是否下单成功

    需求 1+3,直接往 redis 里面丢,持久化就丢进队列让他慢慢写 db,不管唯一了,梭哈!但是行为队列程序是后期再进行持久化,这样就无法甄别数据唯一这个奇怪的需求了

    需求 2+3,直接往 db 里面丢就完了,梭哈!但是此场景是会出现高并发的情况,db 的处理能力无法满足到需求 1 。

    需求 2+1,我想到的是用 redis 等缓存服务,把所有交易的订单号塞进去,这样就能高效地实现判断数据是否唯一了。但是内存比较昂贵,订单长年累月下了数据量巨大,可能满足不了需求 3 ?

    想请教一下有没有解决方案,难道是 redis 机器堆起来梭哈?

    15 条回复    2020-06-05 09:05:36 +08:00
    makdon
        1
    makdon  
       2020-06-04 21:46:57 +08:00   ❤️ 1
    感觉好像用布隆过滤器可以搞定?
    zxyroy
        2
    zxyroy  
       2020-06-04 21:49:11 +08:00   ❤️ 1
    不知道数据有多大,不知道 bloomfilter 可行吗?
    jugelizi
        3
    jugelizi  
       2020-06-04 21:52:46 +08:00 via iPhone   ❤️ 1
    布隆过滤可以判断 key 肯定不存在
    缺点就是可能实际上没有单号 却返回已存在
    huntcool001
        4
    huntcool001  
       2020-06-04 21:54:01 +08:00   ❤️ 1
    用 Redis 的 Bloomfilter 就行了, 自建的话,Redis 有免费的 Bloomfilter module 可以载入. 阿里云的我记得也有.

    如果不想弄插件的话,用 Redisson 客户端,里面也有基于 redis 的 bloomfilter.

    bloomfilter 查出来发现重复了,因为可能是假阳性,看业务需要,可以再去 db 里验证一遍.
    lpts007
        5
    lpts007  
       2020-06-04 21:57:40 +08:00 via Android   ❤️ 1
    做好了告诉我地址,我批量下单,希望能耗尽你们的订单号。给你们产品一个教训
    lpts007
        6
    lpts007  
       2020-06-04 21:59:29 +08:00 via Android
    谁叫他们天天提这种需求折磨开发。不能惯着他们
    HolmLoh
        7
    HolmLoh  
    OP
       2020-06-04 22:43:32 +08:00
    @zxyroy #2
    大概几千万是有的,不过好像 bloomfilter 依旧不会有太大问题,我明天试试
    xuanbg
        8
    xuanbg  
       2020-06-04 22:46:13 +08:00   ❤️ 1
    这种需求无脑布隆过滤器
    HolmLoh
        9
    HolmLoh  
    OP
       2020-06-04 22:49:49 +08:00
    @lpts007 #5
    等我以后跑了再告诉你,我还不想做人肉运维
    ericls
        10
    ericls  
       2020-06-04 23:35:25 +08:00   ❤️ 1
    这个并发有多大 db 不能满足需求?
    opengps
        11
    opengps  
       2020-06-05 01:48:31 +08:00 via Android   ❤️ 1
    这种高并发需要考虑下幂等性接口设计,让请求针对同一请求的 requestid 做相同返回处理,后台只执行一次
    jorneyr
        12
    jorneyr  
       2020-06-05 06:57:57 +08:00   ❤️ 3
    几千万订单的系统你跑这来问方案?这样规模的公司竟然没有超级高手坐镇,有点不科学啊!
    tomczhen
        13
    tomczhen  
       2020-06-05 07:59:28 +08:00 via Android   ❤️ 10
    需求调研:我们业务量很大,高并发,大数据,分布式架构,高可用都要搞起来。
    开发排期:敏捷开发,快速迭代,能用就行,后面再改。
    部署上线:当前业务数据没那么大,先用一台服务器部署,节省成本。
    yiyi11
        14
    yiyi11  
       2020-06-05 08:39:20 +08:00 via Android
    @tomczhen 反向架构演进。
    HolmLoh
        15
    HolmLoh  
    OP
       2020-06-05 09:05:36 +08:00 via iPhone
    @ericls
    就以我们目前的 db 是顶不住的,他们要求起码能达到上万...
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   793 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 22:00 · PVG 06:00 · LAX 15:00 · JFK 18:00
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.