Saya menggunakan Redis , NGINX &PHP-FPM untuk proyek obrolan saya. Tidak super elegan, tetapi berhasil. Ada beberapa potongan teka-teki.
-
Ada skrip PHP yang sangat sederhana yang menerima perintah klien dan menempatkannya dalam satu DAFTAR besar. Itu juga memeriksa semua DAFTAR ruangan dan DAFTAR pribadi pengguna untuk melihat apakah ada pesan yang harus disampaikannya. Ini disurvei oleh klien yang ditulis dalam jQuery &dilakukan setiap beberapa detik.
-
Ada skrip PHP baris perintah yang mengoperasikan sisi server dalam loop tak terbatas, 20 kali per detik, yang memeriksa daftar ini dan kemudian memproses perintah ini. Skrip menangani siapa yang ada di ruang apa dan izin di memori skrip, info ini tidak disimpan di Redis.
-
Redis memiliki DAFTAR untuk setiap kamar &DAFTAR untuk setiap pengguna yang beroperasi sebagai antrian pribadi. Ini juga memiliki beberapa penghitung untuk setiap ruang tempat pengguna berada. Jika penghitung pengguna kurang dari total pesan di ruang, maka ia mendapat perbedaan dan mengirimkannya ke pengguna.
Saya belum bisa menguji solusi ini, tetapi setidaknya dari pembandingan dasar saya mungkin bisa menangani ribuan pesan per detik. Ada juga peluang untuk mentransfer ini ke sesuatu seperti Node.js untuk meningkatkan kinerja. Redis juga semakin matang dan memiliki beberapa fitur menarik seperti perintah Pub/Subscribe, yang mungkin menarik, yang mungkin akan menghapus polling di sisi server.
Saya mencari solusi berbasis Comet, tetapi banyak di antaranya rumit, tidak terdokumentasi dengan baik, atau mengharuskan saya mempelajari bahasa yang sama sekali baru (mis. Jetty->Java, APE->C), dll... Juga pengiriman dan melalui proxy terkadang dapat menjadi masalah dengan Komet. Jadi itulah mengapa saya terjebak dengan polling.
Saya membayangkan Anda bisa melakukan sesuatu yang mirip dengan MongoDB. Koleksi per kamar, koleksi per pengguna &kemudian koleksi yang mengelola penghitung. Anda masih perlu menulis daemon atau skrip back-end untuk menangani pengaturan ke mana pesan-pesan ini pergi. Anda juga dapat menggunakan "koleksi terbatas" MongoDB, yang membuat dokumen tetap diurutkan &juga secara otomatis menghapus pesan lama, tetapi itu bisa rumit dalam mempertahankan penghitung yang tepat.