Спокойное общение между локальными приложениями - это хорошая идея? - PullRequest
8 голосов
/ 23 октября 2010

Интересно, стоит ли разрешать локальным приложениям (на одном сервере) обмениваться данными друг с другом полностью через Restful API?

Я знаю, что это не редкость, потому что у нас уже есть приложения, такие как CouchDB, которые используют HTTP REST для связи, даже с локальными приложениями.

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

Таким образом, эти приложения / модули могут быть на любом языке, и они могут связываться по проводам между серверами.

Но у меня есть несколько вопросов:

  • Это хорошая идея?
  • Будет ли передача данных между ними медленной?
  • Если я сделаю это, то каждое приложение / модуль должен быть HTTP-сервером, верно? Так что, если мое приложение использует 100 приложений / модулей, то каждое из них должно быть локальным веб-сервером HTTP, каждый из которых работает на другом порту (http://localhost:81, http://localhost:82, http://localhost:83 и т. Д.), Верно?
  • Есть ли какие-нибудь передовые практики / ошибки, о которых мне следует знать?

Ответы [ 5 ]

6 голосов
/ 23 октября 2010
  • Это хорошая идея?

Конечно, возможно.

  • Будет ли передача данных между ними медленной?

Да!Но по сравнению с чем?По сравнению с внутренними внутренними звонками, абсолютно - это будет ледниковым.По сравнению с другим сетевым API, не обязательно медленнее.

  • Если я это сделаю, то каждое приложение / модуль должен быть HTTP-сервером, верно?Поэтому, если мое приложение использует 100 приложений / модулей, я должен иметь 100 локальных веб-серверов HTTP, каждый из которых работает с различным портом (http://localhost:81, http://localhost:82, http://localhost:83 и т. Д.)?

Нет, нет причин выделять порт для модуля.Все виды способов сделать это.

  • Есть ли какие-либо передовые практики / хит-парады, о которых я должен знать?

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

Вы говорите, на самом деле, используете архитектуру REST или просто отправляете вещи назад ивперед через HTTP?(Это разные вещи) REST несет свои собственные расходы, включая встроенные связи, вездесущие и распространенные типы данных и т. Д.

Наконец, вам просто может не понадобиться это делать.Это может быть «круто», «приятно иметь», «хорошо выглядит на белой доске», но если это действительно не нужно, то не делайте этого.Просто следуйте рекомендациям по изоляции ваших внутренних сервисов, чтобы, если позже вы решите сделать что-то подобное, вы можете просто вставить слой клея, необходимый для управления связью и т. Д. Добавление удаленного распределения увеличит риск, сложность и снизит производительность (масштабирование! = производительность) поэтому должна быть веская причина, чтобы сделать это вообще.

Это, пожалуй, «лучшая практика» для всех них.

Редактировать - Ответ на комментарий:

То есть вы имеете в виду, что я запускаю ОДИН веб-серверчто обрабатывать все входящие запросы?Но тогда модули не будут автономными приложениями, что наносит ущерб всей цели.Я хочу, чтобы каждый из модулей мог запускаться сам по себе.

Нет, это не противоречит цели.

Вот сделка.

Допустим, у вас есть 3 услуги.

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

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

HTTP позволяет вам отображать все виды вещей.HTTP сам по себе является механизмом абстракции.

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

На уровне архитектуры вы достигли способа абстрагирования и модульности.URL-адреса позволяют организовать вашу систему в соответствии с тем, какой макет LOGICAL вы хотите.Реализация PHYSICAL отличается от логического представления.

Эти 3 службы могут работать на одной машине, обслуживаемой одним процессом.С другой стороны, они могут представлять 1000 машин.Как вы думаете, сколько компьютеров отвечает на «www.google.com»?

Вы можете легко разместить все 3 службы на одном компьютере без совместного использования кода, кроме самого веб-сервера.Упрощение перемещения службы с ее исходного компьютера на другой.

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

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

5 голосов
/ 23 октября 2010

Это хорошая идея?

Да. Это делается все время. Так работают, например, все серверы баз данных. В Linux полно клиент-серверных приложений, взаимодействующих через TCP / IP.

Будет ли передача данных между ними медленной?

Нет. TCP / IP использует localhost в качестве ярлыка для экономии при выполнении реального сетевого ввода-вывода.

Протокол HTTP - не лучшая вещь для выделенных соединений, но он прост и хорошо поддерживается.

Если я это сделаю, то каждое приложение / модуль должен быть HTTP-сервером, верно?

Не обязательно. Некоторые модули могут быть клиентами и не иметь сервера.

Так что, если мое приложение использует 100 приложений / модулей, то каждое из них должно быть локальным веб-сервером HTTP, каждый из которых работает на другом порту (http://localhost:81, http://localhost:82, http://localhost:83 и т. Д. ) верно?

Да. Вот как это работает.

Есть ли какие-нибудь передовые практики / ошибки, о которых мне следует знать?

Не «жестко кодировать» номера портов.

Не использовать «привилегированные» номера портов (до 1024).

Используйте библиотеку WSGI, и вы будете счастливы превратить все свои модули в приложения WSGI. Затем вы можете использовать тривиальный HTTP-сервер для переноса вашего модуля.

Прочтите это. http://docs.python.org/library/wsgiref.html#examples

2 голосов
/ 23 октября 2010

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

0 голосов
/ 23 октября 2010

Нет - это не очень хорошая идея, если у вас нет веских причин. Хорошей идеей будет наложить код вашего приложения, чтобы его можно было «отдохнуть» на более позднем этапе, если он вам понадобится. (Или любое улучшение производительности, которое будет сочтено необходимым.) Повышенная сложность развертывания «серверных уровней» является хорошей причиной, чтобы этого не делать. Я бы предложил:

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

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

Если вы ищете сложность - не обращайте внимания на мой ответ. : -)

0 голосов
/ 23 октября 2010

Честно говоря, я не думаю, что вам нужно 100 серверов для 100 приложений, возможно, просто используйте 100 портов на одном сервере.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...