如何设计一个程序员都不知道执行时机的定时计划?

2019-03-29 13:52:33 +08:00
 kidteaing

最近有一个这样的需求,想和大家探讨一下。 需求:有一笔资金进入系统时,即为该笔资金创建一个 30 天内随机时间点的定时购买计划。 但要求在代码中和数据库中,所有开发都无法知晓具体的时间点,只知道在某个时间段会随机执行一次计划。 执行后,计划即完成。 这样的计划同一天大概有几百个到几千条在等待被执行中。

方案 1.加密数据库,但开发一定会获得数据库权限 结论:不可行

方案 2.把创建的时间点用私钥加密存在数据库中,但由于开发一定会获得的私钥 结论:不可行

方案 3.把创建的时间点在内存中常驻,但性能不知道会不会受影响,且服务器重启,似乎只能重新安排一次计划…

求各位指教

3391 次点击
所在节点    程序员
35 条回复
reus
2019-03-29 16:37:02 +08:00
为什么要记录?生成随机数,落到某个范围就触发,这样也没有任何人可以确定,不需要记录。
kidteaing
2019-03-29 16:50:19 +08:00
@geelaw @sznewbee096 目前被概率论的反直觉绕住了 目前两种算法 一种是每过一小时 分母减 1,一种是每小时都是 1/720,如果没有执行,则在最后一个小时执行购买 确保没有漏买
用第一种方法似乎会有越到后面 跟买赢率越大的感觉 虽然第一种算法比例是一样的 但会引入了“你知道前面的部分没有成功执行”的因素
kidteaing
2019-03-29 16:51:39 +08:00
@reus 因为这个计划在时间区间内是一定要被执行的 生成随机数落到范围内触发 似乎不太可行
kidteaing
2019-03-29 16:52:55 +08:00
@jinhan13789991 有才 但你只是了一个随机数发生器 还是得记录下来判断什么时候应该执行[滑稽]
ThirdFlame
2019-03-29 16:57:22 +08:00
入库时产生一个 0-720 之间的随机数,保存。 然后每小时对每个任务生成 0-720 之间的随机数,如果和入库的随机数相等,则执行。
如果到了最后一个小时,还没有执行,则最后一个小时执行。

非要说这个有问题的话,那么确实有 1/720 的任务 ,会在倒数第二个小时后知道 将在最后一个小时内执行。这个是没有办法的。 你要求必须在 30 天内完成。
sznewbee096
2019-03-29 17:09:46 +08:00
@kidteaing 定时购买的任务也必须是不可见的吗?
tomczhen
2019-03-29 17:27:54 +08:00
去看看 DND 的桌游找下灵感就行了。

需要检定事件结果时,双方投骰子,加上各自修正值。所有机制、规则都是公开透明的,但检定结果只有投出骰子之后才能知道。
limuyan44
2019-03-29 17:47:47 +08:00
每天定时把 n 天内的随机抽取一部分购买不就好了。只要保证最终把 30 天内数据都跑完就好了啊。不就是不想让开发知道购买时间吗。。或者把每天任务的时间也随机了。需求是不可知又不是必须做到随机事件。
yidinghe
2019-03-29 17:53:12 +08:00
既然任何人都不能知道具体的执行时间,那就不要预先定下来了,每分钟取一次随机数,满足条件就执行。
yidinghe
2019-03-29 17:54:20 +08:00
几率是可以递增的,越接近期末几率越高,这样保证时间段内一定会执行。
conn4575
2019-03-29 19:28:21 +08:00
感觉不让任何人知道是不可能的,特别涉及资金变动,我不信你们不打 log …
no1xsyzy
2019-03-29 19:36:41 +08:00
@jinhan13789991 不行,三者的熵部分取自同一部分信息。
@ThirdFlame 你这也被概率论绕住了。
no1xsyzy
2019-03-29 19:37:57 +08:00
其实就是《编程珠玑》第 12 章 第 12.5 节 问题 第 10 问
把它反过来做,并且你恰好知道 n 而已。
test0x01
2019-03-30 09:47:38 +08:00
多简单呐。弄个随机定时器没过几分钟起来随机抽取并执行点任务。
EscYezi
2019-03-30 16:38:39 +08:00
好奇一下为什么会有这种需求......

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

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

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

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

© 2021 V2EX