Как настроить обмен данными между сайтами, для автоматического обновления данных?
Прошу совета.
Имеется основной сайт – интернет магазин, каталог товаров около 4 тыс. товаров, на котором регулярно обновляются данные о стоимости товаров.
Для показа товаров в регионах созданы два дополнительных сайта на LARAVEL, с одинаковыми каталогами товаров. То есть, содержание каталогов, данные товаров на всех сайтах одинаковые.
Задача автоматизировать процесс обмена данными о ценах товаров. Стоимость товаров часто меняется, и менять цены руками на всех сайтах, основном и региональных - трудозатратно.
- Как лучше сделать обмен данными между сайтами для автоматического обновления стоимости товаров?
- Так, что бы после обновления цен товаров на основном сайте, остальные сайты получали и обновляли данные о стоимости товаров автоматически?
- Как это сделать наиболее рационально и правильно?
На ум приходит только организовать выгрузку на основном сайте обновленных данных каталога товаров в JSON или XML – формате, передачу и получение данных на дополнительных сайтах, и затем в цикле проводить запросы к базе, сравнение и обновление данных о стоимости каждого товара.
Подозреваю, 4 тыс. запросов к базе данных в цикле - не рационально, но как это сделать более разумно?
Дополнительно:
Содержание
менять цены руками на всех сайтах, основном и региональных - трудозатратно.
Менять цены руками - во-первых, неправильно. Именно в этом у вас и проблема.
Менялись бы они запросом к сайту - так три запроса не намного сложнее одного.
Фраза интенсивно намекает, что эти сайты - полная копия основного. То есть и код, и, главное, структура БД, совпадают с точностью до запятой.
Нет, не полная копия, основной сайт - работает на Bitrix, хотя дизайн и функционал похожи.
1. Вам необходимо сделать маппинг (сопоставление идентификаторов товаров) через дополнительные поля.
2. Далее формируете файл в любом удобном виде xml и т.п. с выборкой обновленных цен за определенный период (например за последние сутки) или всех цен и сохраняете его на сервере. Можете поставить задачу переформирования этого файла ежесуточно по cron.
3. С региональных сайтов настраиваете ежесуточное получение файла с основного сайта (например CURL) по cron.
4. На основе полученного файла формируете mysql запрос к БД. Вы можете обновить все нужные записи всего одним запросом. Т.е. обновление займет не более нескольких секунд максимум. При этом учитывайте настройку ограничения длины mysql запроса на ваших региональных сайтах.
Массив можно легко предварительно разбить на несколько частей и сформировать нужное число запросов. Например в одном запросе к БД обновлять 500 записей.
Ответы:
На ум приходит только организовать выгрузку на основном сайте обновленных данных каталога товаров в JSON или XML – формате, передачу и получение данных на дополнительных сайтах, и затем в цикле проводить запросы к базе, сравнение и обновление данных о стоимости каждого товара.
Именно так и использовать, поскольку у вас нет единой базы данных на все сайты. Только нужно написать скрипты, чтобы все операции осуществлялись в полуавтоматическом режиме с логированием каждого действия и ошибок на каждом этапе импорта/экспорта.
Подозреваю, 4 тыс. запросов к базе данных в цикле - не рационально, но как это сделать более разумно?
Вообще, ерунда. Конечно, нужно продумать использовать очереди, если такой пакет обновлений проходит значительное время. И не забыть правильно настроить блокировки в транзакциях, чтобы не получить коллизии данных во время выполнения импорта/экспорта, если в это время будут делать заказы на изменяемый товар.
PS:
два дополнительных сайта на LARAVEL,
По хорошему, это должен быть один сайт, только изменяется дизайн и кука, какой регион выбран в переключалке и на какой домен редиректнуть пользователя в зависимости от его выбора или геолокации. Тогда бы проблем вообще не возникло.
- Ну, вообще-то вопросы именно в цикле будут 4 тысячи раз дергать базу.
Имеет смысл как минимум собрать их в один (несколько запросов) пакетом (транзакцией). - Делайте локальный сервер с копиями сайта, и пытайтесь делать импорт/экспорт данных по скрипту, замеряйте время выполнения, и адекватно ли выставлены блокировки. А сколько тыс. запросов выполняется, это уже по результатам замеров будете исправлять оптимизировать.
- обновления должен вызывать исходный сайт, только он знает когда происходит обновление цен
созданы два дополнительных сайта на LARAVEL, с одинаковыми каталогами товаров.
Фраза интенсивно намекает, что эти сайты - полная копия основного. То есть и код, и, главное, структура БД, совпадают с точностью до запятой.
Соответственно первое, что приходит в голову - организация и настройка репликации. Под основным сайтом мастер, в регионах слейвы. Тогда больше вообще ничего не нужно делать, оно "само" отсинхронизируется.
Если это по какой-то причине невозможно - то обновление стоимости товаров оформляется в виде необходимых для выполнения операции наборов INSERT/UPDATE/DELETE запросов и выполняется на всех трёх серверах.
Стоимость товаров часто меняется, и менять цены руками на всех сайтах, основном и региональных - трудозатратно.
Если это можно, хотя и затратно, сделать руками - то с точки зрения СУБД это ни разу не "часто", а наоборот - чертовски редко.
- Maксим Волков
Нет, не полная копия, основной сайт - работает на Bitrix, хотя дизайн и функционал похожи.
Ок, повторяю. Если это (репликация) по какой-то причине невозможно - то обновление стоимости товаров оформляется в виде необходимых для выполнения операции наборов INSERT/UPDATE/DELETE запросов и выполняется на всех трёх серверах.
Как вариант - набор триггеров, который конвертирует операции на основном сервере в готовые запросы, которые пишутся в отдельную таблицу. Либо в эту таблицу кладётся финальное состояние изменённых записей. Тогда эта информация сбрасывается в файл, аплоадится на региональные серверы и там пишется в таблицы.
Подозреваю, 4 тыс. запросов к базе данных в цикле - не рационально, но как это сделать более разумно?
Обновляйте только изменённые, то есть события onAdd/Update/Delete . Только желательно делать это асинхронно, то есть обработчик должен только складывать задание на модификацию данных в очередь.
Исходный сайт должен инициировать обновления цен в базах остальных в момент изменения (чтобы не делать наоборот, другие сайты периодически бездумно стучатся в базу основного с вопросом - изменились ли цены), т.е. буквально в момент когда в коде сайта идут обновления базы, дублировать вызов этих же запросов на подчиненных сайтах (тогда таблицы с товарами будут идентичны) - это фактически репликация базы данных в формате master -> slave но в 'ручном' режиме. Кода для этого понадобится совсем немного, понадобится разработкать какой то минимальный api для взаимодействия с подчиненными сайтами (буквально отсылка sql запроса, обязательно с авторизацией).
Некоторые базы данных позволяют средствами администрирования настроить то же самое для выбранных таблиц (а не всей базы), тогда даже не понадобится править код бакэнда.
Даже если база данных не умеет реплицировать выбранные таблицы, можно настроить master->slave репликацию на новосозданную копию основной базы на подчиненных веб сайтах, и на них уже делать запросы в соседнюю базу (все базы данных позволяют обращаться в запросах к соседней базе данных, но могут не работать транзакции)
Для решения данной проблемы вы можете воспользоваться услугами фрилансеров. Мы выполним необходимую работу быстро и качественно.
Оставить комментарий Отменить
Ответы
- Есть ответ! к записи Как уменьшить масштаб меньше 100% в Windows 10 (22H2)
- Есть ответ! к записи Аналоги CloudFlare в России?
- Есть ответ! к записи Аналоги CloudFlare в России?
- Есть ответ! к записи Как называется человек, который дизайн придумает для сайта и сверстает его?
- Есть ответ! к записи Можно ли установить Яндекс.Диск на АльтЛинукс?
- Есть ответ! к записи Картинки мутные только на сафари, есть выход?
- Есть ответ! к записи Keenetic. Как настроить SSTP клиент с сертификатом?
- Есть ответ! к записи Чем заменить executor в aiogram 3?
Для настройки обмена данными между сайтами для автоматического обновления данных можно использовать различные методы, такие как AJAX запросы, WebSockets, Server-Sent Events или даже использование API.
Один из самых распространенных способов - это использование AJAX запросов. AJAX позволяет отправлять асинхронные запросы на сервер без перезагрузки страницы. Для этого можно использовать jQuery, например:
Если вам необходимо обновлять данные в реальном времени, можно воспользоваться WebSockets. WebSockets позволяют устанавливать постоянное соединение между клиентом и сервером для передачи данных в обе стороны. Например, с использованием библиотеки Socket.io:
Для односторонней передачи данных от сервера к клиенту можно использовать Server-Sent Events. Например:
Если у вас есть возможность использовать API для обмена данными между сайтами, это может быть более надежным и удобным способом. В этом случае вам необходимо создать API на сервере, который будет предоставлять данные для обновления, и использовать AJAX запросы для получения этих данных на клиенте.
Выбор конкретного метода обмена данными зависит от ваших потребностей и возможностей. Необходимо учитывать какие данные вы хотите обменивать, как часто данные должны обновляться, и какие технологии вы можете использовать.