Фэй против Socket.IO (и Джаггернаута)

102

Socket.IO кажется самой популярной и активной библиотекой эмуляции WebSocket. Джаггернаут использует его для создания полной системы публикации / подписки.

Faye также популярна и активна, и у нее есть собственная библиотека javascript, что делает ее полную функциональность сопоставимой с Juggernaut. Джаггернаут использует узел для своего сервера, а Фэй может использовать узел или стойку. Джаггернаут использует Redis для сохранения ( исправление: он использует Redis для pub / sub), а Фэй только сохраняет состояние в памяти.

  1. Все выше точно?
  2. Фэй говорит, что внедряет Байё - я думаю, что Джаггернаут этого не делает - потому что Джаггернаут находится на более низком уровне (IE, я могу реализовать Байё с помощью Джаггернаута)
  3. Может ли Фэй переключиться на использование библиотеки javascript браузера Socket.IO, если она захочет? Или их библиотеки javascript делают принципиально разные вещи?
  4. Есть ли какие-нибудь различия между проектами в архитектуре / дизайне / философии?
Джон Башир
источник
3
На всякий случай, Джаггернаут устарел! Прочтите, почему blog.alexmaccaw.com/killing-a-library .
Maziyar
События HTML 5 Server-Sent кажутся рекомендуемой альтернативой по словам автора Джаггернаута
Хариндака

Ответы:

121

Раскрытие информации: я автор Фэй.

  1. Что касается Фэй, все, что ты сказал, правда.
  2. Faye реализует большую часть Bayeux, единственное, чего сейчас не хватает, - это служебные каналы, в полезности которых я еще не убедился. В частности, Faye разработан так, чтобы быть совместимым с эталонной реализацией Bayeux CometD, которая имеет большое значение для следующего.
  3. Концептуально да: Фэй могла бы использовать Socket.IO. На практике этому есть несколько препятствий:
    • Я понятия не имею, какая поддержка на стороне сервера требуется Socket.IO, и требование, чтобы клиент Faye (есть серверные клиенты в Node и Ruby, помните) мог разговаривать с любым сервером Bayeux (и Faye сервер к любому клиенту Bayeux) может быть нарушителем сделки.
    • Bayeux предъявляет особые требования к серверам и клиентам, поддерживающим определенные типы транспорта, и говорит, как согласовывать, какой из них использовать. Он также определяет, как они используются, например, как Content-Type запроса XHR влияет на интерпретацию его содержимого.
    • Для некоторых типов обработки ошибок мне нужен прямой доступ к транспорту, например повторная отправка сообщений при повторном подключении клиента после смерти узла WebSocket. .
    • Пожалуйста, поправьте меня, если я что-то не так - это основано на беглом просмотре документации Socket.IO.
  4. Faye - это просто pub / sub, просто он основан на немного более сложном протоколе и имеет множество встроенных тонкостей:
    • Серверные и клиентские расширения
    • Сопоставление шаблонов с подстановочными знаками на маршрутах каналов
    • Автоматическое переподключение, например, когда WebSockets умирает или сервер отключается
    • Клиент работает во всех браузерах, на телефонах и на стороне сервера на Node и Ruby.

Faye, вероятно, выглядит намного сложнее по сравнению с Juggernaut, потому что Juggernaut делегирует больше, например, он делегирует согласование транспорта в Socket.IO и маршрутизацию сообщений в Redis. Оба эти решения хороши, но мое решение использовать Байё означает, что я должен больше работать сам.

Что касается философии дизайна, то главная цель Фэй состоит в том, чтобы она работала везде, где есть Интернет, и должна быть абсолютно простой в использовании. Начать работать с ним очень просто, но его расширяемость означает, что его можно настраивать довольно мощными способами, например, вы можете превратить его в службу push-уведомления от сервера к клиенту (т.е. остановить произвольные клиенты, нажимающие на нее), добавив расширения аутентификации. .

Также ведется работа над тем, чтобы сделать его более гибким на стороне сервера. Я собираюсь добавить поддержку кластеризации и сделать основной движок pub-sub подключаемым, чтобы вы могли использовать Faye в качестве веб-интерфейса без сохранения состояния для другой системы pub-sub, такой как Redis или AMQP.

Надеюсь, это было полезно.

Jcoglan
источник
1
Спасибо за отличный ответ. Я не осознавал гибкость протокола Bayeux - значит, произвольный клиент должен иметь возможность разговаривать с произвольными / несколькими серверами? Вы знаете какие-либо проекты или производственные услуги, которые полностью используют это преимущество?
Джон Башир
4
Я недавно перешел с Socket.IO на Faye, и должен сказать, что Faye сохранила мое приложение. С помощью простого сервера Faye и среднего сервера мое приложение может обрабатывать 6000 пользователей одновременно, согласно аналитике Google,
Тан Нгуен
13
  1. AFAIK, да, помимо того факта, что Juggernaut использует только Redis для Pubsub, а не постоянство. Также означает, что клиентские библиотеки на большинстве языков уже написаны (поскольку для этого нужен только адаптер Redis).
  2. Juggernaut не реализует Bayeux, а имеет очень простой пользовательский протокол JSON.
  3. Не знаю, наверное
  4. Джаггернаут очень прост и разработан таким образом. Хотя я не использовал Faye, из документации кажется, что у него намного больше возможностей, чем просто PubSub. Созданный на основе Socket.IO, он также имеет свои преимущества: Juggernaut поддерживается практически во всех браузерах, как настольных, так и мобильных.

Мне будет действительно интересно, что скажет автор Фэй. Как я уже сказал, я не использовал его, и было бы здорово узнать, как он сравнивается с Джаггернаутом. Вероятно, это случай использования лучшего инструмента для работы. Если вам нужен pubsub, Juggernaut отлично с этим справится.

Алекс МакКоу
источник
Спасибо за отличный ответ. Я не понимал, что Redis использовался только для своих функций pub / sub. Заставил меня спросить об этом: stackoverflow.com/questions/4938520
Джон Бачир,