Подтягивать внешние данные по каждому запросу или хранить локально?

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

Данные хранятся в JSON и центральном источнике, работающем на Nodejs и MongoDB. Клиентские сайты в основном Wordpress (несколько других сторонних CMS), и поэтому работают на PHP и MySQL.

Мы настроили его так, чтобы при каждом запросе извлекать данные (списки недвижимости) из центральной базы данных и отображать их как обычный HTML.

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

Мой вопрос: это идеальное решение? Что было бы лучше?

Моей первой мыслью было создание решений push / store, в которых центральный источник выталкивал данные по мере их сбора и сохранял их локально на каждом клиентском сайте. Но для этого, очевидно, потребуется какая-то инфраструктура базы данных на каждом клиенте, что, вероятно, сделает ее более сложной, чем необходимо.

Мысли?

1 ответ

Решение

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

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

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

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

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

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

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

Другие вопросы по тегам