SORU
28 EKİM 2012, Pazar


Nasıl verimli Meteor birçok müşterileri arasında büyük bir koleksiyonu paylaşırken olabilir?

Aşağıdaki durum düşünün:

  • 1.000 istemcileri Meteor sayfa "" koleksiyonu. Somestuff içeriği görüntüleme bağlı

  • "Somestuff" koleksiyonu 1,000 öğeleri tutmak.

  • Birisi ekler içine yeni bir öğe "Somestuff" koleksiyonu

Ne olacak:

  • Müşteriler Meteor.Collections tüm ekleme hepsi bir ekleme mesaj 1,000 müşterilere gönderilen anlamına gelir) iletilir yani güncellenecektir

Sunucu güncellenmesi gerekir belirlemek için CPU vadede maliyeti nedir?

Sadece eklenen değer müşterilerine iletilir, ve tüm liste doğru mu?

Bu nasıl gerçek hayatta işe yarıyor mu? Böyle bir ölçekte kullanılabilir herhangi bir kriterler veya deneyler var mı?

CEVAP
13 Aralık 2012, PERŞEMBE


Kısa cevap sadece yeni veri Tel gönderilmesidir. İşte nasıl çalışır.

Bu yönetmek sunucu Meteor üç önemli bölümü vardır abonelikleri:fonksiyonu yayınlayınne mantığı tanımlayan , veri abonelik sağlar;Mongo sürücüsaatler hangi değişiklikler için veritabanı;kutu birleştirmebir araya getiren , müşterinin aktif Abonelikleri ve ağ üzerinden gönderir istemci.

Fonksiyonları yayınlayın

Meteor bir istemci bir koleksiyon abone her zaman, sunucu çalışan bir fonksiyonu yayınlayın. Yayınlama işlevi işi ayarlamak anlamaya. müşteri ve her belge özelliği göndermesi gereken belgeler bu kutunun içine birleştirme. Bir zamanlar her yeni abone müşteri için çalışır. Sen bu fonksiyon yayınlamak istediğiniz herhangi bir JavaScript gibi koyabilirsiniz keyfi karmaşık erişim kontrolü this.userId kullanarak. Yayınlama bu veri this.added, this.changed çağırarak kutusu birleştirme gönderir ve işlevi this.removed. Bakın full publish documentation daha fazla ayrıntı.

En fonksiyonları etrafında düşük düzey ile karıştırmak zorunda değil yayımlamak added, changed removed gerçi API. Yayımlamak döndürür Mongo işlevi varsa imleç, Meteor sunucusu otomatik olarak Mongo çıktı bağlanır sürücüsü (insert, update removed geri), giriş kutusu (this.added, this.changed this.removed) birleştirme. Çok hoş şeyler bunlar tüm izni yapabileceğiniz çekleri önünde ve yayınlama işlevi sonra doğrudan herhangi bir kullanıcı kutusu birleştirme veritabanı sürücüsünü bağlayın bu şekilde bir kod. Ve autopublish açık olduğunda bile bu biraz. gizli: sunucu otomatik olarak her tüm belgeleri için bir sorgu ayarlar toplama ve birleştirme kutusu içine iter.

Diğer taraftan, veritabanı sorguları yayıncılık ile sınırlı değil. Örneğin, bir GPS konumu okuyan işlevi yayınlamak yazmak Meteor.setInterval veya anketler miras KALAN bir API içinde bir cihazdan başka bir web servisinden. Bu gibi durumlarda, değişiklik yayar ... düşük düzey added, changed removed ithalat API çağırarak kutusu birleştirme.

Mongo sürücü

Mongo sürücüiş değişiklikleri için Mongo veritabanı izle sorgular canlı. Bu sorguları çalıştırmak ve sürekli olarak güncellemeler dönüş sonuçlar added, removed changed geri çağırarak değiştirin.

Mongo gerçek zamanlı bir veritabanı değil. Sürücü anketler. Bir tutar bellek her aktif canlı sorgusu için en son arama sonuç belgesinin kopyası. Üzerinde her bir yoklama döngüsü, önceki kayıtlı yeni sonuç karşılaştırır sonuç, added, removed changedbilgisayar minimum set farkı anlatan olaylar. Eğer birden fazla arama kaydı aynı canlı sorgu için geri aramalar, sürücü sadece bir kopya saatler bu sorgu, her arama aynı sonuç ile geri kayıtlı.

Her zaman sunucu güncellemeleri bir koleksiyon, sürücü her yeniden hesaplar (Meteor sürümlerini bir ifşa edecek toplama sorgu live Ölçekleme canlı sorgular güncelleme yeniden hangi sınırlamak için API.) Bu sürücü de yakalamak için 10 saniyelik bir zamanlayıcı her canlı sorgu anketler bant, Meteor server bypass veritabanını günceller.

Kutu birleştirme

Bu işikutu birleştirme(added, changed removedsonuçları birleştirmektir aramaları tek bir veri içine bir müşterinin aktif yayınlama fonksiyonları tüm stream. Bir bağlı her istemci için kutusu birleştirme var. Bir tutar müşterinin minimongo önbellek tam bir kopyası.

Sadece tek bir abonelik ile örnekte, kutu birleştirme aslında bir geçişi. Ama daha karmaşık bir uygulama birden fazla olabilir üst üste abonelikleri. Her iki set iki abonelikleri eğer aynı belge üzerinde aynı öznitelik, kutuyu karar birleştirme değer öncelikli ve tek müşteri için gönderir. Açıkta değiliz henüz abonelik öncelik ayarı için API. Şimdilik, öncelik müşteri veri setleri abone sipariş belirlenir. İlk bir istemci, abonelik en yüksek önceliğe sahiptir, ikinci abonelik sonraki en yüksek, ve böyle devam eder.

Kutusu müşterinin devlet tutar birleştirme için en az gönderebilirsiniz güncel her müşteri tutmak için veri miktarı ne olursa olsun, bir yayınlamak fonksiyon besleniyor.

Bir güncelleme olacaklar

Şimdi senaryo için sahne aldık.

1,000 bağlı müşterimiz var. Her canlı için abone Mongo sorgu (Somestuff.find({})). Sorgu her müşteri için aynı olduğundan, sürücü sadece bir çalışan sorgu yaşıyor. 1,000 aktif birleştirme kutuları vardır. Ve istemci*, changed, *28 Her yayımlamak fonksiyonu kayıtlı bir ve Kutuları birleştirme içine besleyen o canlı sorguyu removed. Başka bir şey kutularını birleştirme bağlıdır.

İlk Mongo sürücü. Müşterilerden biri yeni bir belge ekler Somestuff, içine bir auto_statıstıcs_update tetikler. Mongo sürücü tekrarları Somestuff tüm belgeler için sorgu sonucu karşılaştırır bellek neden, yeni bir belge olduğunu bulur, ve önceki 1000 her aramalar insert geri kayıtlı.

Sonraki, işlevleri yayınlayın. Burada çok az oluyor: her içine veri kutusu birleştirme iter 1,000 insert geri çağrıları added arama.

Son olarak, her iki ülkenin de karşı kutuyu işaretler bu yeni özniteliklerini birleştirme -bellek istemcinin önbelleğinde kopyalayın. Her durumda, o bulur değerleri henüz istemci üzerinde değil ve varolan bir değer gölge yok. Yani birleştirme kutusu yayar SockJS ** 36 SATICI, bir ileti için bağlantı güncelleştirmeleri istemci ve sunucu tarafında bellek kopyası inşa edildi.

Toplam CPU maliyeti bir Mongo sorgu, artı maliyeti diff fiyatı 1,000 kutuları müşterileri kontrol ediyor ve yeni bir devlet inşa birleştirme SATICI, mesaj yükü. Tel üzerinden akan verileri yalnızca bir tek. JSON nesne 1,000 istemciler için yeni karşılık gönderilen veritabanı, artı bir RPC mesajı belgesunucu içingelen istemci özgün ekleme yapıldı.

En iyi duruma getirme

Kesinlikle planlanmış bir şey bu.

  • Daha verimli Mongo sürücü. Biz optimized the driver 0.5.1 sadece farklı sorgu başına tek bir gözlemci çalıştırmak için.

  • Her DB değiştirmek sorgusu auto_statıstıcs_update tetikleyebilir. Biz ama en iyi yaklaşım bir API bazı otomatik iyileştirmeler yapabilir bu geliştirici yeniden çalıştırmanız gerekir hangi belirlemenizi sağlar. İçin örneğin, içine mesaj ekleme bir geliştirici için açık bir sohbet odası bir iletileri için canlı bir sorgu geçersiz olmamalı ikinci oda.

  • Mongo sürücüsü, işlev yayımlamak ve kutusu birleştirme çalıştırmak için gerek yok aynı makinede aynı süreçte, hatta. Bazı uygulamalar karmaşık canlı sorgular çalıştırmak ve veritabanı izlemek için daha fazla CPU lazım. Diğerleri sadece birkaç farklı bir sorgu (blog motoru düşünün), ama muhtemelen çok bağlı istemciler bu birleştirme için daha fazla CPU lazım kutuları. Bu bileşenler, ayırma bizi her parça ölçekli izin verir bağımsız olarak.

  • Destek bir satır güncelleştirilmiş olduğunda o yangını tetikleyen birçok veritabanları ve eski ve yeni satır bulunur. Bu özelliği ile, bir veritabanı sürücüsü değişiklikler için yoklama yerine tetikleyici kayıt olabilir.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • NextKsa

    NextKsa

    7 EKİM 2009
  • Nightmare2005

    Nightmare200

    14 Ocak 2007
  • TomOdellVEVO

    TomOdellVEVO

    29 Mayıs 2012