URL: https://www.opennet.ru/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 7138
[ Назад ]

Исходное сообщение
"Синхронизация данных двух различных БД"

Отправлено wDevil , 31-Янв-08 14:30 
Прием по телефону           ---->                                  
Прием через программу-клиент---->| БД1 | --internet--| БД2 |--- Сайт
                                                                  
В БД1 хранится информация о товарах и о заказах.
Есть сайт с БД2, через который так же для посетителей будет возможность просматривать информацию о товарах и заказывать товары.
Условия:
1. БД2 и БД1 могут быть совершенно различные(одна mysql, другая pgsql или любая другая)
2. Необходимо рассчитывать посещаемость сайта с запасом, т.е предполагать что она может быть достаточно серьезной, чтобы это учитывать
3. Информации о товарах много, потому можно считать что 1 посетитель может совершать большое число запросов к БД получению информации о товарах. И после этого делает запрос на заказ. Т.е. запросов о товарах много больше, чем запросов на оформление заказов.
4. Структура данных товаров БД1 может быть различной
5. Необходимо поддержание актуальности информации о товарах
6. Необходимо отсутствие конфликтов в заказах(возникновение 2 заказов на один и тот же товар общим количеством больше чем имеется и.т.д)
7. Периодичность обновления информации о товарах: каждый день, порядка 20-30% от общего объема
8. Сайт с БД2 располагается на хостинге. Не виртуальный сервер, а обычный аккаунт. Возможностей под свой физический или виртуальный сервер пока нет.

Как организовать совместнуню работу сайта с БД2 и БД1?


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

Так же можно кешировать инфу -- уменьшим число запросов в БД1 -- быстрей все будет для посетителя

"+"
1. Нет проблем с актуальностью информации
2. Нет проблем с конфликтом заказов
3. Вся информация с БД1 никуда не распределяется и остается в одном месте


Вариант 2.
Выносим информацию о товарах и услугах из БД1 сайта в БД2. Т.е оператор будет вносить информацию сразу в БД2, допустим через web-Интерфейс.
"-"
1. Увеличиваем нагрузку на БД2 --> нагрузка на сервер -->дольше время обработки запросов посетителей
2. Проблемы с реорганизацией работы в той части схемы, где БД1

"+"
1. Нет проблем с актуальностью информации
2. Нет проблем с конфликтом заказов


Вариант 3.
Делаем web-службу(SOAP) на сервере, где БД1, которая по запросу будет выдавать в XML данные о товарах и о заказах, принимать заказы.

"-"
1. Время генерации страницы посетителю на сайте, будет лимитироваться работой web-службы и передачей информации на сервер, обработкой XML на сервере и.т.д
2. Увеличение нагрузки, из-за необходимости обработки XML данных и их кешировании(допустим в БД2).
3. Частично переписываем web-службу для каждой БД1

"+"
1. Уменьшаем проблемы с актуальностью информации
2. Нет проблем с конфликтом заказов

Допустим, можно сделать кеширование информации о товарах, получаемых от web-служб, на сервере, где БД2. Уменьшим число запросов. НО возникает проблема актуальности кеша. Будем грохать кеш по времени жизни и по событию (изменение информации об услугах). Т.е. сделав по сути копию данных об услугах на сервере в БД2, снижаем время на доступа к ним, но появляются расходы на поддержание ее актуальности.

Ситуация 1.
Посетитель запрашивает количество товара. Идет запрос к веб-службе. Получаем ответ, выдаем посетителю. Посетитель выбирает формирует заказ, сабмитит. НО за это время информация о количестве товара изменилась в БД1(скажем приняли заказ по телефону). Надо отдать ошибку. Далее выдать посетителю. Не будет ли все это сложно средствами web-службы?

Вариант 4.
Перемещаем информацию о заказах в БД2 из БД1. Товары остаются в БД1 и получаем их через web-службу(SOAP).
"-"
1. Время генерации страницы посетителю на сайте, будет лимитироваться работой web-службы и передачи этого на сервер, обработкой XML и.т.д
2. Небольшое увеличение нагрузки на сервер с БД2 из-за того, что БД2 будет грузить оператор, размещая заказы, которое раньше бы он разместил в БД1 --> рост времени генерации странички для посетителя
3. Частичная реорганизация работы схемы в части, где БД1.

"+"
1. Нет проблем с актуальностью информации
2. Нет проблем с конфликтом заказов
3. Время обработки заказа снижается для посетителя сайта, но растет для оператора
Все вопросы кеширования остаются.


Вариант 5.
Оставляем всю информацию в БД1. И реализуем так, что при каждом изменении в заказах и товарах, будет отсылаться на сервер с БД2 и кешироваться. Тут два варианта:
а. либо прямой доступ к БД2
б. будем отсылать в xml и на сервере с БД2 парсить его и обновлять информацию.
"-"
1. нагрузка на сервер с БД2 растет на 20-30% минимум
2. вопросы актуальности кэша и его обновления

"+"
1. Оператор работает с своей БД1 и потому у него работает все относительно шустро
2. Вся информация с БД1 никуда не распределяется и остается в одном месте


У меня нет опыта в организации работы подобных схем. Это вроде все схемы, которые пришли в голову. Может есть другие варианты или замечания/предложения по мною описанным решениям? Может какие-то из них не реализуемы, т.е я упустил их минусы, буду рад если мой список сократится, а значит и выбор будет сделать проще. Web-служба(SOAP) предполагает быть написанной на php, сайт тоже на php с примененим CMF CakePHP.


Содержание

Сообщения в этом обсуждении
"Синхронизация данных двух различных БД"
Отправлено anonymous , 01-Фев-08 08:31 
Подумайте о том, что информацию об обновлении одной базы можно передавать другой базе не немедленно, а накапливать в течении некоторого времени и отдавать сразу "пачками" раз в n минут.  Например, оператор обновляет товары в БД1. Каждая строка в нужной таблице имеет поле "время изменения".  По этому полю раз в n минут выбираете строки и отсылаете изменения на другой сервер.

"Синхронизация данных двух различных БД"
Отправлено kriogen , 01-Фев-08 08:39 
>Подумайте о том, что информацию об обновлении одной базы можно передавать другой
>базе не немедленно, а накапливать в течении некоторого времени и отдавать
>сразу "пачками" раз в n минут.  Например, оператор обновляет товары
>в БД1. Каждая строка в нужной таблице имеет поле "время изменения".
> По этому полю раз в n минут выбираете строки и
>отсылаете изменения на другой сервер.

Как я понял, данный вариант не подходит, так как важен именно оперативный обмен данными, чтобы избежать проблем, например, с такой ситтуацией:

- В БД1 есть товар1, он передаётся в момент времени t1 в БД2 - базы идентичны.
- В БД2 делается заказ заказ1 на товар1 в момент времени t2.
- B БД1 товар1 удаляется (кончился, например) в момент времени t3.
- В момент времени t4 происходит синхронизация и получаем заказ на несуществующий товар..

видимо синхронизацию нужно инициализировать сразу после _каждого_ изменения одной из БД.. но это получается накладно


"Синхронизация данных двух различных БД"
Отправлено kriogen , 01-Фев-08 08:44 
>Подумайте о том, что информацию об обновлении одной базы можно передавать другой
>базе не немедленно, а накапливать в течении некоторого времени и отдавать
>сразу "пачками" раз в n минут.  Например, оператор обновляет товары
>в БД1. Каждая строка в нужной таблице имеет поле "время изменения".
> По этому полю раз в n минут выбираете строки и
>отсылаете изменения на другой сервер.

Хотя это хорошая идея для определённых действий, которые не вызовую конфликта с заказами из БД2, например, для добавления нового товара в БД1.