我司的面试题目公开诚聘 Java 工程师入坑

2019-05-24 12:17:34 +08:00
 jiansihun
在抽奖场景中,最高峰值为 2w QPS,运营部现有 20000 部 iPhone 手机,决定每 100 人随机抽中一台,覆盖人数 200w 人,送完即止。请如何技术上如何实现该机制。

如有能回答上述问题的 Java 工程师请考虑一下我司广州工作: https://www.lagou.com/gongsi/j29385.html,或者站内私我简历。
5708 次点击
所在节点    酷工作
33 条回复
c4f36e5766583218
2019-05-24 18:13:34 +08:00
我看成要送手机,结果只是个题目。
petelin
2019-05-24 20:15:49 +08:00
这个题我觉得没描述好 应该改成需要用户实时看到结果
要不然做成批次(够 100 人开一次奖)或者 200w 人都参与完在开奖就太简单(技术上太简单了 我会认为这公司很水)

@woahishui 每秒就 10 个人抽奖.难道让他们等 10 秒才知道中没中?
@NewDraw 200w QPS 过来 服务端延迟多少? 分布式机器怎么从队列取数据决定谁中奖?
@CRVV 这个思路不错 不过为什么要路由到同一台机器?那台机器挂了呢 扩容了呢? 抽奖结束直接记录信息是不是更好 还有这个算法太简单了 可能抽不到 200w 所以要参考微信红包算法
murmur
2019-05-24 20:19:15 +08:00
如果是微博抽奖,就丢弃掉所有请求,反正这种东西一定是虚假抽奖
577322753
2019-05-24 20:25:55 +08:00
开个线程,一直阻塞到够 200 万人,不够就 sleep 一会,然后把这两百万人存到 list 里,存够了遍历 list,i %100==0,那 i 这个 b 就中奖了,让我们恭喜这 20000 个 b。贵公司缺 cto 吗?😬
largecat
2019-05-24 22:54:51 +08:00
上面答内定的同学你可以发简历过去了,
woahishui
2019-05-24 23:28:59 +08:00
@petelin 我后面的回复是从活动的角度想的,并非从技术,如果活动很快就结束了,感觉活动效果可能打折比较多,如果搞成彩票类型的感觉时间长,用户关注度高,更适合推广
wpzero
2019-05-25 09:04:56 +08:00
其实我感觉就只需要事先生成获奖的 2 万列表存在 redis 的 set 好了,每一个 request 的电话号产生一个 unique key,用 redis 来检测是否已经抽过,incr pk,然后得到的值是否在 set 中,在就中奖了。redis 这些操作应该都是 10 万每秒级别,如果你认为还不够 OK,多个 redis,用电话号 hash mod 来 map.至于服务器这种没有 rds 的操作用 nodejs golang java 几台服务器撑一下都可以。消息队列来解题也很合适。
lychnis
2019-05-25 09:49:28 +08:00
要什么自行车,蓄水池算法。

其实楼主在筛选你们会不会算法和数据结构
Kylinsun
2019-05-25 10:29:40 +08:00
CRVV
2019-05-25 11:45:45 +08:00
@petelin

> 为什么要路由到同一台机器?

如果同一个用户的请求会被路由到不同的机器上,就需要一个中心的数据库来记录哪些用户发过请求,这个数据库会成为瓶颈

> 那台机器挂了呢 扩容了呢?

这里的点是按照用户的 id 来分请求,减少后面每一台机器上的负担
后面的“一台机器”可以不是一台机器,你改成若干台机器加 Redis, 是一样的
这个若干台机器加 Redis 的东西可以继续扩容,但是 load balancer 上的后端不能增加
另外楼主给定了请求数量的上限,在这个题目的范围里不需要考虑扩容

> 还有这个算法太简单了 可能抽不到 200w

能抽到多少数字和算法简不简单没有关系
如果你觉得不行,请直接指出来哪里有问题
larve
2019-05-26 20:34:15 +08:00
1. 库存控制:防止超发
redis 自减或者 redis 队列出栈都能做到
2. 随机用户
200w 用户随机:若是同一场抽奖,有两百万个用户参与,可 redis 通过一个 key 自增,每自增 100 则对应用户是抽中的,抽中的用户再进入后续入库操作即可,最高时 2w redis QPS 应该是可以的,真正能入库的数据也不多
zc1249274251
2019-05-27 09:29:35 +08:00
1、限流
2、利用 redis 做自增或者自减操作 提交请求到队列
3、创建有界队列,如果队列满了,直接拒收请求
4、让队列里边的请求 mysql 来做最终一致性
jiansihun
2019-05-27 09:43:54 +08:00
@petelin 考虑一下我司的的位置不。#这个题我觉得没描述好 应该改成需要用户实时看到结果# 这个问题要看到最高峰值 2w QPS,也就是 QPS 是 0 - 2w,另外要注意随机字眼,以及仅有的 2k 部手机,方案并不一定都可以实时(我有可能也不对),确实需要从用户端体验开始考虑的起。当然大力出奇迹的答复在上面的答案已经有了。

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

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

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

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

© 2021 V2EX