Sayfamız için bir Facebook tarzı bildirim sistemi oluşturmaya başlıyorum (sosyal oyun türü) ve şimdi böyle bir sistemi tasarlamanın en iyi yolunun ne olacağını araştırıyorum. Kullanıcıya veya bunun gibi bir şeye bildirimlerin nasıl gönderileceği ile ilgilenmiyorum (şimdilik). Sistemi sunucuda nasıl oluşturacağımı araştırıyorum (bildirimleri nasıl saklayacağımı, nerede saklayacağımı, nasıl getireceğimizi vb.).
Yani ... sahip olduğumuz bazı gereksinimler:
- en yoğun zamanlarda yaklaşık 1 bin eşzamanlı giriş yapan kullanıcımız var (ve daha birçok misafir var, ancak bildirimde bulunmayacakları için burada önemli değiller)
- farklı bildirim türleri olacaktır (A kullanıcısı sizi arkadaş olarak ekledi, B kullanıcısı profilinize yorum yaptı, C kullanıcısı resminizi beğendi, D kullanıcısı X oyununda sizi dövdü ...)
- çoğu etkinlik 1 kullanıcı için 1 bildirim oluşturur (X kullanıcısı resminizi beğendi), ancak bir etkinliğin çok sayıda bildirim üreteceği durumlar olacaktır (örneğin, kullanıcının Y'nin doğum günüdür)
- bildirimler birlikte gruplandırılmalıdır; örneğin, bir görüntüyü beğenen dört farklı kullanıcı varsa, bu görüntünün sahibi dört kullanıcının değil, dört kullanıcının görüntüyü sevdiğini belirten bir bildirim almalıdır (tıpkı FB'nin yaptığı gibi)
Tamam, düşündüğüm şey, olayları gerçekleştiğinde depolayacağım bir tür kuyruk oluşturmam gerektiğidir. Sonra bu kuyruğa bakmak ve bu olaylara dayalı bildirimler oluşturmak bir arka plan işi ( dişli ?) Olurdu . Bu iş daha sonra her kullanıcı için bildirimleri veritabanında depolar (bu nedenle bir olay 10 kullanıcıyı etkiliyorsa, 10 ayrı bildirim olacaktır). Daha sonra kullanıcı bildirimler listesiyle bir sayfa açtığında onun için tüm bu bildirimleri okurdum (bunu en son 100 bildirimle sınırlamayı düşünüyoruz) ve bunları bir araya getirip sonunda görüntüleyeceğiz.
Bu yaklaşımla ilgili endişelerim var:
- cehennem gibi karmaşık :)
- veritabanı burada en iyi depolama (MySQL kullanıyoruz) veya başka bir şey kullanmalıyım (redis de iyi bir uyum gibi görünüyor)
- bildirim olarak ne saklamalıyım? kullanıcı kimliği, olayı başlatan kullanıcı kimliği, olay türü (böylece onları gruplayabilir ve uygun metni görüntüleyebilirim), ancak daha sonra bildirimin gerçek verilerini nasıl saklayacağımı bilmiyorum (örneğin URL ve resmin başlığı beğenildi). Bildirimi oluşturduğumda bu bilgiyi "pişirmem" gerekir mi yoksa etkilenen kaydın kimliğini (resim, profil, ...) saklamalı ve bildirimi görüntülerken bilgileri DB'den çıkarmam gerekir mi?
- bildirimler sayfasını görüntülerken anında 100 bildirimi işlemek zorunda kalsam bile performansın iyi olması gerekir
- her istekte olası performans sorunu, çünkü kullanıcıya okunmamış bildirimlerin sayısını görüntülemek zorunda kalacağım (bildirimleri birlikte gruplayacağımdan beri kendi başına bir sorun olabilir). Bildirimlerin görünümünü (gruplandırıldıkları yerde) arka planda oluşturduğum ve anında değil oluşturduysam bu önlenebilir
Peki önerilen çözümüm ve endişelerim hakkında ne düşünüyorsunuz? Burada alakalı olabilecek başka bir şeyden bahsetmem gerektiğini düşünüyorsanız lütfen yorum yapın.
Oh, sayfamız için PHP kullanıyoruz, ancak bence bu büyük bir faktör olmamalı.