Кратко

  • PubSubHubbub избавлял читателя лент от постоянного вопроса к каждому сайту: «Есть новое?» В проекте 2010 года издатель сообщал об изменении хабу, хаб получал обновлённую ленту и рассылал её подписчикам. Скорость обеспечивал посредник.
  • Рекомендация W3C WebSub 2018 года уточнила цену такой доставки: 202 Accepted означал получение запроса до проверки адреса обратного вызова. Подписка имела срок, который подписчик должен был продлить до истечения.

Пустые запросы перестали ходить по кругу

Программа для чтения лент могла каждые несколько минут спрашивать сайты об обновлениях. Чаще всего ответ содержал уже известные записи. Рабочий проект PubSubHubbub Core 0.3 от февраля 2010 года предложил другое устройство: издатель указывал хаб в ленте Atom или RSS и уведомлял его при изменении. Хаб забирал новую версию, находил изменения и отправлял их на адреса обратного вызова подписчиков.

Сайту уже не приходилось отвечать толпе на один и тот же вопрос. Список доставки переходил к посреднику. Эталонная реализация проекта была рассчитана на Google App Engine, но авторы прямо писали, что любой может запустить хаб. Протокол не назначал одну компанию постоянным хозяином. Отдельная подписка всё же проходила через тот хаб, который указал издатель.

Подписчик оставлял сетевой адрес для получения сообщений. Хаб отправлял туда hub.challenge, а получатель должен был вернуть то же значение. Так чужой человек не мог оформить подписку или отписку, просто вписав чужой адрес. Хаб также хранил список и распределял обновления. Работа ушла от бесконечных запросов читателей к одной распределительной стойке.

Получить 202 ещё не значит получать новости

В январе 2018 года W3C объявил WebSub рекомендацией. Так стало называться развитие PubSubHubbub. Текст рекомендации 2018 года оставил три роли — издатель, хаб, подписчик — и распространил понятие темы на веб-ресурсы, а не только ленты. Издатель объявлял тему и хаб, подписчик направлял хабу POST, а хаб затем посылал содержимое на обратный адрес.

Ответ HTTP 202 Accepted легко принять за окончательное согласие. По рекомендации он лишь подтверждал, что хаб получил запрос и приступит к проверке. Хаб мог отказать теме или обратному адресу по собственным правилам. Затем он отправлял вызов и сверял ответ. Получение заявки, подтверждение адреса и доставка записи — разные события. Нельзя измерять работающую подписку числом красивых ответов 202.

Другим условием стал срок. Проект 2010 года допускал сроки и описывал автоматическую перепроверку подписчиков самим хабом. Рекомендация 2018 года обязала хабы прекращать подписки по истечении срока и запретила бессрочные. При проверке хаб сообщал hub.lease_seconds; подписчик должен был обратиться за продлением заранее. Лента могла оставаться открытой и обновляться, а забывший продлить адрес выходил из канала доставки.

Стандарт позволял издателю объявлять несколько хабов и разрешал независимые реализации. Каждый выбранный хаб сохранял право принимать запросы, проверять адреса, вести часы и рассылать материалы. Издатель обязан был сообщать выбранным хабам об изменениях, но способ сообщения оставался их договорённостью. Хаб получал содержимое и передавал его подписчикам, повторяя неудачную отправку в пределах собственных правил. Публикация, уведомление хаба, получение заявки, подтверждение, действующий срок и доставка образовывали шесть отдельных записей.