Sinkronisasi dengan sistem offline

9

Saya merancang sistem tempat saya akan menyinkronkan data bisnis dari perangkat seluler (yang memiliki aplikasi tertanam) yang menghasilkan data dan mengirimkannya kembali ke server. Setiap baris yang disinkronkan menghasilkan log bisnis tertentu dalam database.

Jika apa yang saya sinkronkan menghasilkan data dengan tanggal (dalam data sinkronisasi) lebih rendah daripada tanggal modifikasi terakhir dari data bisnis saya, saya harus mengabaikannya dan hanya menambahkan basis data login. Setelah data yang diunggah diproses, data diambil dari database dan diunduh ke perangkat.

Karena pengunduhan ini tepat setelah menulis, sinkronisasi harus sinkron. Masih mungkin untuk memiliki pola pembaca / penulis jika sesuatu seperti ini cukup layak untuk menggantikan solusi saya yang ada. Yang lebih penting adalah dapat mengunduh data terbaru. Data itu diambil secara keseluruhan, tidak ada perbedaan yang diimplementasikan saat ini (mungkin akan datang kemudian tetapi itu tidak akan menjadi masalah).

Saya mungkin memiliki beberapa sinkronisasi pada objek bisnis yang sama berjalan, itu tidak mungkin tetapi bisa terjadi dan saya lebih suka untuk dapat menanganinya. Sinkronisasi diharapkan berlangsung selama beberapa detik tetapi tidak beberapa menit, kecuali menggunakan aplikasi seluler tertanam tanpa sinkronisasi ulang selama beberapa hari.

Volume data yang disinkronkan tidak diharapkan besar, begitu juga proses sinkronisasi.

Jadi saya akhirnya menggunakan saling pengecualian pada metode sinkronisasi saya, lebih tepatnya, saya menggunakan Java dan saya menempatkan sinkronisasi pada metode penulisan bukan seluruh proses sinkronisasi untuk tidak memblokir sinkronisasi read-only.

Saya ingin tahu :

  1. Jika cara ini masuk akal? Selama volume dan waktu proses sinkronisasi masih dapat diterima.
  2. Secara umum, konsep apa yang harus saya perhatikan. Bonus: jika ada implementasi konsep-konsep ini dalam modul Spring.
Walfrat
sumber
Apa yang menyebabkan offline? Maksud saya ketika perangkat sedang offline itu berarti tidak memiliki akses hanya ke server atau tidak ke Internet juga?
Laiv
Itu tidak memiliki akses ke internet. Atau tidak sering.
Walfrat
Jika Anda memiliki banyak sinkronisasi klien / server, Anda harus terlebih dahulu memutuskan penguasaan data jika ada sesuatu yang berbeda. Jika Anda mempertimbangkan koneksi intermiten dan beberapa klien saja, pasti tidak ada cara untuk melakukan ini secara bertahap.
tofro
Penguasaan data @tofro mudah ditentukan dalam kasus saya sehingga tidak menjadi masalah. Namun mengapa tidak mungkin untuk melakukannya secara bertahap dengan koneksi intermiten? Haruskah saya menggunakan tanggal sinkronisasi terakhir saja? Satu-satunya masalah dalam kasus saya menggunakan tanggal tersebut adalah bagaimana mengetahui bahwa data yang saat ini ada di perangkat saya telah dipindahkan dan harus dihapus pada perangkat tersebut.
Walfrat
Dari uraian Anda, saya telah memahami bahwa item data yang sama dapat diubah di server, atau pada satu atau lebih banyak klien. Bagaimana Anda menyinkronkan tiga arah item data yang masuk ke ponsel # 1, kemudian diubah di server, lalu pergi ke ponsel # 2 dan diubah di sana, lalu ponsel # 1 terhubung (dengan ponsel # 2 yang terputus)?
tofro

Jawaban:

1

Satu pendekatan yang telah saya selidiki untuk sementara waktu sekarang (dengan beberapa keberhasilan) untuk menyinkronkan data klien dengan data server, tanpa bergantung pada tanggal (yang mungkin tidak dapat diandalkan) atau permintaan sinkron, adalah kombinasi dari JSON Patches (mungkin POJO s dalam kasus Anda) dan sumber acara .

Ide dasarnya adalah bahwa alih-alih menyimpan keadaan saat ini pada klien dan server, klien dan server menyimpan daftar perubahan, dan saling mengirim pesan melalui peristiwa atau permintaan tambalan.

Jadi alih-alih meminta klien mengirim semua data plus tanggal ke server, klien mengirim acara, bersama dengan nomor revisi yang sesuai dengan terakhir kali klien berpikir data telah diperbarui. Sesuatu seperti ini:

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

Setelah server mendapatkan acara ini (secara tidak sinkron), ia merekonsiliasi dengan acara lain yang mungkin telah diterimanya. Sebagai contoh, ada kemungkinan bahwa klien lain yang bekerja dengan data yang sama mungkin telah memodifikasi beberapa hal, dan sekarang nomor revisi pada server adalah 5. Jadi, revisi ini perlu diterapkan sebelum 2 terakhir diterapkan, dan semua klien perlu diberitahu tentang perubahan ini.

Setelah server selesai, ia memberi tahu semua klien yang tertarik tentang perubahan yang telah dibuat, dan nomor revisi saat ini yang baru. Klien kemudian menerapkan perubahan ini dan memperbarui nomor revisi internalnya.

Jarak tempuh Anda mungkin bervariasi, tetapi saya harap itu membantu.

Sunting: Nama lain untuk pendekatan ini, atau variasi dari itu, disebut antrian pesan , sebagaimana disebutkan dalam pertanyaan terkait ini .

Jeffrey Sweeney
sumber
Sistem dapat offline (tidak ada akses ke server) selama beberapa hari dan harus mendaftarkan tanggal ketika peristiwa itu terjadi, bukan ketika acara itu disinkronkan dengan server. Itu sebabnya saya harus menggunakan tanggal. Saya memiliki nomor revisi untuk optimis Mengunci juga, tetapi untuk alasan yang sama, 2 perangkat dapat mengunduh versi X dari POJO dan ketika mereka nanti mensinkronkan masing-masing mengirim acara yang harus menghasilkan versi X + 1 dan X + 2. Dan perangkat tidak dapat berkomunikasi satu sama lain.
Walfrat
Nomor revisi dalam jawaban ini selalu dihasilkan di server, klien mengirim nomor revisi lama, tidak perlu tahu tentang klien lain karena kenaikan revisi bukan tanggung jawabnya. Jawaban ini tidak menyebutkan resolusi konflik, yang merupakan bagian terpenting dari solusi yang diusulkan.
Basilev
0

Masalah pertama adalah menggunakan tanggal sebagai cara untuk menyinkronkan data. Saya benar-benar yakin saya tidak mendapatkan semua detail dari solusi Anda, tetapi saya akan mengatakan bahwa:

  1. Apakah tanggal dibuat di ponsel? Dalam hal ini, apakah Anda yakin aplikasi yang berjalan di ponsel akan selalu menggunakan tanggal yang benar? Bagaimana dengan pengguna jahat yang agaknya dapat mengubah tanggal sistem pada perangkat selulernya? Bagaimana dengan pengguna di zona waktu yang berbeda? Seperti yang dikatakan @jeffrey kepada Anda, mungkin itu bukan pendekatan terbaik untuk mengandalkan tanggal yang dihasilkan pada perangkat.

  2. Jika saya mengerti dengan benar, Anda menggunakan Kontrol Konkurensi Optimis . Saya tidak melihat apa pun yang secara intrik salah dalam pendekatan Anda.

  3. Pertanyaan ini tentang penerapan Penguncian Optimis di Musim Semi . Mungkin Anda dapat menemukan inspirasi di dalamnya.

danidemi
sumber
Saya perlu mencatat tanggal ketika tindakan itu dilakukan, karena saya terjebak dengan tanggal ponsel. Tanggal seluler sering disinkronkan ulang dengan sistem. Hanya deviced terdaftar yang dapat melakukan sinkronisasi dengan server. Mengenai keamanan, ini adalah masalah lain yang tersisa sekarang (otentikasi perangkat X509, ...)
Walfrat
Tanggal dapat direkam sebagai bidang data lain, tidak perlu memperlakukannya sebagai token sinkronisasi.
Basilevs