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

2020-06-04 21:39:24 +08:00
 HolmLoh

需求如下

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

举个例子

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

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

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

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

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

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

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

bloomfilter 查出来发现重复了,因为可能是假阳性,看业务需要,可以再去 db 里验证一遍.
lpts007
2020-06-04 21:57:40 +08:00
做好了告诉我地址,我批量下单,希望能耗尽你们的订单号。给你们产品一个教训
lpts007
2020-06-04 21:59:29 +08:00
谁叫他们天天提这种需求折磨开发。不能惯着他们
HolmLoh
2020-06-04 22:43:32 +08:00
@zxyroy #2
大概几千万是有的,不过好像 bloomfilter 依旧不会有太大问题,我明天试试
xuanbg
2020-06-04 22:46:13 +08:00
这种需求无脑布隆过滤器
HolmLoh
2020-06-04 22:49:49 +08:00
@lpts007 #5
等我以后跑了再告诉你,我还不想做人肉运维
ericls
2020-06-04 23:35:25 +08:00
这个并发有多大 db 不能满足需求?
opengps
2020-06-05 01:48:31 +08:00
这种高并发需要考虑下幂等性接口设计,让请求针对同一请求的 requestid 做相同返回处理,后台只执行一次
jorneyr
2020-06-05 06:57:57 +08:00
几千万订单的系统你跑这来问方案?这样规模的公司竟然没有超级高手坐镇,有点不科学啊!
tomczhen
2020-06-05 07:59:28 +08:00
需求调研:我们业务量很大,高并发,大数据,分布式架构,高可用都要搞起来。
开发排期:敏捷开发,快速迭代,能用就行,后面再改。
部署上线:当前业务数据没那么大,先用一台服务器部署,节省成本。
yiyi11
2020-06-05 08:39:20 +08:00
@tomczhen 反向架构演进。
HolmLoh
2020-06-05 09:05:36 +08:00
@ericls
就以我们目前的 db 是顶不住的,他们要求起码能达到上万...

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/678732

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX