作者rum579 (Simon)
看板Soft_Job
标题如何设计一个以秒计费且不会被用户逃漏的方法?
时间Sun May 17 19:49:39 2020
讨论不限平台,但为了方便说明以下以 Android 为例。
假设有个服务,例如通话、影片等等,每秒钟要收取 n 元代币,若用户代币不足则立即结束服务。
方案ㄧ:
每秒向 Server 发起 Http 请求进行扣费。
缺点:
请求数可能过多,Server 负载过重。
方案二:
Client 纪录开始时间,当用户代币不足或主动结束服务时,计算开始时间与结束时间差再回报给 Server。
缺点:
若用户主动断网并清除 APP 资料再重新登入,Client 之前纪录的时间会不见导致无法得知用户到底使用多久。
请问有没有方法可以纪录用户使用秒数并确实回报给 Server?
-----
Sent from JPTT on my Google Pixel 3.
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 42.73.187.157 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Soft_Job/M.1589716181.A.8EF.html
1F:→ moom50302: 服务开始前先去伺服器取余额计算秒数,在介面执行到这 05/17 20:06
2F:→ moom50302: 个秒数就强制结束,这样如何? 05/17 20:06
3F:→ moom50302: 是说,跟钱有关的事情怎样都不会在客户端处理吧?很不 05/17 20:07
4F:→ moom50302: 保险 05/17 20:07
如果秒数还没到之前用户故意断网 + 清除资料
这样 Server 端只有开始时间没有结束时间,
下次开启服务可能是好几小时或明天,不能以这个时间去扣费
5F:→ x000032001: 开个ws记连线断线 05/17 20:09
6F:→ BZnoo: 起迄点都在Server端提供多久的上行服务决定,跟客户端无关 05/17 20:10
7F:→ Nonsense8: 服务以秒计费,所以服务在取用的时候就要扣了不是吗? 05/17 20:12
8F:→ Nonsense8: ? 05/17 20:12
服务可能是点对点的通话,顶多在开始前通知 Server,
但是结束时间就没办法保证可以传递给 Server,因为可能被故意断网 + 清除资料
9F:→ Nonsense8: 虽然没用过,但服务应该也是从server端分发的吧 05/17 20:13
10F:→ MOONY135: 开ws然後每秒ping pong吧 05/17 20:14
11F:→ tsao1211: Websocket 05/17 20:15
12F:→ MOONY135: 方案二根本不会有问题啊 服务开始的时候用户id就被记录 05/17 20:16
13F:→ MOONY135: 了 就算他清 她下次登入还是要用那个id 然後资料都在 05/17 20:17
14F:→ MOONY135: server上面吧 05/17 20:17
Server 端只有开始时间,结束时间没办法保证可以传递到 Server
※ 编辑: rum579 (123.0.61.194 台湾), 05/17/2020 21:19:29
※ 编辑: rum579 (123.0.61.194 台湾), 05/17/2020 21:20:25
15F:→ yourinfo: server决定一切 client只能被动来问还能不能连 05/17 21:23
16F:→ MOONY135: ws ping pong server不就知道那时候短线? 05/17 21:31
WS 考虑方案
17F:→ yourinfo: 基本上client连线问一次server就够了 剩下的自己思考... 05/17 21:33
※ 编辑: rum579 (123.0.61.194 台湾), 05/17/2020 21:33:38
18F:→ MOONY135: 一开始先给十秒 然後client 放个timer 时间内没有接到se 05/17 21:40
19F:→ MOONY135: rver来讯,client就结束应用。心跳包应用。就算被逃也只05/17 21:40
20F:→ MOONY135: 有损失十秒05/17 21:40
21F:→ AndCycle: 还有,这样看来你的client有两方,两方都去做啊05/17 21:43
双方都做是目前的做法,希望可以再讨论其他方案,毕竟双方都断网清除资料也是有可能
※ 编辑: rum579 (42.73.187.157 台湾), 05/17/2020 21:51:22
22F:→ invidia: 会断网清资料的先解约这个客户吧 05/17 22:17
23F:推 s06yji3: 以普通浏览器来讲断网清资料还满常见的。我都习惯定期清c 05/17 22:22
24F:→ s06yji3: ache 05/17 22:22
25F:推 abelyang: 提高清除後重新下载成本,WS/WSS,服务网格化 05/17 22:43
26F:推 ckp4131025: 通话结束的时候两个clinet 都发通知给server阿? 05/17 22:47
27F:→ ckp4131025: 两个都主动断网会有时间差的 05/17 22:48
28F:推 roccqqck: 游戏? 05/17 22:58
29F:推 Masakiad: 不是server socket send资料时检验就好了吗 05/17 23:18
30F:→ lylu: 只有我觉得都让client直接互连了还要以秒计费有点坑吗XD 05/17 23:28
31F:推 OppOops: 方案二, 每n分钟验证一次, 结束时再传一次 05/17 23:47
32F:→ OppOops: 另外 server 也可不定期的抽检 05/17 23:48
33F:推 new122851: websocket 05/18 00:22
34F:→ Nonsense8: 如果不是server持续分发的服务,那我觉得要考虑别种收 05/18 01:21
35F:→ Nonsense8: 费方式了... 05/18 01:21
36F:→ Nonsense8: 把收费计算放在client真的很诡异 05/18 01:26
37F:→ longlongint: 把通话内容录下来就知道几秒了(误 05/18 01:40
38F:→ longlongint: 影片你不会学动画疯吗 05/18 01:42
39F:推 umum29: 放client的计算只能是辅助 就像身分验证也是主客端都要做 05/18 04:27
40F:→ umum29: WebSocket+1 05/18 04:27
41F:→ umum29: 永远不要"直接"相信client端来的资料 05/18 04:38
42F:→ TakiDog: ws 05/18 11:45
43F:推 moon2519: ws 05/18 12:09
44F:推 somefatguy: 30楼XD,跟我想的一样 05/18 13:28
45F:→ Sieg2010: 如果都不连server, 为什麽要以秒计费 05/18 13:31
46F:→ AndCycle: 如果双方都会断网清资料大概就不会用你这套软体通信啦.. 05/18 14:44
47F:→ Ghamu: 你应该找个简单的做 偏激使用者不要太认真 只要有8成脑残无 05/19 02:53
48F:→ Ghamu: 法破解即可 等到破解的人越来越多 你也捞到一笔钱了 在想怎 05/19 02:53
49F:→ Ghamu: 麽改即可 05/19 02:53
50F:→ bndan: 想了一圈 = = 推楼上.."更"万全的对策对应增加的成本 是否 05/19 13:52
51F:→ bndan: 有其价值... 05/19 13:53
52F:→ xeonchen: client 每次和 server 要个五分钟 credit,多退少补 05/20 06:04
53F:→ xeonchen: 这样只要每五分钟和 server 连一次,可以吗? 05/20 06:05
54F:→ xeonchen: 如果使用者清除资料,就等於直接丢掉剩余的 credit 05/20 06:06
55F:推 Jichang: 楼上想的跟我一样 不是少补 应该说是要client要预缴下一 05/20 19:33
56F:→ Jichang: 个周期的费用 如果资料没清 有机会退回 多缴的部分 05/20 19:33