2012-06-06 52 views
10

500k kullanıcılarına sahip bir web sitem var (SQL Server 2008'de çalışıyor). Şimdi kullanıcıların ve arkadaşlarının etkinlik akışlarını dahil etmek istiyorum. SQL Server'da birkaç şeyi test ettikten sonra, RDMS'nin bu tür bir özellik için iyi bir seçim olmadığı anlaşılmaktadır. Bu yavaş (verilerimi ağırlaştırılmış olsa bile). Diğer NoSQL çözümlerine baktıktan sonra bunun için MongoDB'yi kullanabileceğimi düşündüm. activitystrea.ms json specifications for activity stream Tabanlı Veri Yapısını Takip Edeceğim Bu yüzden sorum şu: MongoDB'deki aktivite akışı için en iyi şema tasarımı ne olurdu (bu çok kullanıcı ile çok ağır olacağını tahmin edebilirsiniz) yazıyor, bu yüzden MongoDB tercihim - bu harika "yazma" performansına sahip. Ben 3 yapı türü hakkında düşündüm, bu mantıklı veya başka şema desenleri kullanmalıyım lütfen söyle lütfen.MongoDB veritabanı şeması tasarımı

1 - Her birini depolayın Bu desendeki tüm arkadaşlar/takipçiler ile etkinlik:

 

    { 
    _id:'activ123', 
    actor:{ 
      id:person1 
      }, 
    verb:'follow', 
    object:{ 
      objecttype:'person', 
      id:'person2' 
      }, 
    updatedon:Date(), 
    consumers:[ 
      person3, person4, person5, person6, ... so on 
      ] 

    } 

2 - İkinci dizayn: Collectio Bu yaklaşım başka bir koleksiyonunda etkinlik öğeleri ve tüketicileri deposu olacağını -

 

    { 
    _id:'activ_fanout_123', 
    personId:person3, 
    activities:[ 
    { 
    _id:'activ123', 
    actor:{ 
      id:person1 
      }, 
    verb:'follow', 
    object:{ 
      objecttype:'person', 
      id:'person2' 
      }, 
    updatedon:Date(), 
    } 

    ],[ 
    //activity feed 2 
    ] 

    } 


activity_stream_fanout n name-. faaliyetleri olarak, böyle bir belge olabilir:

 

    { _id: "123", 
     actor: { person: "UserABC" }, 
     verb: "follow", 
     object: { person: "someone_else" }, 
     updatedOn: Date(...) 

    } 

Ve sonra, takipçileri için, aşağıdaki "bildirimleri" belgeleri olurdu: Cevaplarınız ölçüde

 

    { activityId: "123", consumer: "someguy", updatedOn: Date(...) } 
    { activityId: "123", consumer: "otherguy", updatedOn: Date(...) } 
    { activityId: "123", consumer: "thirdguy", updatedOn: Date(...) } 

takdir edilmektedir.

cevap

20
aşağıdaki yapı ile gitmek istiyorum

:

  1. happend tüm eylemler için

    kullanın bir koleksiyon Actions

  2. kime kimlerin takip için başka koleksiyonunu kullanın Subscribers

  3. Belirli bir kullanıcı için üçüncü bir koleksiyon, Newsfeed kullanın n ews feed, öğeler Actions koleksiyonundan çıkarılır.

Newsfeed toplama

uyumsuz yeni Actions işleyen bir işçi işlemi tarafından doldurulur. Bu nedenle, haber beslemeleri gerçek zamanlı olarak doldurulmaz. Geert-Jan'e katılmıyorum, o gerçek zamanda önemlidir; Çoğu kullanıcının, en fazla (hepsi değil) uygulamada bir dakikalık bir gecikme bile beklemediğine inanıyorum (gerçek zamanlı olarak, tamamen farklı bir mimari seçerdim).

Çok fazla sayıda consumers varsa, fan çıkışı biraz zaman alabilir, doğru. Diğer taraftan, tüketicileri doğrudan nesneye yerleştirmek, çok büyük takipçi sayılarıyla da çalışmayacak ve çok fazla indeks alanı alan aşırı büyük nesneler yaratacaktır.

En önemlisi ise çıkış yelpazesi tasarım yaklaşık news feed schema design with MongoDB Ben daha ayrıntılı olarak bu esneklik bazı açıklamak nereye kadar daha esnek ve alaka puanlama, filtreleme, vb ben sadece son zamanlarda bir blog yazısı yazdım sağlar.

Esneklikten bahsetmişken, o aktivite konusunda dikkatli olmalıyım. Farklı sağlayıcılar arasında birlikte çalışma için bir şartname olarak mantıklı görünmektedir, ancak tüm bu ayrıntılı bilgileri, çeşitli uygulamalardan etkinlikleri birleştirmek istemediğiniz sürece veritabanımda saklamam.

+0

harika öneriler. Gerçek zamanlı olarak, bir sonraki adımı kastetmedim, gerçek zamanlı olarak, hızlı bir şekilde, senaryo 2'deki çoklu kullanıcı faaliyetlerini OP'den 'harmanlama' olmaktan çok kazanamayacağımı söyledim. Sonra tekrar “fanout” terimini bilmiyorum (OP'nin ikinci seçeneğine atıfta bulunuyorsunuz ve siz de bahsediyorsunuz), bu yüzden 2'nin niyetlerini tam olarak anlayamamış olabilirim. .. Btw: Bu blogpost okumak için, her zaman MongoDB Schema tasarım –

+0

büyük okuma, mimari mesajları görmek için iyi gidiyor Okumak isteyebileceğiniz ilgili bir soru ile blogunuzda bir yorum yaptı ettik. Teşekkürler –

+1

Çocuklar, önerileriniz için çok teşekkürler. Anlam olarak mnemosyn mesajını cevap olarak işaretliyorum. Blogunuzu okuyup nereye götüreceğimi göreceğim. Yine, tüm önerileriniz için bir kayıt teşekkürler. –

1

ben size erişim desenleri bakmak gerekir inanıyoruz: Eğer Bana göre

hızlı olması gerekiyor kullanım-case bir itmek için muktedir vb bu veriler üzerinde en olası performansına hangi sorguların vardır 'Aktivite tüketicilerinin' her birinin 'duvarı' (fb terimleriyle) için belirli faaliyetler ve etkinlik geldiğinde bunu hemen yapın.

Bu bakış açısıyla (çok fazla düşünmedim) 1 ile devam edin, çünkü 2. işlemden önce belirli bir kullanıcı için aktiviteler topluyor mu? Böylece, 'acil' güncelleme ihtiyacı başarısız olursa. Ayrıca, bu kullanım durumu için 3'ün üzerinde bir avantaj görmüyorum.

1'deki bazı geliştirmeler? Her etkinlik için bir dizi tüketiciyi tanımlama esnekliğine gerçekten ihtiyacınız olup olmadığını kendinize sorun. Bu ince taneli ölçekte bunu belirtmeye gerçekten ihtiyaç var mı? Bunun yerine 'aktör' yeterliğinin 'arkadaşlarına' bir referans olmaz mı? (Bu uzun vadede çok fazla alan olacaktır, çünkü tüketiciler tipik olarak tüketiciler yüzlerce (?)

'un bir miktar ilgili notunda yer aldıklarında, tüm mesajın tümünün büyüklüğüdür. Bu etkinlik akışları için gerçek zamanlı bildirimleri nasıl uygulamak istediğinize bağlı olarak, Pusher - http://pusher.com/ ve benzeri çözümlere bakmaya değer olabilir.

hth

İlgili konular