Saya pada awalnya membangun sistem pemberitahuan gaya Facebook untuk halaman kami (tipe game sosial) dan saya sekarang sedang meneliti apa yang akan menjadi cara terbaik untuk merancang sistem seperti itu. Saya tidak tertarik tentang cara mendorong pemberitahuan ke pengguna atau hal-hal seperti itu (untuk saat ini bahkan). Saya sedang meneliti bagaimana membangun sistem di server (cara menyimpan notifikasi, tempat menyimpannya, cara mengambilnya, dll ...).
Jadi ... beberapa persyaratan yang kami miliki:
- pada waktu puncak, kami memiliki sekitar 1 r pengguna yang masuk secara bersamaan (dan lebih banyak tamu, tetapi mereka tidak penting di sini karena mereka tidak akan memiliki pemberitahuan) yang akan menghasilkan banyak acara
- akan ada berbagai jenis notifikasi (pengguna A telah menambahkan Anda sebagai teman, pengguna B telah mengomentari profil Anda, pengguna C menyukai gambar Anda, pengguna D telah mengalahkan Anda di game X, ...)
- sebagian besar acara akan menghasilkan 1 pemberitahuan untuk 1 pengguna (pengguna X menyukai gambar Anda), tetapi akan ada kasus di mana satu acara akan menghasilkan banyak pemberitahuan (misalnya, ulang tahun pengguna Y)
- pemberitahuan harus dikelompokkan bersama; jika misalnya empat pengguna berbeda menyukai beberapa gambar, pemilik gambar tersebut harus mendapatkan satu pemberitahuan yang menyatakan bahwa empat pengguna menyukai gambar dan bukan empat pemberitahuan terpisah (seperti halnya FB)
OK jadi yang saya pikirkan adalah saya harus membuat semacam antrian di mana saya akan menyimpan acara ketika itu terjadi. Lalu saya akan memiliki pekerjaan latar belakang ( tukang gigi ?) Yang akan melihat antrian itu dan menghasilkan pemberitahuan berdasarkan peristiwa-peristiwa itu. Pekerjaan ini kemudian akan menyimpan notifikasi dalam database untuk setiap pengguna (jadi jika suatu peristiwa memengaruhi 10 pengguna, akan ada 10 notifikasi terpisah). Kemudian ketika pengguna akan membuka halaman dengan daftar notifikasi saya akan membaca semua notifikasi untuknya (kami berpikir untuk membatasi ini hingga 100 notifikasi terbaru) dan mengelompokkannya bersama dan akhirnya menampilkannya.
Hal yang saya khawatirkan dengan pendekatan ini:
- kompleks sekali :)
- adalah basis data penyimpanan terbaik di sini (kami menggunakan MySQL) atau haruskah saya menggunakan sesuatu yang lain (redis sepertinya cocok juga)
- apa yang harus saya simpan sebagai pemberitahuan? ID pengguna, ID pengguna yang memprakarsai acara, jenis acara (sehingga saya dapat mengelompokkannya dan menampilkan teks yang sesuai) tetapi kemudian saya agak tidak tahu cara menyimpan data notifikasi yang sebenarnya (misalnya URL & judul gambar yang disukai). Haruskah saya "memanggang" info itu ketika saya menghasilkan pemberitahuan, atau haruskah saya menyimpan ID catatan (gambar, profil, ...) yang terpengaruh dan menarik info keluar dari DB saat menampilkan pemberitahuan.
- kinerja harusnya OK di sini, bahkan jika saya harus memproses 100 notifikasi secara langsung saat menampilkan halaman notifikasi
- kemungkinan masalah kinerja pada setiap permintaan karena saya harus menampilkan jumlah pemberitahuan yang belum dibaca kepada pengguna (yang bisa menjadi masalah tersendiri karena saya akan mengelompokkan pemberitahuan bersama). Ini bisa dihindari meskipun jika saya membuat tampilan pemberitahuan (di mana mereka dikelompokkan) di latar belakang dan tidak on-the-fly
Jadi apa yang Anda pikirkan tentang solusi yang saya usulkan dan kekhawatiran saya? Berikan komentar jika Anda pikir saya harus menyebutkan hal lain yang relevan di sini.
Oh, kami menggunakan PHP untuk halaman kami, tapi itu seharusnya tidak menjadi faktor besar di sini.