Gerçek zamanlı işbirliği sırasında nasıl tasarruf edilir


10

Birden fazla kullanıcının aynı belgeyi düzenlemesini istiyorum. Karşılaştığım sorun, yeni bir kullanıcı katıldığında eski bir belge görebilir. Yeni kullanıcıların en son değişiklikleri almasını nasıl sağlayabilirim?

Düşündüğüm bazı çözümler:

  • Her değişiklikten tasarruf edin. Bu çözümü sevmiyorum çünkü arayüzde işleri yavaşlatacak ve db'ye yükleyecek.

  • Yeni kullanıcı katıldığında, diğer tüm istemcilerde kaydetmeyi tetikleyin. Diğer istemciler kaydedildikten sonra belgeyi yükleyin. Bununla hala tutarsızlık olabilir.

Diğer öneriler faydalı olacaktır.

GÜNCELLEME: Önerilen çözüm olan Google Realtime API'sını inceledikten sonra şunu öğrendim:

  1. Uygulamanızın kullanıcılarının Google Drive'ı olması ve size sürücülerine erişebilmeleri gerekir . Bu, en iyi şekilde garip kullanıcı arayüzü akışı sunabilir veya Google Drive'a sahip olmayan kullanıcıların gerçek zamanlı özellik kullanmasını engelleyebilir.

  2. Yanınızda yapılan tüm paylaşım ayarlarının Google dokümanı için çoğaltılması gerekir .

GÜNCELLEME 2: hedefe acoomplish için, ben gittim Google'ın Firebase


Yeni bir kullanıcı ile zaten etkin olan kullanıcılar arasında aynı belgeyi düzenleyen / görüntüleyen neden fark var?
Andy

@Andy Şu anda yaptığım şey, kullanıcıların yaptığı tüm değişiklikleri yuva aracılığıyla yayınlamak. Bu değişiklikler, tarayıcıları açık olan ancak anında veritabanına kaydedilmeyen kullanıcılar için kullanıcı arayüzünü günceller. Bu yüzden, yeni bir kullanıcı katıldığında, veritabanından belge yüklediğinde ve henüz kaydedilmeyen tüm değişiklikleri görmediği bir durumum var.
dev.e.loper

1
zaten değişiklikler gönderiyorsanız ve şu anda olduğu gibi aynı davranışı bırakmak istiyorsanız, istemcilerden birinden yeni istemciye son görünümü göndermesini isteyebilir veya sunucuda, tüm değişiklikleri alan ve yeni istemcinin en son gönderdiği zaman bir sanal istemciniz olabilir. görünüm.
Dainius

Yanıtlar:


14

Google sürücü

Google dokümanlarınızın kendi sürümünü oluşturmaya çalışıyorsanız, Google Realtime API'sına göz atmanızı öneririz . Google kısa süre önce bunu diğer geliştiricilerin gerçek zamanlı işbirliğine izin vermek için yaptıkları araçları kullanmalarına izin vermek amacıyla yayınladı. Bu, gelişiminizde zaman kazanmanızı ve daha erken çalışan bir ürün almanızı sağlar.

Belgedeki verileri kolayca alabilir ve düzenli aralıklarla veritabanınıza aktarabilir veya veritabanının kendisinin, tüm değişiklikleri dinleyerek ve günlüğe kaydederek değişimin bir 'katılımcısı' olmasını sağlayabilirsiniz. Ayrıca, bir kullanıcının daha sonra gerçek zamanlı API'da kullanılabilen kendi veri yapılarını tanımlamasına izin verir, böylece uygun gördüğünüzde genişletebilirsiniz.

Google dışı Drive

Araştırmanıza göre Google Drive bir seçenek değil. Bu iyi, ama ne kadar koyduğunuza bağlı olarak daha zor ve muhtemelen de işe yaramayacak.

İşte bu genel strateji ben bu sorunu gerçekleştirmek için kullanır:

  1. Sunucunun iletişim çoklayıcı olmasını sağlayın. Her kişi sunucu ile konuşur ve sunucu bu bilgileri diğer herkese gönderir. Bu şekilde sunucu her zaman belgenin en güncel görünümüne sahip olur.

  2. Çakışma çözümlemesi için bir üçüncü taraf algoritması / modülü bulun. Çatışma çözümü zor ve hala mükemmel olmayan bir şey. Bunu tek başına yapmak, projenin kapsamını çok büyük olacak şekilde kolayca artırabilir. Üçüncü taraf bir algoritma kullanamıyorsanız, yalnızca bir kullanıcının bir alanı düzenlemesine izin vermenizi öneririm, böylece kullanıcının bir alanı düzenlemeden önce bir kilit alması gerekir veya başka bir kullanıcının çalışmasını yok etme riskiyle karşı karşıya kalırsınız. çok eski, çok hızlı olacak.

  3. Yeni bir kullanıcı katıldığında, onlara en son belgeyi verin ve komutları kendilerine otomatik olarak aktarmaya başlayın. Sunucu en yeni görünüme sahiptir ve bu nedenle otomatik olarak kaplayabilir.

  4. Belirli aralıklarla veritabanına yedekleme. Ne sıklıkta yedeklemek istediğinize karar verin (her 5 dakikada bir veya her 50 değişiklikte bir.) Bu, istediğiniz yedeklemeyi korumanıza olanak tanır.

Sorunlar: Bu mükemmel bir çözüm değil, bu yüzden karşılaşabileceğiniz bazı sorunlar.

  1. Sunucunun verimi performansın düşmesine neden olabilir

  2. Çok fazla kişi okuma / yazma sunucuyu aşırı yükleyebilir

  3. Bir mesaj kaybolduğunda kullanıcılar senkronize olmayabilir, bu nedenle normal noktalarda senkronize ettiğinizden emin olmak isteyebilirsiniz. Bu, tüm mesajı tekrar göndermek anlamına gelir, bu da pahalı olabilir, ancak aksi takdirde insanlar aynı belgeye sahip olmayabilir ve bilmeyebilir.


Evet, değişiklikler tüm istemcilere yayınlanır ve tarayıcıda (umarım aynı) sürümleri vardır. Söylediğiniz gibi, her eylemde belgeyi güncellemek, gitmenin bir yolu mu?
dev.e.loper

Veya en azından, herkesin aynı sayfada olduğundan emin olmak için belgenin geçerli durumunun arka planda iletildiği düzenli 'senkronizasyon' zaman aralıklarına sahip olun. İnsanların belgeyi ne kadar hızlı değiştireceğine ne sıklıkta bağlı olacağı. Bu şekilde, yeni insanlara göndermek için belirlenmiş bir yöntemin yanı sıra, asla çok fazla ayrışmamasını sağlama yeteneğine sahipsiniz.
Ampt

1
+1. Hayatı zorlaştırma. Google bunu tekerleği yeniden keşfetmek zorunda kalmadan yapar.
Neil

Google Realtime, Google Drive'a kaydediliyor mu? Google Drive'a değil, veritabanıma kaydetmek istiyorum.
dev.e.loper

@ dev.e.loper bu cevaba sizin için bazı bilgiler ekledi.
Ampt

3

Sunucuda belgenin 1 kalıcı kopyasını öneriyorum. İstemci sunucuya bağlandığında UPDATE, istemciye tüm değişiklikleri içeren bir komut (lar) verirsiniz .

WorkFlow'u Güncelle

Kullanıcı değişikliğin tetiklenmesine neden oluyor -> İstemci UPDATESunucuya gönderiyor -> Sunucu UPDATEİstemcilere gönderiyor

Geçerli tetikleyiciler

  1. Kullanıcı Kaydet'i tıklar
  2. Kullanıcı belirli bir görevi tamamlar
    • Hücreyi düzenlemeyi bitirir
    • Cümle / paragraf / satır düzenlemeyi bitirir
  3. Kullanıcı Geri Al'ı tıklatır
  4. Kullanıcı Return tuşuna basar
  5. Kullanıcı bir anahtar yazar (her değişiklikten tasarruf edin)

Uygulamayı Güncelle

UPDATESunucunun her bir UPDATE'i depolaması ve yeni bir istemci bağlandığında istemcinin güncelleştirmeler dizisini gönderebilmesi ve belgenin görüntülenmesi için belgeyi yeniden oluşturabilmesi için belgeyi bir dizi komutla yeniden oluşturabilmenizi öneririm . Kullanıcı. Ayrıca, alternatif SAVEolarak ayrı bir komutunuz olabilir UNDOve UPDATE'in istekler için kullanılabilecek geçici değişiklikler olmasını ve SAVE'nin sunucu kapalıysa veya tüm istemciler bağlantıyı keserse yeniden açılmak üzere depolamasını sağlayabilirsiniz.


2
Çatışma çözümü ne olacak? İki kişi aynı metin alanını aynı anda düzenlerse ne olur? Ayrıca, bu OP bir kaçınmak istiyordu bir şey DB, bir yük yerleştirmek gibi görünüyor. Gerçi ihtiyaç duyduğu şey için uygun olabilir.
Ampt

@Ampt Bu modeli kullanarak bir e-tablo hazırladım ve çakışmalar için güncellenen her bir görevin yerine en yeni sürüm getirildi. Bu nedenle, bir hücreyi düzenlemeyi bitiren son kişi, daha önce güncellenmiş olanı tamamen birleştirmeden tamamen değiştirir.
Korey Hinton

1
Yani bir cümle, örneğin bir kelime belgesi olsaydı, bir cümlenin üzerine yazılır mı?
Ampt

@Ampt evet, alternatif olarak üzerinde çalışılanları kilitlemenin bir yolunu da uygulayabilirsiniz, ancak kolay yolu seçtim.
Korey Hinton

3

1) Knockout.js'ye bir göz atın

Bir MVVM modelini izler ve Modeldeki değişikliklere dayanarak otomatik olarak Görünüm'e bildirimler gönderir. Örneğin, bunu nasıl yaptıkları hakkında biraz daha fazla bilgi sağlamak için gözlemlenebilir dizilerine bakın .

2) SignalR ile karıştırın ve artık belge üzerinde çalışan diğer kullanıcılara bildirim gönderme olanağına sahip olmalısınız. Sitelerinden:

SignalR ayrıca ASP.NET uygulamanızda istemci RPC'ye (istemcilerinizin tarayıcılarındaki JavaScript işlevlerini sunucu tarafı .NET kodundan çağırın) yanı sıra bağlantı yönetimi için yararlı kancalar eklemek için çok basit, yüksek düzeyli bir API sağlar. ör. bağlanma / bağlantı kesme olayları, gruplama bağlantıları, yetkilendirme.

Bu nedenle, her değişiklik olduğunda bazı SignalR çağrıları yapmak için Knockout.js içinde model seviyenizde bazı kancalara sahip olmanız gerekir. Diğer istemciler SignalR gelen uyarı alır ve daha sonra karşılık gelen bir değişimi tetikleyecek onların kendi görmek yukarıya geri itecektir Modeli, kopyası.

Bu iki çerçevenin ilginç bir birleşimidir ve ayrıntıları ele almak için daha fazla bilgi arayabilir ve toplayabilirsiniz.

Örneğin, bu kod projesi örneğiCo Working UIs and Continuous Clients tam olarak yapmaya çalıştığınız adres gibi görünüyor.

New age web uygulamalarının new age kullanıcı deneyimleri sunması gerekebilir ve birlikte çalışan ve sürekli istemci senaryolarını doğru şekilde ele almalıdır. Bu, uygulamanın durumunun ve kullanıcı arabiriminin "olduğu gibi" korunmasını sağlamak için kullanıcı arabiriminin aygıtlar arasında ve kullanıcılar arasında düzgün bir şekilde eşitlendiğinden emin olmayı içerir.

Bu blog yazısı , iki paketin kullanımını tartışan bir dizi blog yazısı için bir giriş noktası gibi görünüyor ve bunu geleneksel bir ASP.NET yaklaşımıyla karşılaştırıyor. Sitenizi tasarlarken dikkat etmeniz gereken bazı noktalar sağlayabilir.

Bu blog yayını biraz daha basit gibi görünüyor ve iki paketi birleştirmek için zemin sağlıyor.

Açıklama: Yukarıdaki bağlantılardan herhangi birine bağlı değilim, ne kadar sağlam veya doğru olduğunu görmek için içeriğine gerçekten girmedim.


2

Çözüm Operasyonel Dönüşümdür (OT). Bunu duymadıysanız, OT, çok tesisli gerçek zamanlı eşzamanlılık yapan bir algoritma sınıfıdır. OT gerçek zamanlı git gibidir. Herhangi bir gecikme süresi ile çalışır (sıfırdan uzatılmış bir tatile). Kullanıcıların düşük bant genişliği ile canlı, eşzamanlı düzenlemeler yapmalarını sağlar. OT, yeniden deneme olmadan, hatasız ve herhangi bir verinin üzerine yazılmadan birden fazla kullanıcı arasında nihai tutarlılık sağlar.

Ancak OT'yi uygulamak zor ve zaman alıcı bir iştir. Bu yüzden http://sharejs.org/ gibi harici bir kütüphane kullanmak isteyebilirsiniz .


1
Google Realtime API'sı OT youtu.be/hv14PTbkIs0?t=14m20s yapıyor Hem istemci hem de sunucuda yapıyorlar . ShareJS belgelerini okuyarak net bir cevap alamadım ama ShareJS'nin hem istemci hem de sunucuda OT yaptığını varsayıyorum?
dev.e.loper

1

Esas olarak belgelerinizin türüne ve kullanıcılarınızın nasıl işbirliği yaptığına bağlıdır.

Ancak, ben:

  1. tüm istemcilerin arada bir sunucuya kaydedilmemiş değişiklikler göndermesine izin verin (kullanıcıların belgelerle nasıl çalıştığına bağlıdır).
  2. sunucu deltaları kullanıcının oturumunda saklar (şişman bir müşteri için bile oturum gibi bir şeye ihtiyacınız vardır)
  3. aynı belgeyi düzenleyen / görüntüleyen diğer istemciler geçici değişiklikleri veya en azından böyle bir ipucu alabilirler.

Avantajları:

  • birisi 'kaydet'i tıklamadığı sürece DB güncellemesi yok
  • çökmesi durumunda yedekleme (oturum dönemi için)
  • sunucunuz hangi istemciye hangi istemciye nasıl ve hangi verilerin iletileceğine karar verir (örneğin, özelliği yalnızca bir notla başlatabilir ve daha sonra daha karmaşık birleştirme ve vurgulama uygulayabilirsiniz)

Dezavantajları:

  • 'gerçek zamanlı' değil - örneğin her 30 saniyede bir gönderirsiniz, ancak birisi o sırada 3 cümle yazar.
  • daha fazla ağ trafiği - belgelerinize ve işbirliğinize bağlı
  • muhtemelen büyük oturumlar
  • eğer birçok kullanıcı işbirliği yapar ve birçok değişiklik yaparsa muhtemelen yüksek hesaplama çabası

1

Temel olarak, sorduğunuz şey paylaşılabilir değişebilir durumla nasıl başa çıkacağınızdır. Tasarruf etmek kolay kısımdır; ama aynı şeyi aynı anda düzenleyen birden fazla kişiyle nasıl başa çıkıyorsunuz? Eşzamanlı düzenlemeleri gerçek zamanlı olarak senkronize ederken tüm kullanıcıların aynı belgeyi görüntülemesini istersiniz.

Muhtemelen topladığınız gibi, bu zor bir problem! Birkaç pragmatik çözüm var:

  1. Gerçek eşzamanlı düzenlemeye izin vermemek için uygulama gereksinimlerinizi değiştirin. Düzenlemeler, kaynak kontrol sistemlerinde olduğu gibi birleştirilebilir ve sonuçlar her istemciye yayınlanabilir. Bunu kendiniz oluşturabilirsiniz, ancak daha kötü bir kullanıcı deneyimi olacaktır.
  2. Durum mutasyonlarının senkronizasyonunu mevcut teknolojinizle entegre olan açık kaynaklı bir çözümle dış kaynaklardan sağlayın. ShareDB bu alandaki mevcut liderdir. Operasyonel Dönüşüme dayanır ve en az bir üretim sisteminde kullanılır. Bu, ilgilendiğiniz kaydetme sorununu halledecektir, ancak ortak çalışma uygulamaları için zorunlu olan ek UX özelliklerinden hiçbirine yardımcı olmayacaktır .
  3. Sizin için tüm zor bitleri işlemek için Convergence (yasal uyarı: Ben bir kurucusum) gibi hazır bir platform kullanın . Ayrıca, hızlı bir şekilde üstün bir işbirliği deneyimi oluşturmak için imleç / fare izleme, seçimler ve sohbet gibi gerçek zamanlı işbirliği için ek araçlar alacaksınız. Mevcut tüm araçların iyi bir şekilde toplanması için bu soruya bakın .
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.