ฉันกำลังทำโปรเจ็กต์ที่ให้ผู้ใช้สามารถสนทนากับผู้เชี่ยวชาญในห้องแชทส่วนตัวได้ ผู้ใช้ซื้อเครดิตเพื่อแชทกับผู้เชี่ยวชาญ และจะถูกเรียกเก็บเงินเมื่อสิ้นสุดเซสชันแชททุกครั้งตามนาทีที่พวกเขาได้พูดคุย ผู้เชี่ยวชาญแต่ละคนมีอัตราเครดิตที่แตกต่างกันสำหรับทุกนาทีของการสนทนา
ตัวจับเวลาจะเริ่มนับเมื่อเริ่มเซสชันการแชท และผู้ใช้จะได้รับการแจ้งเตือนเป็นระยะๆ เกี่ยวกับเวลาทั้งหมดที่พวกเขาใช้ในห้องสนทนาและเครดิตรวมปัจจุบันของเซสชันการแชทปัจจุบัน การคำนวณเหล่านี้ต้องทำบนฝั่งเซิร์ฟเวอร์และบันทึกไว้ในฐานข้อมูล เซสชันการแชท Btw สามารถหยุดชั่วคราว / ดำเนินการต่อโดยผู้เชี่ยวชาญ
นี่เป็นสถานการณ์ง่ายๆ...
ผู้ใช้ปัจจุบันมี: 10 เครดิต
"ผู้เชี่ยวชาญ A" ต้องการ 2 เครดิต / ต่อนาที
CurrentTime Event Timer Credit
- 10:40 เซสชันสนทนาเริ่มต้น 00:01 นาที 2เครดิต
- 10:41 พวกเขากำลังคุยกัน 00:02 นาที 4เครดิต
- 10:42 ผู้เชี่ยวชาญเรื่องไม่ได้ใช้งาน 00:02 นาที 4เครดิต (แชทหยุดชั่วคราว)
- 10:45 ผู้เชี่ยวชาญออนไลน์ 00:02 นาที 4เครดิต (สนทนาต่อ)
- 10:46 พวกเขากำลังคุยกัน 00:03 นาที 6เครดิต
- 10:46 ลูกค้าสิ้นสุดเซสชัน 00:04 นาที 8เครดิต
ลูกค้าจะถูกเรียกเก็บเงินจำนวน 8 เครดิต เขามีเครดิตเหลืออยู่ 2 หน่วยกิต
เซสชันการแชทจะถูกเรียกเก็บเงินเมื่อเริ่มต้นนาทีใหม่ การคำนวณจะคำนวณตามนาที และจะละเว้นวินาที
คำถามของฉันคือจะคำนวณทางฝั่งเซิร์ฟเวอร์ได้อย่างไรสำหรับทุกเซสชันการสนทนาที่กำลังพูดคุยอยู่ในวิธีที่เหมาะสม?
แนวทางปัจจุบันของฉันคือ
ตัวจับเวลาฝั่งเซิร์ฟเวอร์จะติ๊กทุกๆ 15 วินาที รับการสนทนาเซสชันปัจจุบัน
สำหรับทุกเซสชันการแชท : หากเซสชันแชทไม่ถูกหยุดชั่วคราว ให้เพิ่ม 15 วินาทีให้กับช่วงเวลาของเซสชัน จากนั้นคำนวณเครดิตรวมของเซสชันปัจจุบัน หากผู้ใช้กำลังจะหมดเครดิต ให้แจ้งให้เขาทราบ หากเขาเรียกใช้แล้ว เครดิตหมด จากนั้นจึงสิ้นสุดเซสชันการแชทปัจจุบัน บันทึกธุรกรรมเหล่านี้ลงในฐานข้อมูล อัปเดตไคลเอ็นต์เซสชันการแชท
แต่มีข้อผิดพลาดบางประการในแนวทางนี้ ตัวอย่างเช่น หากเซสชันการแชทเริ่มต้นในขณะนี้และตัวจับเวลาทำเครื่องหมายใน 2 วินาที จากนั้นจะเพิ่ม 15 วินาทีจากระยะเวลารวมของเซสชันการแชทปัจจุบัน ดังนั้นจึงคำนวณผิด ถ้าฉันลดช่วงเวลาติ๊กของตัวจับเวลา อาจมีการสนทนาปัจจุบัน 500 เซสชัน และช่วงเวลาติ๊กของตัวจับเวลาจะไม่เพียงพอที่จะคำนวณเครดิตของเซสชันแชททุกครั้งใน 10 วินาที เป็นต้น
มีวิธีที่ดีกว่าในการจัดการเรื่องนี้หรือไม่? ยินดีรับข้อเสนอแนะทั้งหมด
อย่างไรก็ตาม ฉันใช้ Asp.net MVC4 C# และ Signalr เพื่อจัดการแชทแบบเรียลไทม์
ขอบคุณล่วงหน้า.