Подтвердить что ты не робот

Как вы держите две связанные, но отдельные системы в синхронизации друг с другом?

В моем текущем проекте разработки есть два аспекта. Во-первых, существует общедоступный веб-сайт, где внешние пользователи могут отправлять и обновлять информацию для различных целей. Затем эта информация сохраняется на локальном сервере SQL на объекте colo.

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

Две сети соединены аппаратным решением VPN, которое является достойным, но, очевидно, не самым быстрым в мире.

Две базы данных схожи и разделяют многие из тех же таблиц, но они не на 100% одинаковы. Многие таблицы с обеих сторон очень специфичны для внутреннего или внешнего приложения.

Итак, возникает вопрос: когда пользователь обновляет свою информацию или отправляет запись на общедоступном веб-сайте, как вы передаете эти данные во внутреннюю базу данных приложений, чтобы ее можно было управлять внутренним персоналом? И наоборот... как вы нажимаете обновления, сделанные сотрудниками, на веб-сайт?

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

До сих пор я думал об использовании следующих типов подходов:

  • Двунаправленная репликация
  • Интерфейсы веб-сервисов с обеих сторон с кодом для синхронизации изменений по мере их создания (в режиме реального времени).
  • Интерфейсы веб-сервисов с обеих сторон с кодом для асинхронной синхронизации изменений (с использованием механизма очередей).

Любые советы? Кто-нибудь сталкивался с этой проблемой раньше? Вы придумали решение, которое сработало для вас?

4b9b3361

Ответ 1

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

Вы должны иметь возможность достичь синхронизации в реальном времени без накладных расходов или сложности чего-то вроде репликации.

Синхронные веб-службы не идеальны, потому что ваш код должен быть очень сложным для обработки сценариев сбоев. Что происходит, когда одна система перезапускается, а другая продолжает публиковать изменения? Получает ли система отправки тайм-ауты? Что он делает с этими? Если вы не готовы потерять данные, вам понадобится какая-то транзакционная очередь (например, MSMQ) для получения уведомлений об изменениях и позаботиться о том, чтобы они попали в другую систему. Если какая-либо система не работает, изменения (переданные как сообщения) будут накапливаться, и как только соединение может быть установлено, сервер повторного запуска будет обрабатывать все сообщения в очереди и догонять, что значительно упрощает системную целостность.

Есть несколько инструментов с открытым исходным кодом, которые действительно могут сделать это легким для вас, если вы используете .NET(особенно если вы хотите использовать MSMQ).

Также есть коммерческие продукты, и если вы рассматриваете коммерческий вариант, см. здесь для списка опций на .NET. Конечно, WCF может делать асинхронные сообщения с использованием привязок MSMQ, но такой инструмент, как nServiceBus или MassTransit, предоставит вам очень простой интерфейс "Отправить/получить" или "Паб/Суб", который сделает ваше требование очень простой задачей.

Если вы используете Java, существует множество версий служебных шин с открытым исходным кодом, которые сделают этот вид двунаправленной асинхронной передачи сообщений как Mule или, возможно, просто ActiveMQ.

Вы также можете рассмотреть возможность читать Udi Dahan, слушая некоторые из его подкастов. Ниже приведены несколько дополнительных ресурсов, чтобы начать работу.

Ответ 2

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

Во-первых, вам нужно отслеживать изменения, если вы можете использовать SQL 2008 (даже версия Express достаточно, если ограничение 2Gb не является проблемой), это значительно облегчит боль, просто включите отслеживание изменений в базе данных и каждый Таблица. Мы используем SQL Server 2008 в головном офисе с расширенной схемой и SQL Express 2008 на каждом сайте с подмножеством данных и ограниченной схемой.

Во-вторых, вам нужно отслеживать ваши изменения, Sync using SQL Express Client в качестве отправной точки, обратите внимание, что он основан на SQL 2005, необходимо будет обновить его, чтобы воспользоваться возможностями отслеживания изменений в 2008 году. По умолчанию службы синхронизации используют SQL CE для клиентов, чего, я уверен, недостаточно в вашем случае. Вам понадобится служба, которая работает на вашем веб-сервере, которая периодически (может быть так же часто, как каждые 10 секунд, если вы хотите) запускает метод Synchronize(). Это сообщит вашей основной базе данных об изменениях, сделанных локально, а затем спросит сервер о всех сделанных там изменениях. Вы можете настроить код get и apply SQL для вызова хранимых процедур, и вы можете добавить обработчики событий для обработки конфликтов (например, Client Update vs Server Update) и разрешить их соответственно на каждом конце.

Ответ 3

У нас есть магазин как клиент, с тремя магазинами, подключенными к одной и той же VPN
В двух магазинах есть компьютер, работающий как "сервер" для этого магазина, а третий - "главная база данных"
Чтобы синхронизировать все с мастером, у нас нет лучшего решения, но оно работает: есть выделенный ПК, на котором выполняется приложение, которое проверяет метку каждой записи в каждой таблице двух магазинов, и если она отличается от того, что в последний раз вы синхронизируете, он копирует результаты
Обратите внимание, что это работает в обоих направлениях. То есть если вы обновите продукт в основной базе данных, это изменение будет распространяться на два других магазина. Если у вас новый заказ в одном из магазинов, он будет передан "хозяину".
При некоторых оптимизации вы можете синхронизировать все магазины примерно за 20 минут

Ответ 4

Недавно у меня был большой успех с SQL Server Service Broker, который предлагает надежные, сохраненные асинхронные сообщения из коробки с очень небольшим количеством сбоев в реализации.

  • Быстро настраивается, и, когда вы узнаете больше, вы можете использовать некоторые из более продвинутых функций.
  • Неизвестный для большинства, он также является частью настольных выпусков, поэтому его можно использовать в качестве системы обмена сообщениями рабочей станции.
  • Если у вас есть навыки T-SQL, их можно использовать, поскольку весь код для чтения и записи сообщений выполняется в SQL
  • Ослепительно быстро

Это значительно недоразвитая часть SQL Server и стоит посмотреть.

Ответ 5

Я бы сказал, что у меня есть работа, которая копирует данные в таблице ввода базы данных pub в таблицу ожидающих частной базы данных. Затем, как только вы обновите данные на частной стороне, они будут реплицированы в публичную сторону. Если у вас нет обновленных реплицированных данных в публичной части, это должно быть довольно простое решение для репликации транзакций.