Menyiapkan database cloud untuk disinkronkan ke database SQLite lokal
Latar Belakang
Saya memiliki database SQL Server yang dihosting di AWS RDS dan ada aplikasi web dan WEB API yang berhubungan dengan database. Database adalah database multi-tenant dan kami saat ini menggunakan SQL Server 2014 meskipun kami dapat meningkatkan jika diperlukan.
Pihak ketiga mengembangkan aplikasi klien lokal atas nama kami yang memiliki database SQLite sendiri. Aplikasi ini dikembangkan di Xamarin sehingga berjalan di Windows, iOS dan Android. Basis data SQLite lokal harus tetap sinkron dengan basis data awan. Menyinkronkan data ke basis data cloud bukanlah masalah, tetapi menyinkronkan data menyebabkan masalah bagi kami. Saat ini kami menyinkronkan data ke database lokal dengan meminta API WEB, setiap menit, untuk mengembalikan semua perubahan yang telah terjadi sejak tanggal tertentu. Basis data awan memiliki DateCreated, DateModifieddan DateDeletedkolom di setiap tabel dan kolom ini ditanyai untuk melihat data apa yang telah berubah sejak terakhir kali klien menyinkronkan data. Aplikasi lokal mencatat tanggal sinkronisasi terakhir yang berhasil untuk setiap tabel.
Masalah
Pendekatan ini berhasil ketika hanya ada sedikit klien lokal dan beberapa tabel untuk disinkronkan tetapi karena basis klien kami telah berkembang, pendekatan ini tampaknya tidak dapat diskalakan. Kami mengalami masalah kinerja pada database cloud kami dan sering kali tugas sinkronisasi dibatalkan karena batas waktu atau butuh waktu lama untuk dijalankan. Pelanggan kami mengeluh tentang waktu yang dibutuhkan untuk perubahan yang mereka buat di cloud untuk disinkronkan ke aplikasi lokal.
Solusi Potensial
Setelah meneliti berbagai metode pelacakan perubahan di SQL Server, saya percaya bahwa menggunakan fitur Pelacakan Perubahan bawaan adalah pendekatan yang lebih baik daripada menggunakan kolom DateCreated, DateModifieddan DateDeleteduntuk melacak perubahan. Yang saya tidak yakin adalah cara terbaik untuk mengaturnya.
Hal yang perlu diperhatikan:
- Tidak semua kolom di tabel database cloud perlu disinkronkan ke database lokal - Misalnya,
TableAdi cloud database memiliki 20 kolom tetapi klien yang sesuaiTableAmungkin hanya memiliki 5 - Tidak semua data yang berkaitan dengan penyewa perlu disinkronkan ke database lokalnya - misalnya jika catatan ditandai sebagai "tidak aktif" untuk penyewa tersebut, catatan itu tidak boleh disinkronkan secara lokal
- Tabel di database lokal mungkin berisi data dari dua tabel atau lebih di database cloud
- Tidak semua penyewa memiliki aplikasi lokal tetapi pada akhirnya mereka akan melakukannya (ini mungkin membutuhkan waktu satu tahun atau lebih untuk diluncurkan)
Apa yang saya pikirkan untuk dilakukan adalah sebagai berikut:
- Buat database terpisah di AWS RDS yang sama persis dengan database lokal
- Aktifkan pelacakan perubahan di database ini daripada di database utama
- Gunakan pemicu untuk menjaga database utama tetap sinkron dengan database baru
- Buat kueri tabel pelacakan perubahan pada database baru dan kembalikan perubahan ke aplikasi lokal
- Buat tabel baru untuk melacak apakah data telah berubah atau tidak untuk setiap penyewa dan tabel - dengan cara ini kita tidak perlu menanyakan tabel pelacakan perubahan setiap menit hanya untuk menemukan bahwa tidak ada yang berubah
Alasan untuk database kedua adalah untuk mengurangi ketegangan pada database utama saat klien mencoba menyinkronkan data dan juga menjaga skema tetap sinkron mengurangi kerumitan kueri saat klien meminta untuk menyinkronkan perubahan. Misalnya, jika record ditandai sebagai "tidak aktif" untuk penyewa di database utama, tetapi record tersebut telah diubah, saya tidak ingin memfilter record ini saat klien meminta untuk menyinkronkan data. Saya lebih suka jika catatan tersebut sudah disaring sehingga tidak akan pernah ada di database kedua sama sekali. Harapan itu masuk akal!
Saya sangat menghargai masukan Anda tentang pendekatan ini dan jangan ragu untuk menyarankan cara yang lebih baik untuk melakukannya. Jika ada sesuatu yang tidak jelas tolong beri tahu saya dan saya akan memperbarui pertanyaannya!
Jawaban
Meskipun CDC adalah salah satu metodologi yang berguna di SQL Server, ini juga bisa menjadi kinerja yang sedikit berat tergantung pada seberapa banyak data dan seberapa sering ia berubah.
Anda mungkin ingin mempertimbangkan alat pihak ketiga untuk mengelola sinkronisasi antara SQL Server dan SQLite, yang dapat membantu meminimalkan kinerja dan biaya pemeliharaan solusi homebrew. Misalnya SQLiteSync by Amplifier seharusnya berfungsi dengan baik untuk kasus penggunaan semacam ini (perhatikan saya belum pernah menggunakannya sendiri).
https://ampliapps.com/sqlite-sync/