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

StackOverflow https://stackoverflow.com/questions/4002545

Вопрос

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

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

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

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

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

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

Решение

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

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

  • Будут ли передавать данные между ними медленно?

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

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

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

  • Любые лучшие практики / чтены, о которых я должен знать?

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

Вы говорите на самом деле, используя архитектуру отдыха или просто отправлять вещи взад и вперед через http? (Это разные вещи) ОТДЫТНЫЕ ВОЗМОЖНОСТИ Включает свои собственные расходы, включают в себя встроенные связи, повсеместные и общие типы данных и т. Д.

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

Что, возможно, это «лучшая практика» из них всех.

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

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

Нет, это не побеждает цель.

Вот сделка.

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

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

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

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

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

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

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

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

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

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

Другие советы

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

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

Будут ли передавать данные между ними медленно?

Нет. TCP / IP использует localhost в виде короткого разреза, чтобы сохранить выполнение реальной сети ввода / вывода.

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

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

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

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

да. Вот так работает.

Любые лучшие практики / чтены, о которых я должен знать?

Не «Hard-Code» номера портов.

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

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

Прочитай это. http://docs.yphon.org/library/wsgiref.html#examples.

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top