Иногда вопрос автономной архитектуры приложения - PullRequest
2 голосов
/ 16 декабря 2008

У меня есть n-уровневое клиент-серверное приложение winform, работающее с базой данных sqlserver. Я хочу, чтобы он мог иногда запускаться в автономном режиме (не подключен к БД) и при повторном подключении согласовывать изменения с основной БД. Теперь я должен принять жесткое архитектурное решение: использовать репликацию базы данных или управлять ею самостоятельно с помощью очередей / сценариев и т. Д. Мое приложение довольно сложное - я использую базу данных с таблицами, содержащими ключи автоинкремента и ограничения внешних ключей между таблицами. Часть моих данных не встроена в БД, как картинки и документы. Мне бы очень хотелось услышать ваше мнение и прошлый опыт! Спасибо, Ади

Ответы [ 5 ]

2 голосов
/ 16 декабря 2008

( Отказ от ответственности : я предполагаю, что вы уже рассмотрели вопрос об использовании .NET DataSets и обесценили их, учитывая, что они предназначены для решения только проблемной области, в которой вы находитесь описывающее.)

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

Наш обмен данными происходил каждую ночь: магазины подключались к головному офису в заранее установленное время, загружали пакет изменений данных и загружали аналогичный пакет изменений данных, которые должны были применяться к локальной базе данных этого магазина. Затем у нас были так называемые «механизмы синхронизации данных» на обоих сайтах (головной офис и магазины), которые обрабатывали эти пакеты данных, складывая изменения (вставки / обновления / удаления) обратно в соответствующую базу данных.

Когда вы выполняете базовую репликацию данных, как это, есть ряд потенциальных ловушек, как упомянул Серхио. Одним из них является идентичность, а именно то, как вы получаете первичный ключ, который однозначно идентифицирует строку таблицы. Другой - управление версиями, и как вы обрабатываете конфликты между различными версиями одной и той же строки.

В нашем случае мы упростили себе задачу (-ier!), Используя GUID в качестве первичных ключей вместо использования автоинкрементных столбцов. Использование GUID не без проблем, но в нашем случае это означало, что мы могли бы назначить первичный ключ для новой строки данных и не беспокоиться о том, чтобы кто-то другой использовал его.

Я немного запутался в том, как мы справились с проблемой управления версиями (это было несколько лет!), Но по памяти я думаю, что у нас было две метки времени в каждой строке таблицы: одна из них записывала дату / время, когда строка был обновлен в головном офисе; другой, когда это было обновлено в магазине. В каждом ряду также было два «номера версий», которые указывали версию ряда в головном офисе и в магазине. Сверка данных включала сравнение этих временных меток и номеров версий друг с другом, с последним изменением, «выигравшим» (при условии, что другая сторона, конечно, не изменила строку).

Как отмечает Серхио, вашей самой большой проблемой будет обработка конфликтов согласования данных. В нашем случае это произошло, когда магазин и головной офис изменили один и тот же элемент данных в один и тот же день. Мы работали над этим, всегда терпя неудачу с изменениями в цехе, и создавая специальное приложение для сверки данных в головном офисе, которое вовлекало пользователя, визуально сравнивающего и объединяющего две конфликтующие версии элемента данных. Теоретически, я полагаю, вы могли бы автоматизировать объединение различных версий, используя некоторые пользовательские правила обработки, но вам нужно было бы взвесить стоимость разработки чего-то подобного в сравнении с вероятностью возникновения конфликтов. По памяти это никогда не было такой большой проблемой для нашей системы, несмотря на большое количество магазинов (несколько сотен), вносящих изменения в один и тот же набор данных. YMMV конечно.

0 голосов
/ 23 мая 2009

Вы должны взглянуть на Microsoft Sync Framework .

Построение иногда автономного решения самостоятельно с нуля является сложной задачей. В моей карьере я видел много хороших команд разработчиков. Я не говорю, что у вас будут проблемы с его созданием, но почему бы не использовать то, что уже существует? И если вы обнаружите, что он не соответствует вашим потребностям, вы, вероятно, лучше поймете, как кодировать собственное решение.

Компромисс в том, что вам придется изучать Synch Framework, но есть примеры, которые вы, вероятно, можете использовать немедленно.

0 голосов
/ 24 декабря 2008

Обычно это модель портфеля, вы можете использовать Службы синхронизации Microsoft для ADO.NET

0 голосов
/ 16 декабря 2008

Я делал это несколько раз в разных местах (см. Ответ Стива Рэндса ниже), и я настоятельно призываю вас НЕ использовать обычную репликацию - особенно если будет задействовано несколько баз данных.

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

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

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

Я только что купил подержанную копию Библии репликации Apress SQL Server 2005 (не в офисе, поэтому у меня нет автора, но это рекомендованный монстр) - в первой паре из глав я начал понимать, что репликация не является волшебным решением, если вы действительно меняете данные с двух (или более) концов. :-)

0 голосов
/ 16 декабря 2008

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

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

Я бы имел битовый столбец и метку даты на каждой таблице на клиенте, чтобы я мог проверить, какие записи были изменены в автономном режиме. На стороне сервера будет иметь место столбец с датой, чтобы записать последнее обновление объекта.

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

Это самая легкая часть ... Теперь, когда все станет грязно ... Вы должны принять во внимание, что это принесет вам много головной боли ... Будут происходить всякие или нежелательные события, некоторые примеры : - Два пользователя изменяют одну и ту же запись в автономном режиме. - Один пользователь меняет запись в режиме онлайн, а другой в автономном режиме - Один пользователь удаляет запись в режиме онлайн, а другой работает в автономном режиме

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...