Каков наилучший способ отработки отказа в автономном режиме клиента настольного компьютера, который использует веб-службу?

13

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

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

Мое решение

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

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

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

Мой вопрос

  1. Что является лучшим решением, которое масштабируется, что означает максимальную эффективность с минимальными усилиями (и предпочтительно без дополнительных затрат, например, покупка сервера резервного копирования для локальной работы)?

  2. Кто еще имел дело с этим раньше? Как вы решили свою проблему? Какие уроки вы можете поделиться?

  3. Как вы справились с синхронизацией?

Изменить: Добавил недостающую часть в мой вопрос в пункте № 3

dukeofgaming
источник

Ответы:

3

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

Обычно при отправке сообщений они получают два ответа. Первый - из локального кэша, второй - с сервера, когда он подключается.

Я почти уверен, что вы могли бы достаточно легко адаптировать эту архитектуру (шины носорогов и nhib) к своей (MQ и hib).

ручей
источник
Да, я искал именно такую ​​архитектуру, ориентированную на сообщения. Аргументы кеша и последнее предложение в вашей ссылке убедили меня.
dukeofgaming
10

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

Вот что я бы сделал, если бы я был тобой (я не знаю об инфраструктуре синхронизации в Java, как у нас в .NET).

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

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

Затем вы будете поддерживать две метки времени. Один, чтобы определить, когда заказ был создан (локально или онлайн), и один, когда он был записан сервером.

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

Вальтер
источник
Хммм, мне нравится идея использования push-модели, однако я вижу проблему в том, что, если время компьютера меняется, возможна потеря данных. Кстати, у меня есть соглашение, чтобы в каждой записи базы данных были отмечены все записи времени. Почему вы не рекомендуете MQ?
Dukeofgaming
Правильно, вы должны использовать синхронизированные по времени ПК и UTC, но сейчас это довольно стандартно (по крайней мере, в Windows). MQ иногда необходим, но я думаю, что это будет слишком много для того типа приложения, которое вы разрабатываете.
Итак, чтобы расставить приоритеты над надежностью, лучше подумать, что настольное приложение будет отключено, и поэтому лучше относиться к настольному приложению как к первоклассному гражданину, однако у меня все еще есть впечатление, что MQ быть более простой заменой для реализации локальной базы данных. Кроме того, я думаю, что выполнение всех операций CRUD на сервере неявно обеспечивает лучшую безопасность. Что вы думаете об этих двух пунктах?
Dukeofgaming
@dukeofgaming: в моем случае заказы можно было принимать из любого POS (также приложение можно использовать как систему приема заказов, а не как систему обработки заказов), включая веб. Все было распространено по всей стране. Было абсолютно необходимо, чтобы каждый рабочий стол был автономным в случае отключения. MQ тоже сработает в этом сценарии, так что я не против. Я просто чувствую, что проще реализовать надежную синхронизацию данных между главными серверами и клиентами. Поэтому операция CRUD на главном сервере не была возможной.
2
+1 - это то, как я видел это в прошлом. Я бы также сказал, что использование uniqueidentifier (Guids) в качестве первичных ключей упрощает работу. Это одна из тех вещей, которая действительно облегчает вашу жизнь в будущем, если вам нужна синхронизация.
Скотт Уитлок
1

Или вы должны взглянуть на время от времени связанные реализации баз данных систем, которые выполняют основную работу по синхронизации удаленных клиентов с сервером. (SQL Server в некоторой степени поддерживает SQL CE, Outlook это делает).

Таким образом, вы можете делать все свои изменения локально в небольшой базе данных (она поддерживает управление версиями / логические метки времени и т. Д., Чтобы вам не приходилось беспокоиться о часах ПК и т. Д.), И всякий раз, когда вы выходите в интернет, вы синхронизируете это с основной сервер.

Я бы не стал использовать REST-решение, когда система большую часть времени не может быть подключена к сети.

Субу Шанкара Субраманян
источник
Вы описываете распределенную базу данных? Можете ли вы уточнить это?
dukeofgaming
Нет - это не распределенная БД в смысле реального мира. Распределенная база данных обычно ожидает, что почти все также будет в сети, но логика репликации среди сверстников, которые отказались, применима и здесь. Существуют некоторые базы данных настольных компьютеров / устройств, которые могут выполнять репликацию ( blogs.msdn.com/b/stevelasker/archive/2007/03/18/… ) - поэтому все, что вам нужно сделать, это настроить эту устройства, регистрируйте свои изменения здесь, а когда вы подключаетесь к компьютерной сети, вызывайте синхронизацию - и это сделает передачу данных на главный сервер за вас.
Субу Шанкара Субраманян