Apa cara terbaik untuk melakukan failover offline klien berbasis desktop yang menggunakan layanan web?

13

Saya memiliki tiga proyek masuk yang memiliki masalah yang sama:

mereka perlu memiliki logika pada sistem web dan mereka membutuhkan aplikasi lokal (misalnya tempat penjualan) yang berkomunikasi dengan sistem tersebut melalui layanan web RESTful.

Solusi saya

Solusi yang berhasil saya buat adalah dengan mengimplementasikan pesan aplikasi antrian di desktop untuk menyimpan operasi ketika layanan sedang offline, lebih tepatnya, antrian pesan asinkron . Namun, itu adalah bagian yang mudah (jika itu adalah solusi terbaik). Saya juga peduli dengan sinkronisasi data dan resolusi konflik.

Sistem utama harus berbasis web karena aplikasi web diperlukan untuk laporan dan pemantauan oleh para pemangku kepentingan, dan layanan web akan menangani permintaan untuk beberapa perusahaan.

Klien desktop (sebaiknya tipis) akan diimplementasikan dengan Java (lebih khusus Netbeans) dan sistem web dengan Symfony2. Dua dari proyek tersebut membutuhkan integrasi perangkat keras untuk klien, sehingga membuat aplikasi desktop dengan teknologi web (mis. Appcelerator Titanium) bisa menjadi masalah besar.

Pertanyaan saya

  1. Apa solusi yang lebih baik yang mengukur, yang berarti efisiensi maksimum dengan upaya minimum (dan lebih disukai tanpa biaya tambahan, seperti membeli server cadangan untuk operasi lokal)?

  2. Siapa lagi yang pernah menangani ini sebelumnya? Bagaimana Anda memecahkan masalah Anda? Pelajaran apa yang bisa Anda bagikan?

  3. Bagaimana Anda menangani sinkronisasi?

Sunting: Menambahkan bagian yang hilang ke pertanyaan saya di poin # 3

dukeofgaming
sumber

Jawaban:

3

Aku tahu pertanyaan Anda java, tapi aku benar-benar seperti ini pesan gaya arsitektur bus untuk hal semacam ini.

Pada dasarnya ketika pesan dikirim mereka berpotensi mendapat dua tanggapan. Yang pertama adalah dari cache lokal, yang kedua berasal dari server setelah terhubung.

Saya cukup yakin Anda dapat mengadaptasi arsitektur ini (bus badak dan nhib) ke milik Anda (MQ dan hib) dengan cukup mudah.

Anak sungai
sumber
Yup, saya mencari arsitektur berorientasi pesan seperti itu. Argumen cache dan kalimat terakhir dalam tautan Anda meyakinkan saya.
dukeofgaming
10

Lakukan semuanya secara lokal , dan sinkronkan secara berkala .

Inilah yang akan saya lakukan jika saya adalah Anda (saya tidak mengetahui kerangka sinkronisasi di Jawa seperti yang kita miliki di .NET).

Pertahankan stempel waktu di aplikasi lokal yang akan menahan terakhir kali Anda terhubung dengan sukses.

Terlepas dari waktu Anda terhubung kembali, stempel waktu itu akan digunakan untuk mengeluarkan data baru, kemudian mengirim pesanan baru yang dihasilkan secara lokal.

Anda kemudian akan mempertahankan dua cap waktu. Satu untuk menentukan kapan pesanan telah dibuat (lokal atau online) dan satu ketika telah direkam oleh server.

Saya tidak merekomendasikan Antrian Pesan untuk itu. Saya menggunakan MQ di masa lalu untuk situs web e-commerce yang harus terhubung ke Navision. Semuanya dioperasikan dalam Navision, dan perubahan dikirim ke situs web e-commerce melalui MQ, termasuk status pesanan dan semuanya termasuk deskripsi produk, harga, dll. Pesanan baru dikirim ke Navision melalui MQ juga.

Walter
sumber
Hmmm, saya memang menyukai ide model push, namun saya melihat masalah bahwa jika waktu komputer berubah mungkin ada data yang hilang. BTW, saya memiliki konvensi untuk memiliki setiap dan setiap catatan waktu di desain database saya. Mengapa Anda tidak merekomendasikan MQ?
dukeofgaming
Itu benar, Anda harus menggunakan waktu PC dan UTC yang disinkronkan, tetapi sekarang cukup standar (setidaknya pada Windows). MQ kadang-kadang diperlukan, tetapi saya pikir itu akan terlalu banyak untuk jenis aplikasi yang Anda kembangkan.
Ok, jadi untuk memprioritaskan keandalan, lebih baik berpikir bahwa aplikasi desktop akan terputus dan dengan demikian lebih baik untuk memperlakukan aplikasi desktop sebagai warga negara kelas satu, namun, saya masih di bawah kesan bahwa MQ akan menjadi pengganti yang lebih mudah untuk implementasi basis data lokal. Juga, saya pikir membuat semua operasi CRUD di server secara implisit memiliki keamanan yang lebih baik. Apa pendapat Anda tentang dua poin ini?
dukeofgaming
@dukeofgaming: dalam kasus saya, pesanan dapat diambil dari POS apa pun (juga aplikasi dapat digunakan sebagai sistem pengambilan pesanan dan bukan sistem pemrosesan pesanan), termasuk web. Semuanya didistribusikan di seluruh negeri. Sangat penting bagi setiap desktop untuk menjadi otonom jika terjadi pemutusan. MQ akan bekerja dalam skenario itu juga, jadi saya tidak menentangnya. Saya hanya merasa lebih mudah untuk menerapkan sinkronisasi data yang kuat antara server master dan klien. Oleh karena itu, operasi CRUD pada server master bukanlah suatu pilihan.
2
+1 - ini adalah bagaimana saya melihatnya dilakukan di masa lalu. Saya juga akan mengatakan bahwa penggunaan uniqueidentifier (Guids) sebagai kunci utama sangat menyederhanakan banyak hal. Melakukan itu adalah salah satu hal yang benar-benar membuat hidup Anda lebih mudah jika Anda perlu sinkronisasi.
Scott Whitlock
1

Atau Anda harus melihat implementasi basis data sistem yang sesekali terhubung yang melakukan pekerjaan kasar sinkronisasi klien jarak jauh ke server. (SQL Server memiliki ini dengan SQL CE sampai batas tertentu, Outlook melakukan ini).

Dengan cara ini, Anda dapat melakukan semua perubahan secara lokal di basis data footprint kecil (Ini mempertahankan versi / cap waktu logis dll. Sehingga Anda tidak perlu khawatir tentang jam PC dll) dan setiap kali Anda online, Anda menyinkronkan ini dengan yang utama server.

Saya tidak akan mencari solusi REST ketika sistem tidak dapat online sebagian besar waktu.

Subu Sankara Subramanian
sumber
Apakah Anda menggambarkan database terdistribusi?, Dapatkah Anda menguraikannya?
dukeofgaming
Tidak - ini bukan db terdistribusi dalam arti dunia nyata. Sebuah db terdistribusi biasanya mengharapkan hampir semuanya untuk online juga, tetapi logika replikasi di antara rekan-rekan yang turun berlaku di sini juga. Ada beberapa database desktop / perangkat yang memiliki fasilitas untuk melakukan pekerjaan replikasi ( blogs.msdn.com/b/stevelasker/archive/2007/03/18/… ) - Jadi yang harus Anda lakukan adalah mengatur perangkat ini db, catat perubahan Anda di sini dan saat Anda terhubung ke jaringan komputer, panggil sinkronisasi - dan itu akan melakukan transfer data ke server utama untuk Anda.
Subu Sankara Subramanian