Çevrimdışı sistemle senkronizasyon


9

Ben veri üreten ve sunucuya geri gönderir mobil cihazdan (gömülü bir uygulama var) iş verilerini senkronize edecek bir sistem tasarlıyorum. Senkronize edilen her satır, veritabanında belirli bir iş günlüğü oluşturur.

Senkronize ettiğim şey, iş verilerimin son değişiklik tarihinden daha düşük bir tarihle (senkronizasyon verileri dahilinde) veri oluşturuyorsa, yok saymalı ve sadece giriş veritabanını eklemeliyim. Yüklenen veriler işlendikten sonra veriler veritabanından alınır ve cihaza indirilir.

Bu indirme işleminden hemen sonra, senkronizasyon senkronize olmalıdır. Mevcut çözümümü değiştirmek için yeterli bir değere sahipse yine de bir okuyucu / yazar desenine sahip olmak mümkündür. Daha da önemlisi, güncel verileri indirebilmektir. Bu veriler bir bütün olarak getirilir, şu anda uygulanan bir fark yoktur (daha sonra gelebilir, ancak bu bir sorun olmayacaktır).

Aynı iş nesnesi üzerinde çalışan birden fazla senkronizasyon olabilir, bu olası değildir, ancak gerçekleşebilir ve bununla başa çıkmayı tercih ederim. Yerleşik mobil uygulamayı birkaç gün boyunca yeniden senkronize etmeden kullanmadıkça senkronizasyonun birkaç saniye sürmesi beklenir, ancak birkaç dakika sürmez.

Senkronize edilen veri hacminin ne senkronizasyon işlemi ne de büyük olması beklenmez.

Bu nedenle, senkronizasyon yöntemimde karşılıklı bir dışlama kullanarak, daha doğrusu, Java kullanıyorum ve salt okunur senkronizasyonu engellememek için tüm senkronizasyon sürecine değil yazma yöntemine bir senkronize koydum.

Bilmek isterim :

  1. Bu şekilde mantıklıysa? Senkronizasyon işleminin hacmi ve süresi hala kabul edilebilir olduğu sürece.
  2. Genel olarak, hangi kavramlara bakmalıyım. Bonus: Bir Spring modülünde bu kavramların herhangi bir uygulaması varsa.

Çevrimdışına ne sebep olur? Cihaz çevrimdışıyken, sadece sunucuya erişimi olmadığı veya internete erişimi olmadığı anlamına mı geliyor?
Laiv

İnternet erişimi yok. Ya da sık sık değil.
Walfrat

Senkronize edilen birden fazla istemciniz / sunucunuz varsa, bir şeyin değişmesi durumunda öncelikle veri ustalığına karar vermelisiniz . Yalnızca aralıklı bağlantıları ve birden çok istemciyi düşünüyorsanız, bunu kademeli olarak yapmanın kesinlikle bir yolu yoktur.
tofro

@tofro veri ustalığının benim durumumda belirlenmesi kolaydır, bu yüzden bir sorun değildir. Ancak aralıklı bağlantılarla bunu neden kademeli olarak yapmak mümkün olmaz? Yalnızca son bir senkronizasyon tarihini kullanabilmem gerekir mi? Benim durumumda böyle bir tarih kullanmanın tek sorunu, şu anda cihazımda bulunan bir verinin taşındığını ve cihazdan silinmesi gerektiğini bilmek.
Walfrat

Açıklamanızdan, aynı veri öğesinin sunucuda veya bir veya daha fazla istemcide değiştirilebileceğini anladım. Mobil # 1'e giden, ardından sunucuda değiştirilen, ardından mobil # 2'ye giden ve orada değiştirilen bir veri öğesini üç yönlü nasıl senkronize edersiniz, ardından mobil # 1 bağlanır (bağlantısı kesilmiş bir mobil # 2 ile)?
tofro

Yanıtlar:


1

İstemci verileri (güvenilmez olabilir) veya senkron istekleri tarihleri dayanmadan, sunucu verileri ile senkronize olması (bazı başarı ile) artık bir süre soruşturma oldum Bir yaklaşım, bir kombinasyonudur JSON Yamalar (belki POJO ler senin durumunda) ve olay kaynak .

Temel fikir, mevcut durumu istemcide ve sunucuda depolamak yerine, istemci ve sunucunun bir değişiklik listesi depolaması ve olaylar veya yama istekleri yoluyla birbirlerine mesaj göndermesidir.

Bu nedenle, istemcinin tüm verileri ve bir tarihi sunucuya göndermesini sağlamak yerine, istemci, verilerin en son güncellendiğini düşünen bir düzeltme numarasıyla birlikte bir olay gönderir. Bunun gibi bir şey:

Server.send("MODIFY FOO", 3);

Sunucu bu olayı (eşzamansız olarak) aldıktan sonra, daha önce almış olabileceği diğer olaylarla bağdaştırır. Örneğin, aynı verilerle çalışan başka bir istemcinin bazı şeyleri zaten değiştirmiş olması ve şimdi sunucudaki revizyon numarası 5'te olabilir. Bu nedenle, bu revizyonun son 2 uygulanmadan önce uygulanması gerekir ve hepsi müşteriler bu değişiklikten haberdar edilmelidir.

Sunucu tamamlandığında, ilgili tüm istemcilere değişikliklerin yapıldığını ve yeni geçerli düzeltme numarasını bildirir. Müşteri daha sonra bu değişiklikleri uygular ve dahili revizyon numarasını günceller.

Kilometreniz değişebilir, ancak umarım bu yardımcı olur.

Düzenleme: Bu yaklaşım veya başka bir varyasyon için başka bir adı , bu ilgili soruda belirtildiği gibi ileti kuyruğu denir .


Sistem birkaç gün boyunca çevrimdışı olabilir (sunucuya erişim yoktur) ve olayın sunucuyla senkronize edildiği zaman değil, olayın gerçekleştiği tarihi kaydetmesi gerekir. Bu yüzden tarihleri ​​kullanmak zorundayım. Ben de optimisticLocking için bir revizyon numarası var, ama aynı nedenden dolayı, 2 cihaz bir POJO X sürümünü indirebilir ve daha sonra senkronize ettiklerinde her sürüm X + 1 ve X + 2 oluşturmak gerekir gönderir. Ve cihazlar birbirleriyle iletişim kuramıyor.
Walfrat

Bu cevaptaki revizyon numarası her zaman sunucuda üretilir, istemci eski revizyon numaralarını gönderir, revizyon artışının sorumluluğu olmadığı için diğer müşteriler hakkında bilgi sahibi olması gerekmez. Bu cevap, önerilen çözümün en önemli parçası olan çatışma çözümünden bahsetmiyor.
Basilevs

0

İlk sorun tarihleri ​​veri senkronizasyonu için bir yöntem olarak kullanmaktır. Çözümünüzün tüm ayrıntılarını alamadığımdan eminim ama şunu söyleyebilirim:

  1. Cep telefonlarında tarihler oluşturuluyor mu? Bu durumda, cep telefonlarında çalışan uygulamanın her zaman doğru tarihleri ​​kullanacağından emin misiniz? Peki ya mobil cihazındaki sistem tarihini değiştirebilen kötü niyetli bir kullanıcı? Farklı saat dilimlerindeki kullanıcılar ne olacak? @Jeffrey'in söylediği gibi, belki de cihazlarda oluşturulan tarihlere güvenmek en iyi yaklaşım değildir.

  2. Doğru anladıysam, İyimser Eşzamanlılık Kontrolü kullanıyorsunuz . Yaklaşımınızda gerçekten yanlış olan hiçbir şey görmüyorum.

  3. Bu soru Baharda İyimser Kilitlemenin uygulanmasıyla ilgilidir . Belki de ilham alabilirsiniz.


Hareketin yürütüldüğü tarihi kaydetmem gerekiyor, çünkü mobilin tarihine takılı kaldım. Mobil tarih sıklıkla sistemle yeniden senkronize edilir. Yalnızca kayıtlı cihazlar sunucu ile senkronize edilebilir. Güvenlik gelince, şimdilik başka bir endişe kaldı (X509 cihaz kimlik doğrulaması, ...)
Walfrat

Tarih başka bir veri alanı olarak kaydedilebilir, senkronizasyon jetonu olarak ele alınmasına gerek yoktur.
Basilevs
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.