Який найкращий спосіб зробити відмовлення в режимі офлайн клієнта на робочому столі, який використовує веб-сервіс?


13

У мене є три вхідні проекти, які мають спільну проблему:

їм потрібно мати логіку у веб-системі, і їм потрібен локальний додаток (наприклад, точка продажу), яка спілкується з такою системою через веб-сервіс RESTful.

Моє рішення

Рішення, яке мені вдалося придумати, - це реалізувати в черзі повідомлення для додатків на робочому столі для зберігання операцій, коли служба в автономному режимі, точніше, асинхронна черга повідомлень . Однак це легка частина (якщо таке найкраще рішення). Я також переймаюся синхронізацією даних та вирішенням конфліктів.

Основна система повинна бути веб-базованою, оскільки для створення звітів та моніторингу зацікавленими сторонами потрібен веб-додаток, а веб-служби оброблять запити для кількох установ.

Клієнти для настільних комп’ютерів (бажано тонкі) будуть реалізовані за допомогою Java (точніше Netbeans) та веб-системи з Symfony2. Два проекти вимагають інтеграції обладнання для клієнта, тому створення настільних додатків за допомогою веб-технологій (наприклад, Appcelerator Titanium) може бути серйозним болем.

Моє запитання

  1. Що є кращим рішенням, яке масштабує масштаб, маючи на увазі максимальну ефективність із мінімальними зусиллями (і, бажано, без додаткових витрат, як-от придбання резервного сервера для локальної роботи)?

  2. Хто ще займався цим раніше? Як ви вирішили свою проблему? Якими уроками ви можете поділитися?

  3. Як ви мали справу з синхронізацією?

Редагувати: До мого запитання в пункті №3 додана відсутність

Відповіді:


3

Я знаю, що ваше питання - Java, але мені дуже подобається ця архітектура стилю шини повідомлень для такого типу речей.

В основному, коли повідомлення надсилаються, вони можуть отримати два відповіді. Перший - з локального кешу, другий - із сервера, коли він підключається.

Я впевнений, що ви могли легко адаптувати цю архітектуру (шина носорога та nhib) до вашої (MQ та hib) досить легко.


Так, я шукав саме таку архітектуру, орієнтовану на повідомлення. Аргументи кеша та останнє речення у вашому зв’язаному переконали мене.
герцогство, яке відбулося

10

Робіть все локально та синхронізуйте періодично .

Ось що б я зробив, якби ти був (я не знаю про синхронізований фреймворк на Java, як у нас у .NET).

Підтримуйте часову позначку в локальній програмі, яка проводитиме останній час успішного підключення.

Незалежно від часу підключення, ця часова марка буде використовуватися для витягування нових даних, а потім для надсилання нових замовлень, створених локально.

Потім ви будете підтримувати дві часові позначки. Один, щоб визначити, коли замовлення створено (локально або в Інтернеті), і той, коли він був записаний сервером.

Я не рекомендую для цього чергу повідомлень. Раніше я використовував MQ для веб-сайту електронної комерції, який мав бути підключений до Navision. Все функціонувало в рамках Navision, а зміни надсилалися на веб-сайт електронної комерції через MQ, включаючи статус замовлення та все, включаючи описи товарів, ціни тощо. Нові замовлення надсилалися до Navision також через MQ.


Гммм, мені подобається ідея push-моделі, проте я бачу проблему, що при зміні часу на комп’ютері може виникнути втрата даних. До речі, я маю змогу кожен запис записувати в дизайні моєї бази даних. Чому ви не рекомендуєте MQ?
герцогство, яке відбулося

Правильно, ви повинні використовувати ПК, синхронізовані за часом та UTC, але зараз це досить стандартно (принаймні в Windows). MQ іноді необхідний, але я думаю, це було б занадто багато для того, який додаток ви розробляєте.

Гаразд, для того, щоб визначити пріоритетність надійності, краще скоріше подумати, що настільний додаток буде відключено, і, отже, краще ставитися до настільного додатка як до першокласного громадянина, проте я все ще маю враження, що MQ бути легшою заміною для реалізації локальної бази даних. Крім того, я думаю, що здійснення всіх операцій CRUD на сервері неявно покращує безпеку. Що ви думаєте про ці два моменти ?.
герцогство, яке відбулося

@dukeofgaming: у моєму випадку замовлення можна приймати з будь-якого POS (також додаток можна використовувати як систему прийому замовлень, а не систему обробки замовлень), включаючи веб. Все було розподілено по всій країні. Це було абсолютно необхідно, щоб кожен робочий стіл був автономним у разі відключення. MQ також працюватиме за таким сценарієм, тому я не проти. Я просто вважаю, що легше реалізувати потужну синхронізацію даних між майстер-серверами та клієнтами. Тому операція CRUD на головному сервері не була можливою.

2
+1 - це я бачив, як це робилося в минулому. Я б також сказав, що використання унікального ідентифікатора (Guids) в якості первинних ключів надзвичайно спрощує речі. Це - одна з тих речей, яка дійсно полегшує ваше життя, якщо вам потрібна синхронізація.
Скотт Вітлок

1

Або ви повинні подивитися на час від часу підключення до системних реалізацій баз даних, що робить бурхливу роботу синхронізації віддалених клієнтів із сервером. (У SQL Server це є певною мірою з SQL CE, Outlook це робить)

Таким чином, ви можете зробити всі зміни на локальному рівні у невеликій базі даних (це підтримує версії / логічні часові позначки тощо, так що вам не доведеться турбуватися про годинник ПК тощо), і коли ви переходите в Інтернет, ви синхронізуєте це з головним сервер.

Я не хотів би приймати рішення REST, коли система не може бути в Інтернеті більшість часу.


Чи описуєте ви розподілену базу даних? Чи можете ви це детальніше розробити?
герцогство,

Ні - це не розподілений db у реальному розумінні світу. Розподілений db зазвичай очікує, що майже все також буде в Інтернеті, але логіка реплікації серед однолітків, які знизилися, застосовується і тут. Є деякі бази даних на робочому столі / пристрої, які мають можливість виконувати роботу з реплікацією ( blogs.msdn.com/b/stevelasker/archive/2007/03/18/… ) - Отже, все, що вам потрібно зробити, - це налаштувати цей пристрій db, занотуйте зміни тут і коли ви підключитесь до комп'ютерної мережі, зателефонуйте синхронізуйте - і це зробить передачу даних на основний сервер для вас.
Subu Sankara Subramanian
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.