SORU
18 EYLÜL 2009, Cuma


Nasıl bir sosyal ağ içinde faaliyet akışı uygulamak için

Kendi sosyal ağımı geliştiriyorum ve uygulama web örnekler üzerinde' eylemleri... örneğin, her ne kadar kullanıcılar için filtre eylemleri için? kullanıcıların akış bulamadım Nasıl eylem olayları saklamak için? Hangi veri modeli ve nesne modeli eylemler akışı ve eylemleri için itselves için kullanabilir miyim?

CEVAP
19 Kasım 2009, PERŞEMBE


Özet: Yaklaşık 1 milyon aktif kullanıcı ve 150 milyon saklanan faaliyetleri için, ben basit tutun:

  • Benzersiz faaliyetlerinin saklanması için ilişkisel bir veritabanı kullanmak (faaliyet / başına 1 Kayıt "şey") kayıtları olabildiğince kompakt Yapmak. Hızlı bir şekilde zaman kısıtlamaları ile arkadaş Kimlikleri kümesini kullanarak etkinlik KİMLİĞİ ya da etkinlik toplu tut öyle yapı.
  • Aktivite kaydı oluşturulduğunda Redis faaliyet Kimlikleri, "" listesi için aktivite olması çok arkadaş/abone olan her kullanıcı. faaliyet akışı bir İD ekleyerek yayımlamak

Sorgu herhangi bir kullanıcı için etkinlik akışı almak ve gerektiği gibi db ile ilgili verileri kapmak için Redis. Eğer kullanıcı zaman içinde ileri geri gezinmek için gerekiyorsa zaman db sorgulamak için geri eğer sen bile bu teklif (varsa) düşer


Yaklaşık 15 milyon faaliyetler ile ilgili bildiğimiz eski bir MySQL tablo kullanıyorum.

Şöyle bir şey:

id             
user_id       (int)
activity_type (tinyint)
source_id     (int)  
parent_id     (int)
parent_type   (tinyint)
time          (datetime but a smaller type like int would be better) 

activity_type bana aktivite türü, source_id söyledi faaliyeti ile ilgili kayıt anlatır. Eğer öyleyse aktivite türü ise "favori" sonra source_id favori bir kayıt. KİMLİĞİ ifade ettiğini biliyorum eklenen anlamına gelir

parent_id/parent_type Bu benim uygulama için yararlıdır - bu aktivite ile ilgili ne söylediler. Eğer bir kitap favorited olsaydı, o zaman/parent_type parent_id etkinlik kitabı (yazın) belirli bir birincil anahtar (ıd) ile ilişkili olduğunu söyler

Ben user_id IN (...friends...) AND time > some-cutoff-point etkinlikler (user_id, time) sorgu ve dizin. Kimliği yararak farklı kümelenmiş bir dizini seçmek iyi bir fikir olduğunu tecrübe etmişliğim yok olabilir.

Ama işler çok basit şeyler, basit ve kolay değişiklik ihtiyacı olması. Eğer MySQL kullanarak değilse de, iyi dizin-bilge yapmak mümkün olabilir.


En son faaliyetleri için daha hızlı erişim için Redis üzerinde denemeler yapıyorum. Bellek, yani orada tüm faaliyetleri koyamazsınız, ama çoğu için yeterince sık vurmak saklayabilirsiniz tüm Redis mağazaları sitenizde ekranlar. Bu şekilde her kullanıcı veya bir şey için en son 100. Mix Redis ile, bu şekilde işe yarayabilir:

  • MySQL aktivite kaydı oluşturun
  • Etkinliği oluşturan kullanıcı her arkadaş için, Redis faaliyet listelerine üzerine KİMLİĞİ itin.
  • Son X öğeleri için her liste Trim

Redis hızlı ve boru hattı komutları için bir yol sunar bir bağlantı üzerinden bir etkinlik 1000 arkadaş için dışarı iterek milisaniye sürüyor.

Bahsettiğim şey, daha ayrıntılı bir açıklama için, bkz: "Twitter örnek: http://redis.io/topics/twitter-clone . Redis

Şubat 2011 GüncelleştirinŞu anda 50 milyon aktif faaliyetleri var ve hiç bir şey değiştirmedim. Buna benzer bir şey yapmanın en güzel yanı kompakt, küçük satır kullanır. Daha birçok faaliyetleri daha fazla sorgular kapsayacak bazı değişiklikler yapmayı planlıyorum ve kesinlikle Redis şeyler hızlı tutmak için kullanacağım. Diğer alanlarda Redis kullanıyorum ve gerçekten de sorunları belirli türleri için çalışır.

Temmuz 2014 GüncellemeYaklaşık 700 bin aylık aktif kullanıcı var. Son birkaç yıldır, her kullanıcı için 1000 son aktivite Kimliklerini saklamak için Redis madde imli liste açıklandığı gibi) kullanıyorum. Sistemi, genellikle, yaklaşık 100 milyon aktivite kayıtları var ve hala MySQL saklanır ve hala aynı düzen. Bu kayıtlar bize uzak az Redis bellek ile başlayalım, aktivite verilerini kayıt olarak hizmet vermektedir, ve eğer kullanıcı zaman içinde geriye bir şey bulmak için sayfa gerekiyorsa onları kullanıyoruz.

Bu akıllı ya da özellikle ilginç bir çözüm değildi ama çok da işime yaradı.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Lamborghini

    Lamborghini

    13 Aralık 2005
  • Tube Time

    Tube Time

    14 Mayıs 2013
  • tychoadragmire

    tychoadragmi

    20 Mart 2006