Saya sedang mengerjakan proyek yang menyediakan pengguna untuk mengobrol dengan para ahli di ruang obrolan pribadi. Pengguna membeli kredit untuk mengobrol dengan para ahli dan mereka akan dikenakan biaya di akhir setiap sesi obrolan berdasarkan menit mereka berbicara. Setiap pakar memiliki tingkat kredit yang berbeda untuk setiap menit obrolan.
Pengatur waktu mulai menghitung pada awal sesi obrolan dan pengguna diberi tahu secara berkala tentang total waktu yang mereka habiskan di ruang obrolan dan total kredit saat ini dari sesi obrolan saat ini. Perhitungan ini harus dilakukan di sisi server dan disimpan di database. Btw sesi chat bisa dijeda/dilanjutkan oleh ahlinya.
Ini adalah skenario sederhana...
Pengguna saat ini memiliki: 10 Kredit
"Pakar A" meminta 2 kredit / per menit
CurrentTime Event Timer Credit
- 10:40 Sesi Obrolan Dimulai 00:01 mnt 2kredit
- 10:41 Mereka mengobrol 00:02 menit 4kredit
- 10:42 Pakar saat menganggur 00:02 menit 4kredit (Obrolan dijeda)
- 10:45 Pakar menjadi online 00:02 menit 4kredit (Obrolan dilanjutkan)
- 10:46 Mereka mengobrol 00:03 menit 6kredit
- 10:46 Klien mengakhiri sesi 00:04 menit 8kredit
Klien akan dikenakan biaya sebesar 8 SKS. Dia memiliki sisa 2 SKS.
Sesi Obrolan akan dikenakan biaya di awal menit baru, penghitungan akan dilakukan berdasarkan menit, detik akan dihilangkan.
Pertanyaan saya adalah bagaimana membuat perhitungan ini di sisi server untuk setiap sesi obrolan yang sedang dibicarakan dengan cara yang benar?
Pendekatan saya saat ini adalah;
Pengatur waktu sisi server menyala setiap 15 detik, membuat sesi obrolan saat ini dibicarakan,
Untuk setiap sesi obrolan: jika sesi obrolan tidak dijeda, tambahkan 15 detik ke rentang waktu sesi, lalu hitung total kredit sesi saat ini, jika pengguna hampir kehabisan kredit, beri tahu dia, jika dia sudah menjalankan kehabisan kredit, lalu akhiri sesi obrolan saat ini. Simpan transaksi ini ke database. Perbarui klien sesi obrolan.
Namun ada beberapa kendala dalam pendekatan ini. Misalnya, jika sesi obrolan dimulai sekarang dan pengatur waktu terus berjalan 2 detik, maka total rentang waktu sesi obrolan saat ini akan bertambah 15 detik sehingga terjadi kesalahan perhitungan. Jika saya mengurangi interval centang pengatur waktu, maka mungkin ada 500 sesi obrolan yang sedang dibicarakan, dan interval centang pengatur waktu tidak akan cukup untuk menghitung setiap kredit sesi obrolan dalam 10 detik misalnya.
Apakah ada cara yang lebih baik untuk menangani ini? Semua saran dipersilakan.
Omong-omong, saya menggunakan Asp.net MVC4 C# dan Signalr untuk menangani obrolan waktu nyata.
Terima kasih sebelumnya.