WebSub

NB: This is an old article (2019). Everything may have changed since publication.


Я часто в этом календаре упоминаю Твиттер, во многом, потому что это единственная большая социальная сеть, которой я пользуюсь каждый день: не смог разобраться в Фейсбуке, перестал заходить ВКонтакте, а Гуглплюс и вовсе закрыли.

На главной Твиттера, если разлогиниться, показывается основной слоган: See what’s happening in the world right now.

У твиттера за счёт централизации есть реалтайм: новые посты сами прилетают в ленту практически сразу. Но как в отсутствие твиттера, мои читатели узнают, что я опубликовал что-то новое?

Первый наивный ответ: зайди да посмотри, то есть, поллинг. Человек (или, чаще, программа) заходит на сайт и смотрит, нет ли чего нового. «Наивный» здесь не ругательство — это решение, которое решает большую часть проблемы и довольно легко в реализации.

Одним из первых подходов к проблеме был RSS (расшифровки: Rich Site Summary, полная выжимка сайта, Really Simple Syndication, Очень Простое Распространение). Это XML-документ, в котором можно описать ленту постов, и многие сайты в двухтысячных публиковали обновления сайтов в этом формате. У читателя, соответственно, должна быть читалка, которая понимает этот формат и ходит скачивать новую версию файла раз в какой-то промежуток времени.

В наши дни читатели часто используют не десктопные RSS-читалки, а веб-сервисы, что несколько решает проблему популярных сайтов: представь, что компьютеры сотни тысяч читателей запрашивают раз в пятнадцать минут этот файл — это сотни тысяч запросов. Feedbin и Feedly запрашивают файл один раз для всех своих пользователей.

Но у поллинга есть две проблемы: у многих сайтов не выйдет новых постов за этот час, то есть запросы происходят зазря, а с другой стороны, когда пост всё-таки выйдет, то я не узнаю о нём, пока читалка не скачает обновление через час. Поэтому появился WebSub — это протокол, где сайт присылает уведомление про новый пост. С этим протоколом всё не так просто: изначально он назывался PubSubHubbub (я не шучу); для него нужен хаб; чтобы получать апдейты, нужен сервер. В версии 0.4 появилась возможность публиковать в реалтайме не только обновления в RSS/Atom-лентах, но любых штук, доступных в вебе. Меня больше всего интересует h-feed на главной странице, список опубликованных постов.

Реалтайм требует работы от того, кто публикует контент. Для поддержки WebSub понадобятся три составляющие:

  1. Хаб: подписчики подписываются на нем на обновления, он рассылает новый контент подписчикам
  2. Две ссылки в виде тега link или http-заголовка Link: одна на себя (то есть, на обновления чего будут подписываться люди, rel="self") и на хаб (rel="hub")
  3. Пинг: каждый раз, когда обновляешь или публикуешь новый контент, нужно пингануть хаб, чтобы он получил новую версию

Superfeedr предоставляет бесплатные хабы (можно использовать «общий»: http://pubsubhubbub.superfeedr.com/, но на своём будет дополнительная аналитика вида «сколько подписчиков»).

Теги добавить не сложно, единственное, что нужно быть аккуратным — rel="self" должен быть точным, без редиректов.

Пинг хаба — это просто POST-запрос с двумя параметрами: hub.mode=publish и hub.url=урл_из_рел_селф. Его можно делать вручную, а можно добавить пинг в скрипт, который делает деплой (если же сайт динамический, то можно рассматривать как часть логики публикации).

Таких фидов может быть много: например, фид на главную страницу, на категории постов, на ответы.

Подписываться на обновления несколько сложнее, и тот же Aperture до сих пор не поддерживает WebSub, полагаясь на поллинг, но всё ещё впереди.

Используя WebSub, мы можем сделать посты в вебе реалтаймовыми и без больших корпораций.

День 14: маркдаун · День 16: ActivityPub

Published at no particular date