Какой протокол я должен использовать для быстрого взаимодействия команды / ответа?
-
06-07-2019 - |
Вопрос
Мне нужно настроить протокол для быстрого взаимодействия команды / ответа.Мой инстинкт подсказывает мне просто создать простой протокол с разделенными CRLF строками ascii, например, как работает SMTP или POP3, и туннелировать его через SSH / SSL, если мне нужно, чтобы он был защищен.
Хотя я мог бы просто сделать это, я бы предпочел использовать существующую технологию, чтобы люди могли использовать дружественную библиотеку, а не интерфейс библиотеки сокетов, который предоставляет им ОС.
Мне нужно...
- Команды и ответы, передающие структурированные данные взад и вперед.(XML, S-выражения - мне все равно.)
- Возможность сервера отправлять незапланированные уведомления клиенту без проведения опроса.
Пожалуйста, есть какие-нибудь идеи?
Решение
AMQP звучит многообещающе.В качестве альтернативы, я думаю, что XMPP поддерживает многое из того, что вы хотите, хотя и с немалыми накладными расходами.
Тем не менее, в зависимости от того, чего вы пытаетесь достичь, простой специальный протокол может быть проще.
Другие советы
Если вам просто нужен запрос / ответ, HTTP очень прост.Это уже протокол запроса / ответа.Клиентская и серверная части широко реализованы на большинстве языков.Масштабирование этого процесса хорошо понято.
Самый простой способ использовать его - отправлять команды на сервер в виде POST-запросов, а сервер отправлять ответ в теле ответа.Вы также могли бы расширить HTTP с помощью ваших собственных глаголов, но это усложнило бы использование преимуществ кэширующих прокси и другой инфраструктуры, которая понимает HTTP.
Если вам нужны асинхронные уведомления, то посмотрите на протоколы pub / sub (реализации Spread, XMPP, AMQP, JMS или коммерческие брокеры сообщений pub / sub, такие как TibcoRV, Tibco EMS или Websphere MQ).Выбор протокола или реализации зависит от требований к надежности, задержке и пропускной способности создаваемой вами системы.Например, нормально ли, что уведомления удаляются, когда сеть перегружена?Что происходит с уведомлениями, когда клиент отключен от сети - отбрасываются ли они или ставятся в очередь при повторном подключении клиента.
Как насчет чего-то вроде SNMP?Я не уверен, точно ли это соответствует модели, используемой вашим приложением, но оно поддерживает как async notify, так и pull (т. Е. TRAP и GET).
Это отличный вопрос с огромным количеством переменных для рассмотрения, и в вопросе упоминаются лишь некоторые из них:формат пакета, асинхронный по сравнениюсинхронизированные сообщения и безопасность.Есть много-много других, о которых можно было бы подумать.Я предлагаю ознакомиться с описанием 7-уровневого стека протоколов (OSI / ISO) и спросить себя, что вам нужно на этих уровнях, и хотите ли вы создать этот уровень или получить его откуда-то еще.(Похоже, вас больше всего интересуют слои 6 и 7, но вы также упомянули фрагменты нижних слоев.)
Подумайте также о том, относится ли это к критически важному для безопасности приложению или к части системы с формальным V & V.Действительно хорошие, заслуживающие доверия системы связи непросто спроектировать;кроме того, "недостаточно мощный" протокол может значительно усложнить кодирование приложения для восстановления после ошибок.
Наконец, я бы предложил посмотреть, как другие приложения, похожие на ваше, выполняют эту работу (проверьте open source, прочитайте книги и т.д.) Также полезно использовать США.База данных Патентного ведомства и т. д;можно почерпнуть отличные идеи, просто прочитав описание коммуникационной проблемы, которую они пытались решить.