Мы разрабатываем две взаимосвязанные системы. Один из них (A) будет установлен на машинах наших клиентов. Остальные (B) будут использоваться моей организацией.
Каждая система имеет свою собственную базу данных (реляционную), и их схемы различаются. Однако обе системы должны быть синхронизированы. Кроме того, некоторые изменения в B необходимо экспортировать во все системы класса A, а другие - только в конкретную.
У некоторых клиентов нет подключения к Интернету, поэтому синхронизацию в некоторых случаях следует выполнять посредством обмена файлами.
Итак, мы планируем решить эту проблему следующим образом:
- Каждая система ведет журнал изменений своей базы данных. Мы планируем реализовать это с MongoDB.
- Когда система инициализирует процесс синхронизации, она извлекает все внесенные изменения из журнала. Если система B, полученные изменения зависят от пункта назначения. Затем система сериализует их в формате XML и, наконец, отправляет их (через файл или сеть).
- Когда другая конечная точка получает набор изменений, она десериализует их. Затем система выполняет некоторые преобразования данных, которые могут быть необходимы, и, наконец, записывает изменения. На этом этапе, если это необходимо, система должна разрешить конфликты, которые могут существовать.
- Наконец, система-получатель отправляет свои изменения (и другие продукты разрешения конфликтов).
Является ли этот подход осуществимым, масштабируемым и элегантным? Какие изменения или дополнения вы бы сделали?
Ответы:
Если вы еще этого не сделали, возможно, вам будет интересно ознакомиться с системами, управляемыми событиями, источником событий и последовательной согласованностью. Система, которую вы описываете, имеет много параллелей с этими шаблонами, и это хорошо.
Ваш подход звучит хорошо, в частности:
Не зная больше о модели предметной области, я предполагаю, что разрешение конфликтов - это та часть, которая доставит вам больше всего хлопот. Я бы потратил некоторое время на размышления о том, как будут разрешаться конфликты любого рода. Особенно:
источник
Вы можете использовать хранилище событий . Там любое обновление данных создаст новое событие в магазине.
Вы можете использовать любой механизм для отправки событий, но было бы проще использовать шину, если это возможно, когда вам не нужно иметь дело с файлами. Как правило, они могут быть настроены для хранения сообщений до тех пор, пока не появится возможность их отправки.
Просто примените события к объектам вашего домена.
Используйте тот же подход.
источник