osFoundry / Platform
Каналы данных в реальном времени
Каналы pub/sub с доставкой минимум один раз, воспроизведением истории и курсорами на каждого подписчика.
Что это
Каналы данных реального времени — это опора обмена сообщениями в osFoundry, переносящая события между подвижными частями вашего рабочего пространства. Любой производитель (агент, работающее приложение, процесс кода или чат) публикует сообщения в именованный канал, и каждый подписчик этого канала их получает. Это классическая модель публикации/подписки: производители и потребители развязаны, поэтому вы можете добавлять или убирать подписчиков, не трогая код, который публикует, а одно событие может веером расходиться сразу многим читателям.
Доставка выполняется не менее одного раза (at-least-once). Опубликованное сообщение дойдёт до каждого подписчика даже через переподключения и перезапуски, с той оговоркой, что подписчик изредка может увидеть одно и то же сообщение дважды, поэтому потребителям стоит считать свои обработчики идемпотентными (ключуйте работу по id сообщения или дедуплицируйте по естественному ключу). Каналы хранят историю, а не выбрасывают сообщение в момент прочтения, и это открывает две вещи: реплей, когда подписчик может перечитать прошлые сообщения канала, а не только видеть то, что приходит вживую, и курсоры на подписчика, когда каждый подписчик независимо отслеживает свою позицию. Курсор означает, что подписчик, который отстал, отключился или запустился позже, продолжает ровно с того места, где остановился, а два подписчика одного канала могут находиться в совершенно разных точках потока, не мешая друг другу.
Поскольку osFoundry — это десктопное рабочее пространство local-first с собственным ключом (BYOK), эта плоскость данных работает рядом с вашей работой, а не проходит через сторонний брокер сообщений, который надо разворачивать и оплачивать за место. Каналы — это трубопровод под функциями, которым нужно реагировать на изменение в момент, когда оно происходит: агент, следящий за новыми элементами для обработки, приложение, которое обновляется, как только приходят данные сверху по потоку, или конвейер, где один этап передаёт эстафету следующему. И они позволяют этим частям обмениваться без опроса и без жёсткой связанности, при этом ваши данные могут оставаться на вашем устройстве.
Ключевые возможности
- Pub/sub-каналы развязывают производителей и потребителей, поэтому одно опубликованное событие расходится веером к каждому подписчику без изменения кода публикатора
- Доставка не менее одного раза сохраняет сообщения через переподключения и перезапуски; проектируйте потребителей идемпотентными, так как сообщение изредка может повториться
- Реплей истории позволяет подписчику перечитать прошлые сообщения, а не только ловить живой трафик, что полезно при позднем подключении и повторной обработке
- Курсоры на подписчика независимо отслеживают позицию каждого читателя, поэтому медленный, перезапущенный или поздний подписчик продолжает ровно с того места, где остановился
- Связывает агентов, приложения, код и чаты через общую плоскость данных local-first — без внешнего брокера для развёртывания и без платы за место
Сценарии использования
- Создатель агентов: агент подписывается на канал входящих задач и обрабатывает каждую, после перезапуска продолжая со своего курсора, не теряя и не переобрабатывая работу
- Разработчик приложений: приложение рабочего пространства подписывается на канал и обновляет свой вид в момент публикации данных сверху по потоку, а не опрашивает по таймеру
- Автор конвейера: этап один публикует результаты в канал, который потребляет этап два, а реплей доступен для повторной обработки истории после изменения логики
Часто задаваемые вопросы
Что означает доставка не менее одного раза для моего кода?
Она гарантирует, что опубликованное сообщение дойдёт до каждого подписчика даже через разрывы связи и перезапуски, но подписчик изредка может получить одно и то же сообщение более одного раза. Сделайте обработчики идемпотентными (дедуплицируйте по id сообщения или естественному ключу), чтобы повтор был безвредным, а не посчитанным дважды.
Может ли новый или перезапущенный подписчик наверстать пропущенные сообщения?
Да. Каналы хранят историю, и у каждого подписчика есть свой курсор, поэтому подписчик, подключившийся поздно или вернувшийся после перезапуска, может воспроизвести прошлые сообщения и продолжить с последней записанной позиции, а не видеть только трафик, приходящий во время подключения.
Делят ли два подписчика одного канала общую позицию в потоке?
Нет. Курсоры — на каждого подписчика, поэтому каждый читатель продвигается независимо. Один подписчик может быть на самом свежем сообщении, пока другой ещё разбирает более старую историю того же канала, и ни один не влияет на другого.