Двусторонний обмен данными между приложениями
От: Шульженко Андрей  
Дата: 18.11.20 07:19
Оценка:
Всем привет!

Вопрос от начинающего разработчика, слабо знакомого с архитектурой распределенных приложений
Подскажите, на чем бы построить двусторонний обмен данными в клиент-серверном приложении для реализации следующей задачи:
1) клиент посылает синхронные запросы серверу с обязательным ответом
2) иногда клиенту от сервера приходят асинхронные управляющие сигналы (фактически, callback вызовы)
3) клиент точно на linux (raspberry pi), серверная инфраструктура — пока вопрос открытый

Буду признателен за любую помощь
Андрей.
Re: Двусторонний обмен данными между приложениями
От: Doom100500 Израиль  
Дата: 18.11.20 07:21
Оценка: 17 (2)
Здравствуйте, Шульженко Андрей, Вы писали:

ША>Всем привет!


ША>Вопрос от начинающего разработчика, слабо знакомого с архитектурой распределенных приложений

ША>Подскажите, на чем бы построить двусторонний обмен данными в клиент-серверном приложении для реализации следующей задачи:
ША>1) клиент посылает синхронные запросы серверу с обязательным ответом
ША>2) иногда клиенту от сервера приходят асинхронные управляющие сигналы (фактически, callback вызовы)
ША>3) клиент точно на linux (raspberry pi), серверная инфраструктура — пока вопрос открытый

ША>Буду признателен за любую помощь

ША>Андрей.

https://grpc.io/

1) клиент посылает синхронные запросы серверу с обязательным ответом [x]
2) иногда клиенту от сервера приходят асинхронные управляющие сигналы (фактически, callback вызовы) — Streams one directional, bidirectional server-> client, client -> serve
3) клиент точно на linux (raspberry pi), серверная инфраструктура — пока вопрос открытый C++, go, c#, etc...
Спасибо за внимание
Отредактировано 18.11.2020 7:24 Doom100500 . Предыдущая версия .
Re: Двусторонний обмен данными между приложениями
От: Maniacal Россия  
Дата: 18.11.20 07:31
Оценка: +1
Здравствуйте, Шульженко Андрей, Вы писали:

ША>Всем привет!


ША>Вопрос от начинающего разработчика, слабо знакомого с архитектурой распределенных приложений

ША>Подскажите, на чем бы построить двусторонний обмен данными в клиент-серверном приложении для реализации следующей задачи:
ША>1) клиент посылает синхронные запросы серверу с обязательным ответом
ША>2) иногда клиенту от сервера приходят асинхронные управляющие сигналы (фактически, callback вызовы)
ША>3) клиент точно на linux (raspberry pi), серверная инфраструктура — пока вопрос открытый

с++, потоки, сокеты, очереди, семафоры.
Re: Двусторонний обмен данными между приложениями
От: Буравчик Россия  
Дата: 18.11.20 08:13
Оценка:
Здравствуйте, Шульженко Андрей, Вы писали:

ША>Всем привет!


ША>Вопрос от начинающего разработчика, слабо знакомого с архитектурой распределенных приложений

ША>Подскажите, на чем бы построить двусторонний обмен данными в клиент-серверном приложении для реализации следующей задачи:
ША>1) клиент посылает синхронные запросы серверу с обязательным ответом
ША>2) иногда клиенту от сервера приходят асинхронные управляющие сигналы (фактически, callback вызовы)
ША>3) клиент точно на linux (raspberry pi), серверная инфраструктура — пока вопрос открытый

websocket + WAMP (Web Application Messaging Protocol)
WAMP умеет и RPC, и Pub/Sub. Реализация есть на очень многих языках (С++ и другие)
Best regards, Буравчик
Re: Двусторонний обмен данными между приложениями
От: BlackEric http://black-eric.lj.ru
Дата: 18.11.20 10:25
Оценка: +1
Здравствуйте, Шульженко Андрей, Вы писали:

ША>Подскажите, на чем бы построить двусторонний обмен данными в клиент-серверном приложении для реализации следующей задачи:

ША>1) клиент посылает синхронные запросы серверу с обязательным ответом
REST API
ША>2) иногда клиенту от сервера приходят асинхронные управляющие сигналы (фактически, callback вызовы)
SignalR
ША>3) клиент точно на linux (raspberry pi), серверная инфраструктура — пока вопрос открытый
ASP.NET Core — сервер. Клиент можно в браузере. Ну или зависит от планируемого десктопа на малине.

ША>Буду признателен за любую помощь

ША>Андрей.
https://github.com/BlackEric001
Re: Двусторонний обмен данными между приложениями
От: vsb Казахстан  
Дата: 18.11.20 10:38
Оценка:
Здравствуйте, Шульженко Андрей, Вы писали:

ША>1) клиент посылает синхронные запросы серверу с обязательным ответом


Обычный HTTP запрос-ответ.

ША>2) иногда клиенту от сервера приходят асинхронные управляющие сигналы (фактически, callback вызовы)


По другому соединению клиент делает HTTP запрос, на который сервер отвечает в тот момент, когда хочет сделать этот самый callback. Должен быть таймаут, например 30 секунд. Через 30 секунд сервер отвечает специальным кодом. После получения callback-а клиент заново делает этот запрос. HTTP polling называется технология.

Это самая простая и совместимая реализация на мой взгляд.
Отредактировано 18.11.2020 10:39 vsb . Предыдущая версия . Еще …
Отредактировано 18.11.2020 10:38 vsb . Предыдущая версия .
Re: Двусторонний обмен данными между приложениями
От: Miroff Россия  
Дата: 18.11.20 11:29
Оценка: +1
Здравствуйте, Шульженко Андрей, Вы писали:

ША>Подскажите, на чем бы построить двусторонний обмен данными в клиент-серверном приложении для реализации следующей задачи:


Правильный ответ в 2020 году: любой готовый брокер сообщений. RabbitMQ, ZeroMQ, whateverMQ.
Re[2]: Двусторонний обмен данными между приложениями
От: Буравчик Россия  
Дата: 18.11.20 13:07
Оценка:
Здравствуйте, Miroff, Вы писали:

M>Правильный ответ в 2020 году: любой готовый брокер сообщений. RabbitMQ, ZeroMQ, whateverMQ.


Как синхронные запросы реализовать?
Best regards, Буравчик
Re[3]: Двусторонний обмен данными между приложениями
От: Miroff Россия  
Дата: 18.11.20 13:25
Оценка: +1
Здравствуйте, Буравчик, Вы писали:

Б>Как синхронные запросы реализовать?


В библиотеке для %your_language_name% почти наверняка есть синхронная реализация. А если нет, то ручками.
Re[4]: Двусторонний обмен данными между приложениями
От: Буравчик Россия  
Дата: 18.11.20 14:27
Оценка:
Здравствуйте, Miroff, Вы писали:

M>В библиотеке для %your_language_name% почти наверняка есть синхронная реализация. А если нет, то ручками.


Прошу пример любой библиотеки (любой язык) для работы с брокером MQTT или AMQP, в которой был бы реализован синхронный ответ на запрос.
Best regards, Буравчик
Re[2]: Двусторонний обмен данными между приложениями
От: Maniacal Россия  
Дата: 18.11.20 18:01
Оценка:
Здравствуйте, Maniacal, Вы писали:

M>с++, потоки, сокеты, очереди, семафоры.


Я про то, что если и клиент и сервер в руках одного разработчика, то это же банальный велосипед, собирающийся из говна и палок стандартных библиотек за пару дней полностью отлаженный с нуля. Или я уже слишком старым системным стал, как программист-велосипедист?
Re[2]: Двусторонний обмен данными между приложениями
От: Шульженко Андрей  
Дата: 19.11.20 07:08
Оценка: :)
Здравствуйте, Maniacal, Вы писали:

M>с++, потоки, сокеты, очереди, семафоры.


ИМХО, это для тех, кто до сих пор на асме пишет. Ну или делает высоконагруженный велосипед, которому существующие технологии "не подходят"
Re[2]: Двусторонний обмен данными между приложениями
От: Шульженко Андрей  
Дата: 19.11.20 07:11
Оценка:
Здравствуйте, Miroff, Вы писали:

M>Правильный ответ в 2020 году: любой готовый брокер сообщений. RabbitMQ, ZeroMQ, whateverMQ.


Я рассматривал RabbitMQ и SQS, но мне показалось что одно не делает синхронно, другое не делает асинхронно.
Re[2]: Двусторонний обмен данными между приложениями
От: Шульженко Андрей  
Дата: 19.11.20 07:20
Оценка:
Здравствуйте, vsb, Вы писали:

vsb>Обычный HTTP запрос-ответ.

vsb>По другому соединению клиент делает HTTP запрос, на который сервер отвечает в тот момент, когда хочет сделать этот самый callback. Должен быть таймаут, например 30 секунд. Через 30 секунд сервер отвечает специальным кодом. После получения callback-а клиент заново делает этот запрос. HTTP polling называется технология.
vsb>Это самая простая и совместимая реализация на мой взгляд.

Спасибо, мне ближе всего была реализация веб сервиса, думаю что на нем легко будет сделать HTTP polling.
Re[2]: Двусторонний обмен данными между приложениями
От: Шульженко Андрей  
Дата: 19.11.20 07:22
Оценка:
Здравствуйте, Doom100500, Вы писали:

D>Здравствуйте, Шульженко Андрей, Вы писали:


D>https://grpc.io/


Спасибо, интересная история. Когда то игрался с DCOMом, поэтому выглядит очень знакомо.
Re[5]: Двусторонний обмен данными между приложениями
От: Farsight СССР  
Дата: 30.11.20 05:54
Оценка: 8 (1)
Здравствуйте, Буравчик, Вы писали:

Б>Прошу пример любой библиотеки (любой язык) для работы с брокером MQTT или AMQP, в которой был бы реализован синхронный ответ на запрос.

Вот эта штука довльно удобно работает с эмуляцией синхронных RPC. Работает с кроликом.
Вот тут.
</farsight>
Отредактировано 30.11.2020 5:59 Farsight . Предыдущая версия . Еще …
Отредактировано 30.11.2020 5:56 Farsight . Предыдущая версия .
Re[6]: Двусторонний обмен данными между приложениями
От: Буравчик Россия  
Дата: 30.11.20 07:48
Оценка:
Здравствуйте, Farsight, Вы писали:

F>Вот эта штука довльно удобно работает с эмуляцией синхронных RPC. Работает с кроликом.


Это второй слой — библиотека, работающая поверх библиотеки, работающей с брокером. Я же имел ввиду библиотеку, непосредственно работающей с брокером.

В целом да, синхронная работа по MQ возможна.
Best regards, Буравчик
Re[7]: Двусторонний обмен данными между приложениями
От: Farsight СССР  
Дата: 30.11.20 08:05
Оценка:
Здравствуйте, Буравчик, Вы писали:

Б>Это второй слой — библиотека, работающая поверх библиотеки, работающей с брокером. Я же имел ввиду библиотеку, непосредственно работающей с брокером.

Вряд ли найдется что-то кроме этого в случае с короликом.
</farsight>
Re[3]: Двусторонний обмен данными между приложениями
От: Jericho113 Украина  
Дата: 30.11.20 10:06
Оценка: 6 (1) +1
Здравствуйте, Шульженко Андрей, Вы писали:


ША> Я рассматривал RabbitMQ и SQS, но мне показалось что одно не делает синхронно, другое не делает асинхронно.


В RabbitMQ есть довольно простой пример RPC вызова Remote procedure call (RPC)
Там используются 2 очедери — в первую отправляется сообщение и вместе с сообщением отправляется имя очереди через которую будет возвращаться response.
Из всего прочитанного мною в этой ветке я так и не понял зачем вам блокирующий вызов ?
Да, и не совсем понимаю если у вас сервер всего один (впрочем как и клиент) то смысла в RMQ я большого не вижу очереди созданы в т.ч. для удобной балансировки нагрузки между несколькими инстансами рабочих процессов.

Хочу так-же заметить что в случае разрыва TCP канала между Rabbit и сервером сообщение которое принял сервер но на которое не успел послать ACK будет еще раз выслано этому же серверу так что если нужна уникальность то
прийдется как-либо помечать все сообщения уникальными идентификаторами и где-то их на сервере сохранять и проверять что сообщение не дубликат.

Ну в итоге конечно решать вам что выбрать.
NetDigitally yours ....
Re[2]: Двусторонний обмен данными между приложениями
От: SkyDance Земля  
Дата: 01.12.20 03:26
Оценка: +2
M>Правильный ответ в 2020 году: любой готовый брокер сообщений. RabbitMQ, ZeroMQ, whateverMQ.

Истинно так. Только не в 2020, а начиная где-то с 2010.

Если персистентность (сообщений) не нужна, то можно и без брокера, "руками", взять готовый Erlang/Elixir/... — и просто использовать (не зря ж тот же Кролик на Эрланге написан).
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.