Какой протокол следует использовать для быстрого взаимодействия команды/ответа?

Мне нужно настроить протокол для быстрого взаимодействия команды/ответа. Мой инстинкт подсказывает мне просто собрать простой протокол с разделенными CRLF строками ascii, например, как работает SMTP или POP3, и туннелировать его через SSH/SSL, если мне нужно, чтобы он был защищен.

Хотя я мог бы просто сделать это, я бы предпочел использовать существующую технологию, чтобы люди могли использовать дружественную библиотеку, а не интерфейс библиотеки сокетов, который им предоставляет ОС.

Я нуждаюсь...

  • Команды и ответы, передающие структурированные данные туда и обратно. (XML, S-выражения, все равно.)
  • Возможность для сервера делать незапланированные уведомления клиенту без опроса.

Любые идеи, пожалуйста?


person billpg    schedule 21.06.2009    source источник
comment
Спасибо за ответы. Я надеюсь, что людям, которые ищут этот вопрос, понравится список предложенных ответов.   -  person billpg    schedule 22.06.2009


Ответы (4)


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

Тем не менее, в зависимости от того, чего вы пытаетесь достичь, простой специальный протокол может быть проще.

person Ben Hughes    schedule 21.06.2009
comment
Я принимаю этот ответ, потому что я использую специальный протокол, поскольку различные предложения не очень подходят для моего приложения. - person billpg; 22.06.2009

Если вам просто нужен запрос/ответ, HTTP очень прост. Это уже протокол запроса/ответа. Клиентская и серверная части широко реализованы на большинстве языков. Масштабирование это хорошо понятно.

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

Если вам нужны асинхронные уведомления, обратите внимание на протоколы публикации/подписки (реализации Spread, XMPP, AMQP, JMS или коммерческие брокеры сообщений публикации/подписки, такие как TibcoRV, Tibco EMS или Websphere MQ). Выбор протокола или реализации зависит от требований к надежности, задержке и пропускной способности системы, которую вы создаете. Например, можно ли сбрасывать уведомления, когда сеть перегружена? Что происходит с уведомлениями, когда клиент находится в автономном режиме — они отбрасываются или ставятся в очередь, когда клиент повторно подключается.

person Nat    schedule 21.06.2009

Как насчет чего-то вроде SNMP? Я не уверен, что это точно соответствует модели, которую использует ваше приложение, но оно поддерживает как асинхронное уведомление, так и извлечение (т. е. TRAP и GET).

person Adam Lewis    schedule 21.06.2009

Это отличный вопрос с огромным количеством переменных, которые необходимо учитывать, и в вопросе упоминаются лишь некоторые из них: формат пакета, асинхронный и синхронизированный обмен сообщениями и безопасность. Есть много, много других, о которых можно подумать. Я предлагаю пройтись по описанию 7-уровневого стека протоколов (OSI/ISO) и спросить себя, что вам нужно на этих уровнях, и хотите ли вы построить этот уровень или получить его откуда-то еще. (Похоже, вас больше всего интересуют уровни 6 и 7, но вы также упомянули и о более низких слоях.)

Подумайте также о том, относится ли это к критическому с точки зрения безопасности приложению или к части системы с формальной верификацией и верификацией. Действительно хорошие, заслуживающие доверия системы связи спроектировать непросто; также протокол с «недостаточной мощностью» может сильно нагрузить приложение кодированием для восстановления после ошибок.

Наконец, я бы предложил посмотреть, как другие приложения, подобные вашему, справляются с этой задачей (проверить открытый исходный код, прочитать книги и т. д.). Также полезна база данных патентного ведомства США и т. д.; можно почерпнуть отличные идеи, просто прочитав описание коммуникативной проблемы, которую они пытались решить.

person Mr. Lynch    schedule 08.03.2013