Двусторонний обмен данными между приложениями
От: Шульженко Андрей  
Дата: 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/... — и просто использовать (не зря ж тот же Кролик на Эрланге написан).
Re[5]: Двусторонний обмен данными между приложениями
От: Sharov Россия  
Дата: 01.12.20 10:45
Оценка:
Здравствуйте, Буравчик, Вы писали:

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


В чем видится принципиальная невозможность этого сделать? Выше уже советовали две очереди. О возможности речи, кмк, нет.
Речь о нужности rpc через mq.
Кодом людям нужно помогать!
Re: Двусторонний обмен данными между приложениями
От: · Великобритания  
Дата: 01.12.20 11:01
Оценка:
Здравствуйте, Шульженко Андрей, Вы писали:

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

ША>Подскажите, на чем бы построить двусторонний обмен данными в клиент-серверном приложении для реализации следующей задачи:
ША>1) клиент посылает синхронные запросы серверу с обязательным ответом
Стоит отметить, что такое желание чаще всего результат подчёркнутого выше, а не реальная необходимость. Надо отказываться от идеи синхронных запросов и переходить на архитектуру с асинхронными сообщениями.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[3]: Двусторонний обмен данными между приложениями
От: Ночной Смотрящий Россия  
Дата: 25.12.20 13:57
Оценка:
Здравствуйте, Шульженко Андрей, Вы писали:

ША> Спасибо, мне ближе всего была реализация веб сервиса, думаю что на нем легко будет сделать HTTP polling.


Простая арифметика показывает, что при росте количества клиентов сервер очень быстро заткнется от количества входящих запросов, либо лантентность будет исчисляться минутами. Всякие WebSockets или хотя бы long polling не от хорошей жизни придуманы.
... << RSDN@Home 1.3.17 alpha 5 rev. 62>>
Re[2]: Двусторонний обмен данными между приложениями
От: Ночной Смотрящий Россия  
Дата: 25.12.20 13:57
Оценка:
Здравствуйте, Miroff, Вы писали:

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


Будешь эти чудеса в публичный инет выставлять?
... << RSDN@Home 1.3.17 alpha 5 rev. 62>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.