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

Прошу совета.
Имеется основной сайт – интернет магазин, каталог товаров около 4 тыс. товаров, на котором регулярно обновляются данные о стоимости товаров.

Для показа товаров в регионах созданы два дополнительных сайта на LARAVEL, с одинаковыми каталогами товаров. То есть, содержание каталогов, данные товаров на всех сайтах одинаковые.

Задача автоматизировать процесс обмена данными о ценах товаров. Стоимость товаров часто меняется, и менять цены руками на всех сайтах, основном и региональных - трудозатратно.

  • Как лучше сделать обмен данными между сайтами для автоматического обновления стоимости товаров?
  • Так, что бы после обновления цен товаров на основном сайте, остальные сайты получали и обновляли данные о стоимости товаров автоматически?
  • Как это сделать наиболее рационально и правильно?


На ум приходит только организовать выгрузку на основном сайте обновленных данных каталога товаров в JSON или XML – формате, передачу и получение данных на дополнительных сайтах, и затем в цикле проводить запросы к базе, сравнение и обновление данных о стоимости каждого товара.

Подозреваю, 4 тыс. запросов к базе данных в цикле - не рационально, но как это сделать более разумно?
  • Вопрос задан
  • 137 просмотров
Решения вопроса 1
@3leonov
1. Вам необходимо сделать маппинг (сопоставление идентификаторов товаров) через дополнительные поля.
2. Далее формируете файл в любом удобном виде xml и т.п. с выборкой обновленных цен за определенный период (например за последние сутки) или всех цен и сохраняете его на сервере. Можете поставить задачу переформирования этого файла ежесуточно по cron.
3. С региональных сайтов настраиваете ежесуточное получение файла с основного сайта (например CURL) по cron.
4. На основе полученного файла формируете mysql запрос к БД. Вы можете обновить все нужные записи всего одним запросом. Т.е. обновление займет не более нескольких секунд максимум. При этом учитывайте настройку ограничения длины mysql запроса на ваших региональных сайтах.
Массив можно легко предварительно разбить на несколько частей и сформировать нужное число запросов. Например в одном запросе к БД обновлять 500 записей.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 4
@alexalexes
На ум приходит только организовать выгрузку на основном сайте обновленных данных каталога товаров в JSON или XML – формате, передачу и получение данных на дополнительных сайтах, и затем в цикле проводить запросы к базе, сравнение и обновление данных о стоимости каждого товара.

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

Вообще, ерунда. Конечно, нужно продумать использовать очереди, если такой пакет обновлений проходит значительное время. И не забыть правильно настроить блокировки в транзакциях, чтобы не получить коллизии данных во время выполнения импорта/экспорта, если в это время будут делать заказы на изменяемый товар.
PS:
два дополнительных сайта на LARAVEL,

По хорошему, это должен быть один сайт, только изменяется дизайн и кука, какой регион выбран в переключалке и на какой домен редиректнуть пользователя в зависимости от его выбора или геолокации. Тогда бы проблем вообще не возникло.
Ответ написан
@Akina
Сетевой и системный админ, SQL-программист.
созданы два дополнительных сайта на LARAVEL, с одинаковыми каталогами товаров.

Фраза интенсивно намекает, что эти сайты - полная копия основного. То есть и код, и, главное, структура БД, совпадают с точностью до запятой.

Соответственно первое, что приходит в голову - организация и настройка репликации. Под основным сайтом мастер, в регионах слейвы. Тогда больше вообще ничего не нужно делать, оно "само" отсинхронизируется.

Если это по какой-то причине невозможно - то обновление стоимости товаров оформляется в виде необходимых для выполнения операции наборов INSERT/UPDATE/DELETE запросов и выполняется на всех трёх серверах.

Стоимость товаров часто меняется, и менять цены руками на всех сайтах, основном и региональных - трудозатратно.

Если это можно, хотя и затратно, сделать руками - то с точки зрения СУБД это ни разу не "часто", а наоборот - чертовски редко.
Ответ написан
Подозреваю, 4 тыс. запросов к базе данных в цикле - не рационально, но как это сделать более разумно?

Обновляйте только изменённые, то есть события onAdd/Update/Delete . Только желательно делать это асинхронно, то есть обработчик должен только складывать задание на модификацию данных в очередь.
Ответ написан
Комментировать
@rPman
Исходный сайт должен инициировать обновления цен в базах остальных в момент изменения (чтобы не делать наоборот, другие сайты периодически бездумно стучатся в базу основного с вопросом - изменились ли цены), т.е. буквально в момент когда в коде сайта идут обновления базы, дублировать вызов этих же запросов на подчиненных сайтах (тогда таблицы с товарами будут идентичны) - это фактически репликация базы данных в формате master -> slave но в 'ручном' режиме. Кода для этого понадобится совсем немного, понадобится разработкать какой то минимальный api для взаимодействия с подчиненными сайтами (буквально отсылка sql запроса, обязательно с авторизацией).

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

Даже если база данных не умеет реплицировать выбранные таблицы, можно настроить master->slave репликацию на новосозданную копию основной базы на подчиненных веб сайтах, и на них уже делать запросы в соседнюю базу (все базы данных позволяют обращаться в запросах к соседней базе данных, но могут не работать транзакции)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы