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 :
- Jika cara ini masuk akal? Selama volume dan waktu proses sinkronisasi masih dapat diterima.
- Secara umum, konsep apa yang harus saya perhatikan. Bonus: jika ada implementasi konsep-konsep ini dalam modul Spring.
sumber
Jawaban:
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:
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 .
sumber
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:
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.
Jika saya mengerti dengan benar, Anda menggunakan Kontrol Konkurensi Optimis . Saya tidak melihat apa pun yang secara intrik salah dalam pendekatan Anda.
Pertanyaan ini tentang penerapan Penguncian Optimis di Musim Semi . Mungkin Anda dapat menemukan inspirasi di dalamnya.
sumber