Служба REST в качестве сервера приложений для 2000+ клиентских машин. Это хорошая идея?

11

Мы будем строить систему с пользовательским интерфейсом в javaFx, которая будет развернута на более чем 2000 компьютерах (минимум 2000, но будет больше - может достигать 5000 машин).

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

Машины 2000+ будут находиться в разных географических группах. В целом, соединение хорошее, но может и не быть таким хорошим в более удаленных местах.

Вместо непосредственного доступа к базе данных я думаю о создании кластера служб REST с использованием Spring + Spring Boot + Spring Data (Java).

Служба REST примет и вернет Json.

Я думаю, что это хорошая идея, потому что:

  • Служба будет действовать как пул соединений с базой данных (я думаю, что более 2000 соединений с базой данных вызовут проблемы);
  • Для обслуживания некоторых запросов можно иметь базу данных с доставкой журналов в другую базу данных только для чтения;
  • Это будет лучше масштабироваться, поскольку мы можем добавить больше машин для запуска сервисов REST;
  • Возможно использование HTTPS со сжатием в целях безопасности и экономии пропускной способности;
  • Можно внести некоторые централизованные изменения в бизнес-объекты без повторного развертывания компьютеров 2000+;
  • Он лучше интегрируется с другими системами (просто укажите на службу REST).

Это действительно хорошая идея?

Можете ли вы поделиться положительным или отрицательным опытом?

Спасибо.

Тьяго Саяо
источник
1
Я думаю, что это разумная идея, тем более что REST разработан с учетом кеширования. Вы можете рассмотреть возможность использования веб-сокетов для уменьшения нагрузки от непостоянных клиентских подключений, но это зависит от модели использования вашего API. WebSocket начинает показывать свои сильные стороны, когда становится возможным объединить большое количество небольших транзакций req / res в постоянные соединения. Тем не менее, это может быть проще просто масштабировать ...
БИК
8
Базы данных никогда не должны быть доступны из общедоступного Интернета и всегда должны находиться за брандмауэром - поэтому их защита с помощью API REST или аналогичного является стандартной процедурой. Это также позволяет более легко добавлять другие функции безопасности, например, запретить пользователям редактировать записи данных, которые они не имеют права просматривать или редактировать.
Амон

Ответы:

3

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

Служба будет действовать как пул соединений с базой данных (я думаю, что более 2000 соединений с базой данных вызовут проблемы);

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

Кэширование может помочь в этом, чтобы вернуть уже извлеченные данные (как я уже сказал, зависит от того, что вы пытаетесь сделать - если запросы уникальны, вы не можете много кешировать).

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

Для обслуживания некоторых запросов можно иметь базу данных с доставкой журналов в другую базу данных только для чтения;

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

Существуют различные способы защиты: кэширование, о котором я уже упоминал (зависит от вашего варианта использования), дублирование некоторой информации на других серверах для обслуживания некоторых запросов, как вы упомянули, CQRS (зависит от вашего варианта использования), использование реляционных и нереляционных (снова зависит от вашего варианта использования) и т. д.

Обратите внимание, что когда вы распространяете такие данные, теорема CAP начинает применяться. Помните об этом, поскольку вам может потребоваться компромисс между согласованностью и доступностью.

Это будет лучше масштабироваться, поскольку мы можем добавить больше машин для запуска сервисов REST;

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

Возможно использование HTTPS со сжатием в целях безопасности и экономии пропускной способности;

Да, а также другие вещи ... может быть, вы хотите аутентификацию / авторизацию позже и т. Д.

Можно внести некоторые централизованные изменения в бизнес-объекты без повторного развертывания компьютеров 2000+;

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

Он лучше интегрируется с другими системами (просто укажите на службу REST).

Да, но это означает, что клиенты для вашего сервиса, возможно, вы не можете контролировать.

Если вы делаете серьезные изменения и у вас есть хорошая стратегия для обновления 2000+ JavaFX-клиентов, то нет проблем. Но если существуют другие клиенты, и вы не можете контролировать их, вам может потребоваться реализовать управление версиями в службе REST и поддерживать более одной версии, пока каждый не сможет обновить ее до последней версии.

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

Просто мои 2 цента!

Богдан
источник
Хороший ответ. Я только хотел подчеркнуть Тьяго, что стоит рассмотреть возможность создания версий в RESTful API как можно скорее. Возможно, вам не нужно делать это с самого начала, но вы должны знать об этом и быть готовыми.
Даниэль Холлинрейк,