Кратко

  • После обработки terminate и ответа RFC 3343 не отправлял новых обновлений, но ранее посланные сообщения presence или watcher могли остаться в пути и прийти позже.
  • Код 250 доказывал остановку в сервисе, а не дренирование ретрансляторов; корреляция, поколение подписки, актуальность и решение получателя оставались разными фактами.

Сервис APEX находился по известному endpoint apex=presence. Приложения публиковали записи, подписывались на присутствие и наблюдали, кто подписан на выбранного издателя. Активные операции и записи требовали постоянного хранения.

Subscribe сразу возвращал текущую запись, а затем при положительной duration присылал изменения. Ноль означал разовый опрос. Watch сначала отвечал 250, перечислял существующих подписчиков и потом сообщал об их появлении и завершении.

Что закрывал terminate

Неизвестный идентификатор приводил к ошибке 550. Действующий идентификатор завершал операцию и получал 250. Но спецификация прямо предупреждала: после завершения могли прийти дополнительные обновления. Сервис больше ничего не отправлял после обработки запроса и ответа, однако предыдущие сообщения могли находиться в транзите.

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

Корреляция не создавала актуальность

Сервисные publish и notify сохраняли идентификатор породившей операции. Позднее обновление точно относилось к старой подписке, но это не обязывало применять его.

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

Новая подписка того же отправителя на тот же субъект молча завершала прежнюю. Логическая связь выглядела одинаково, но поколение менялось. Без него старый publish мог стать ложным началом нового потока.

Запись не доказывала подключение

Домен хранил presence для каждого endpoint независимо от текущего подключения. lastUpdate, URI, availableUntil и возможности описывали запись, а не наблюдаемую доставку.

Публикация имела собственный контроль: входной lastUpdate должен был семантически совпасть с сохранённым, иначе возвращался 555. Код 250 доказывал изменение в сервисе, не приём каждым подписчиком. Позднее обновление могло быть подлинным и уже устаревшим.

Историческая граница

RFC 3343 опубликован в апреле 2003 года как Experimental и теперь имеет статус Historic. Запись IETF от 29 июля 2012 года сообщает, что, насколько было известно IETF, реализации RFC 3340–3343 не были развёрнуты, а функции предоставлялись широко распространённым XMPP по RFC 6120 и RFC 6121.

Это не называет гонку причиной и не описывает инцидент. Документ также предупреждал, что часовые пояса могут раскрывать местоположение, и разрешал после преобразования использовать -00:00.

Надёжная система разделяет создание, передачу транспорту, завершение, остановку новых отправок, дренирование, получение и действие. Если квитанции о дренировании нет, её нельзя выдумывать. После завершения прошлое всё ещё может приближаться.

Источники