Как реализовать удаленные процедуры между серверами? - PullRequest
0 голосов
/ 12 декабря 2018

Проблема

Мне нужно реализовать эту архитектуру:

  • Клиенты могут подключаться к удаленному серверу, чтобы указать, что они в сети и работают
  • Сервер может получитьзапросы из разных источников
  • Сервер может выдавать заказы клиентам
  • Для каждого заказа серверу необходимо дождаться подтверждения (или ошибки) перед отправкой следующего заказа

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

Я подумал о 2 возможных решениях:

1) Я использую gRPC для всего:

  • Клиенты вызывают Connect процедуру на сервере.
  • Это двусторонний потоковый RPC, который поддерживается до тех пор, пока клиенты находятся в сети.
  • Сервер использует это как канал для отправки заказов клиентам: клиенты прослушивают сообщения в потоке, выполняютсяпорядок и возврат сообщения, чтобы указать, был ли заказ успешным или нет, а также некоторые необязательные параметры

2) RabbitMQ / MQTT или какой-либо другой паб / сабsystem

  • Клиенты отправляют пульс на сервер, чтобы уведомить его о том, что они подключены к сети и работают
  • Сервер использует RabbitMQ для выдачи заказов клиентам
  • Каждому выданномуПри заказе сервер ожидает, что клиент вызовет RPC подтверждения перед отправкой следующего заказа. RabbitMQ

Вопрос

Как вы думаете, эти решениядостаточно хорошо для этой конкретной проблемы?И если да, то какой из них вы бы назвали лучшим?

Меня особенно беспокоит:

  • Первое решение слишком интенсивно использует сеть из-за всех открытых соединений
  • Второе решение не позволяет серверу узнать, произошел ли сбой клиента.В этой ситуации первое решение просто разорвало бы соединение, и сервер мог бы отреагировать соответствующим образом.
  • Оба решения обеспечивают слабую систему обратной связи.Идеальным для меня было бы вызвать удаленную процедуру с сервера на клиент, но AFAIK это невозможно из-за того, как работает RPC.Также клиенты стоят за NAT.

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

...