作者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/m.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