Sinkronisasi data dalam aplikasi seluler - beberapa perangkat, beberapa pengguna

42

Saya sedang mencari untuk membangun aplikasi seluler pertama saya. Salah satu fitur inti dari aplikasi ini adalah bahwa banyak perangkat / pengguna akan memiliki akses ke data yang sama - dan semuanya akan memiliki hak CRUD.

Saya percaya arsitektur harus melibatkan server pusat di mana semua data disimpan. Perangkat akan menggunakan API untuk berinteraksi dengan server untuk melakukan operasi datanya (misalnya menambahkan catatan, mengedit catatan, menghapus catatan).

Saya membayangkan skenario di mana sinkronisasi data akan menjadi masalah. Asumsikan aplikasi harus berfungsi ketika tidak terhubung ke Internet, dan dengan demikian tidak dapat berkomunikasi dengan server pusat ini. Begitu:

  1. Pengguna A sedang offline dan mengedit catatan # 100
  2. Pengguna B sedang offline dan mengedit catatan # 100
  3. Pengguna C sedang offline dan menghapus rekaman # 100
  4. Pengguna C online (mungkin, catatan # 100 harus dihapus di server)
  5. Pengguna A dan B online, tetapi catatan yang mereka edit tidak ada lagi

Segala macam skenario yang mirip dengan di atas dapat muncul.

Bagaimana ini umumnya ditangani? Saya berencana untuk menggunakan MySQL, tetapi saya bertanya-tanya apakah itu tidak sesuai untuk masalah seperti itu.

ProgrammerNewbie
sumber

Jawaban:

30

Saat ini saya sedang mengerjakan aplikasi seluler / desktop / terdistribusi dengan persyaratan dan masalah yang persis sama.

Pertama-tama, persyaratan ini tidak melekat pada aplikasi seluler per se, tetapi untuk setiap transaksi server-klien yang terputus / terdistribusi (pemrograman paralel, multithreading, Anda mendapatkan intinya). Karena itu, mereka tentu saja merupakan masalah khas yang harus diatasi dalam aplikasi seluler.

Secara umum, semua ini intinya adalah bahwa Anda memiliki catatan data potensial yang didistribusikan kepada n klien, yang dapat mengeditnya pada saat yang sama. Yang Anda butuhkan adalah

  1. mekanisme kontrol / penguncian versi yang tepat,
  2. manajemen hak / akses yang tepat,
  3. strategi sinkronisasi / cache yang tepat

Untuk (1) Anda dapat menerapkan beberapa pola: Ada dua strategi penguncian yang sering digunakan: Penguncian Offline Optimis , dan Penguncian Offline Pesimistis . Beberapa di antaranya diterapkan dalam "pola" kontrol versi yang berbeda, seperti MultiVersion Concurrency Control (MVCC), yang menggunakan penghitung (semacam "stempel waktu" yang sangat sederhana) untuk setiap catatan data, yang diperbarui setiap kali catatan diubah .

(2) dan (3) adalah masalah yang sangat luas sendiri, yang perlu ditangani secara independen dari (1). Beberapa saran dari pengalaman saya:

  • Gunakan teknologi client-server yang mengabstraksi sebagian besar masalah untuk Anda. Saya sangat merekomendasikan beberapa teknologi web seperti CouchDb , yang menangani (1) melalui Penguncian Offline + MVCC yang Optimistis, (2) melalui Web API, dan (3) melalui caching Http dengan sangat baik.

  • Cobalah untuk tidak menciptakan sesuatu sendiri jika Anda dapat mengandalkan teknologi dan pendekatan yang terbukti. Saya percaya setiap jam yang dihabiskan untuk meneliti dan membandingkan teknologi / pola yang ada jauh lebih baik daripada mencoba menerapkan sistem Anda sendiri.

  • Coba gunakan teknologi homogen jika memungkinkan. Maksudnya "homogen" yang saya maksudkan adalah teknologi yang dibangun dengan prinsip yang sama, misalnya skenario penggunaan web 2.0. Contoh: Menggunakan CouchDb dan REST Client (Web API) yang tepat dengan strategi caching lokal adalah pilihan yang lebih baik daripada menggunakan SQL untuk aplikasi seluler.

  • Saya sangat menyarankan untuk tidak menggunakan MySQL karena ini adalah teknologi yang tidak secara eksplisit dibuat untuk skenario penggunaan seperti itu. Ini bekerja, tetapi Anda jauh lebih baik dengan sistem database yang sudah mencakup gaya komunikasi web dan concurrency (seperti banyak Database NoSQL).

Ngomong-ngomong, saya telah puas dengan CouchDb dengan klien lokal khusus yang bekerja melawan API CouchDb, yang bekerja dan berkembang dengan sangat baik. Saya beralih dari menggunakan MSQL + (N) Hibernate dan membayar mahal karena tidak membuat pilihan yang tepat (artinya tidak melakukan penelitian yang cukup) sejak awal.

Sebastian
sumber
Penguncian +1 optimis vs pesimis adalah hal pertama yang muncul di kepala saya membaca pos OP
10

Pertama, Anda menyebutkan API dan database (MySQL). Saya sangat menyarankan agar Anda menggunakan API dan jangan mencoba berkomunikasi langsung antara database. Rute yang terakhir itu tidak akan skala sama sekali.

Satu titik awal yang baik yang harus Anda pertimbangkan adalah menggunakan Apache CouchDB . Ini skema-kurang, berdasarkan HTTP dan JSON, dan memiliki mekanisme replikasi yang sangat baik. Kami menggunakannya untuk memecahkan masalah serupa.

Mekanisme replikasi CouchDB menggunakan API HTTP yang sama dengan yang digunakan klien lain. Jadi pada dasarnya, ini menyediakan replikasi melalui API.

Untuk iOS, saya sarankan menggunakan proyek Couchbase Lite . Ini bekerja sangat baik untuk menyinkronkan data. Untuk Android, perusahaan yang sama yang membuat proyek Couchbase Lite yang disebutkan di atas sedang mengerjakan penawaran serupa - Couchbase Lite untuk Android . Ini tidak selengkap versi iOS dan masih memiliki beberapa pekerjaan yang harus diselesaikan.

Ada beberapa hal yang perlu dipertimbangkan dengan CouchDB.

  1. Anda perlu memberikan resolusi konflik Anda sendiri. Untungnya, jika konflik terjadi, CouchDB menyimpan versi dan pilihan yang berkonflik dan sewenang-wenang, tetapi konflik deterministik harus dimiliki sebagai versi utama. Jadi Anda dapat mempertimbangkan menunda resolusi konflik untuk versi awal Anda.
  2. Mekanisme replikasi dibuat untuk mereplikasi database, bukan sinkronisasi per-se. Jadi, jika Anda memiliki banyak dokumen yang dihapus, replikasi Anda dari server ke klien akan memakan waktu lebih lama dan lebih lama. Ada cara untuk menghindari ini menggunakan "rotasi basis data." Ini pada dasarnya menghapus penghapusan lama.
  3. Anda tidak dapat mengontrol urutan replikasi. Anda dapat, bagaimanapun, membuat beberapa solusi pintar untuk meningkatkan kinerja replikasi seperti menggunakan replikasi yang difilter untuk mendapatkan beberapa dokumen terlebih dahulu, atau bahkan mengakses server secara langsung sesuai permintaan.
  4. Replikasi tidak akan terjadi di latar belakang di iOS. Anda dapat menggunakan iOS SDK untuk memberikan beberapa kasus replikasi latar belakang.

Terakhir, jika Anda tidak ingin menggunakan CouchDB, Anda setidaknya bisa menggunakannya sebagai referensi yang baik untuk bagaimana Anda bisa membuat algoritma sinkronisasi menggunakan API HTTP. Saran saya adalah memulai dengan CouchDB dan kemudian, jika Anda membutuhkan sesuatu yang lebih khusus, pertimbangkan untuk menggulirkan sendiri.

David V
sumber
Rencana saya untuk API adalah mengimplementasikan RESTful API menggunakan CodeIgniter, yang akan berinteraksi dengan solusi DB apa pun yang diperlukan. Saya tidak berpikir untuk menggunakan sistem DB yang memiliki API bawaan. Apakah rencana saya tidak setuju dengan jawaban Anda?
ProgrammerNewbie
Juga, saya sekarang melihat CouchDB. Apakah saya akan membangun aplikasi hanya menggunakan CouchDB? Atau apakah saya masih menggunakan sesuatu seperti MySQL dalam hubungannya dengan CouchDB? Misalnya, aplikasi masih akan memiliki beberapa kebutuhan dasar untuk RDBMS. Apakah saya memodelkan data semacam itu di MySQL dan kemudian memasukkan data yang membutuhkan sinkronisasi di CouchDB?
ProgrammerNewbie
Silakan tentukan "kebutuhan Anda untuk RDBMS". Apa yang disediakan oleh CouchDb? CouchDb adalah basis data NoSQL, jadi Anda tidak perlu MySQL tambahan. Selain itu, CouchDb dapat membantu Anda tanpa tier menengah karena Anda dapat mencegat panggilan API menggunakan JavaScript dan membangun output Anda dengan tampilan.
Sebastian
@ProgrammerNewbie, sepertinya rencana Anda umumnya baik: memiliki API abstrak dari database. CouchDB melakukan hal ini, tetapi Anda tidak sepenuhnya disarikan dari fakta bahwa itu adalah CouchDB. Mengenai pertanyaan kedua Anda, saya juga tidak tahu mengapa Anda membutuhkan RDBMS. CouchDB menyediakan peta / kurangi tampilan untuk memberikan kueri pada data, filter, ubah pelacakan, dan banyak lagi.
David V
@Sebastian - Saya hanya tidak terbiasa dengan NoSQL, jadi saya ingin tahu apakah saya masih membutuhkan RDBMS untuk data relasional saya.
ProgrammerNewbie