需求如下
举个例子
秒杀活动开始,用户下单购买商品,然后创建订单号发送到交易系统中,但是订单号并不是由系统生成的,而是由用户自己输入的(虽然这个需求很奇怪,但是就假设他一定要这么做吧),成功下单后会有下单记录,所以需要即时响应给用户告知其是否下单成功
需求 1+3,直接往 redis 里面丢,持久化就丢进队列让他慢慢写 db,不管唯一了,梭哈!但是行为队列程序是后期再进行持久化,这样就无法甄别数据唯一这个奇怪的需求了
需求 2+3,直接往 db 里面丢就完了,梭哈!但是此场景是会出现高并发的情况,db 的处理能力无法满足到需求 1 。
需求 2+1,我想到的是用 redis 等缓存服务,把所有交易的订单号塞进去,这样就能高效地实现判断数据是否唯一了。但是内存比较昂贵,订单长年累月下了数据量巨大,可能满足不了需求 3 ?
想请教一下有没有解决方案,难道是 redis 机器堆起来梭哈?
1
makdon 2020-06-04 21:46:57 +08:00 1
感觉好像用布隆过滤器可以搞定?
|
2
zxyroy 2020-06-04 21:49:11 +08:00 1
不知道数据有多大,不知道 bloomfilter 可行吗?
|
3
jugelizi 2020-06-04 21:52:46 +08:00 via iPhone 1
布隆过滤可以判断 key 肯定不存在
缺点就是可能实际上没有单号 却返回已存在 |
4
huntcool001 2020-06-04 21:54:01 +08:00 1
用 Redis 的 Bloomfilter 就行了, 自建的话,Redis 有免费的 Bloomfilter module 可以载入. 阿里云的我记得也有.
如果不想弄插件的话,用 Redisson 客户端,里面也有基于 redis 的 bloomfilter. bloomfilter 查出来发现重复了,因为可能是假阳性,看业务需要,可以再去 db 里验证一遍. |
5
lpts007 2020-06-04 21:57:40 +08:00 via Android 1
做好了告诉我地址,我批量下单,希望能耗尽你们的订单号。给你们产品一个教训
|
6
lpts007 2020-06-04 21:59:29 +08:00 via Android
谁叫他们天天提这种需求折磨开发。不能惯着他们
|
8
xuanbg 2020-06-04 22:46:13 +08:00 1
这种需求无脑布隆过滤器
|
10
ericls 2020-06-04 23:35:25 +08:00 1
这个并发有多大 db 不能满足需求?
|
11
opengps 2020-06-05 01:48:31 +08:00 via Android 1
这种高并发需要考虑下幂等性接口设计,让请求针对同一请求的 requestid 做相同返回处理,后台只执行一次
|
12
jorneyr 2020-06-05 06:57:57 +08:00 3
几千万订单的系统你跑这来问方案?这样规模的公司竟然没有超级高手坐镇,有点不科学啊!
|
13
tomczhen 2020-06-05 07:59:28 +08:00 via Android 10
需求调研:我们业务量很大,高并发,大数据,分布式架构,高可用都要搞起来。
开发排期:敏捷开发,快速迭代,能用就行,后面再改。 部署上线:当前业务数据没那么大,先用一台服务器部署,节省成本。 |