Прием по телефону ---->
Прием через программу-клиент---->| БД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.