osFoundry / Platform
실시간 데이터 채널
최소 한 번 전달, 히스토리 리플레이, 구독자별 커서가 있는 Pub/sub 채널.
개요
실시간 데이터 채널은 워크스페이스의 여러 구성 요소 사이에서 이벤트를 옮기는 osFoundry의 메시징 중추입니다. 어떤 생산자든(에이전트, 실행 중인 앱, 코드 프로세스, 채팅) 이름이 지정된 채널에 메시지를 발행하면, 그 채널의 모든 구독자가 메시지를 받습니다. 전형적인 발행/구독 모델로, 생산자와 소비자가 서로 분리되어 있어 발행하는 코드를 건드리지 않고도 구독자를 추가하거나 제거할 수 있고, 하나의 이벤트를 동시에 여러 읽는 쪽으로 팬아웃할 수 있습니다.
전달은 최소 1회(at-least-once)입니다. 이미 발행된 메시지는 재연결과 재시작을 거치더라도 각 구독자에게 도달하며, 그 대가로 구독자가 이따금 같은 메시지를 두 번 볼 수 있습니다. 따라서 소비자는 핸들러를 멱등하게 다뤄야 합니다(메시지 id를 키로 삼거나 자연 키로 중복을 제거하세요). 채널은 메시지를 읽는 즉시 버리는 대신 히스토리를 보관하며, 이로써 두 가지가 가능해집니다. 하나는 리플레이로, 구독자가 실시간으로 도착하는 것만 보는 대신 채널의 과거 메시지를 다시 읽을 수 있습니다. 다른 하나는 구독자별 커서로, 각 구독자가 자신의 위치를 독립적으로 추적합니다. 커서가 있으면 뒤처지거나 연결이 끊기거나 나중에 시작한 구독자도 멈춘 지점에서 정확히 다시 이어가고, 같은 채널의 두 구독자가 스트림에서 전혀 다른 지점에 있어도 서로 간섭하지 않습니다.
osFoundry는 키를 직접 가져오는(BYOK) 로컬 우선 데스크톱 워크스페이스이므로, 이 데이터 플레인은 직접 프로비저닝하고 좌석당 비용을 내야 하는 서드파티 메시지 브로커를 거치지 않고 작업 옆에서 함께 돌아갑니다. 채널은 변화가 일어나는 순간에 반응해야 하는 기능들 아래의 배관입니다. 처리할 새 항목을 지켜보는 에이전트, 업스트림 데이터가 도착하는 즉시 갱신되는 앱, 한 단계가 다음 단계로 넘겨주는 파이프라인 같은 것들이죠. 그리고 채널은 폴링이나 긴밀한 결합 없이 이 조각들이 통신하게 하며, 데이터는 사용자의 기기에 머무를 수 있습니다.
주요 기능
- Pub/sub 채널이 생산자와 소비자를 분리하므로, 발행된 하나의 이벤트가 발행자 코드를 바꾸지 않고도 모든 구독자로 팬아웃됩니다
- 최소 1회 전달로 메시지가 재연결과 재시작에도 살아남습니다. 메시지가 이따금 반복될 수 있으니 소비자를 멱등하게 설계하세요
- 히스토리 리플레이로 구독자가 실시간 트래픽만 잡는 대신 과거 메시지를 다시 읽을 수 있어, 뒤늦게 합류하거나 재처리할 때 유용합니다
- 구독자별 커서가 각 읽는 쪽의 위치를 독립적으로 추적하므로, 느리거나 재시작되었거나 늦게 합류한 구독자도 멈춘 지점에서 정확히 이어갑니다
- 에이전트, 앱, 코드, 채팅을 공유된 로컬 우선 데이터 플레인으로 연결합니다. 프로비저닝할 외부 브로커도, 좌석당 요금도 없습니다
활용 사례
- 에이전트 개발자: 에이전트가 들어오는 작업 채널을 구독해 하나씩 처리하고, 재시작 후 커서에서 이어가 작업을 놓치거나 중복 처리하지 않습니다
- 앱 개발자: 워크스페이스 앱이 채널을 구독해 타이머로 폴링하는 대신 업스트림 데이터가 발행되는 즉시 화면을 갱신합니다
- 파이프라인 작성자: 1단계가 결과를 채널에 발행하고 2단계가 소비하며, 로직 변경 후 히스토리를 재처리하려면 리플레이를 쓸 수 있습니다
자주 묻는 질문
최소 1회 전달은 제 코드에 어떤 의미인가요?
발행된 메시지가 연결 끊김과 재시작을 거치더라도 각 구독자에게 도달함을 보장하지만, 구독자가 이따금 같은 메시지를 두 번 이상 받을 수 있습니다. 핸들러를 멱등하게 만들어(메시지 id나 자연 키로 중복 제거) 반복이 이중 계산되지 않고 무해하도록 하세요.
새로 합류하거나 재시작한 구독자가 놓친 메시지를 따라잡을 수 있나요?
네. 채널은 히스토리를 보관하고 각 구독자는 자신의 커서를 가지므로, 늦게 합류하거나 재시작 후 돌아온 구독자도 과거 메시지를 리플레이해 마지막으로 기록된 위치에서 이어갈 수 있으며, 연결된 동안 도착하는 트래픽만 보는 데 그치지 않습니다.
같은 채널의 두 구독자가 스트림에서 위치를 공유하나요?
아니요. 커서는 구독자별이므로 각 읽는 쪽이 독립적으로 진행합니다. 같은 채널에서 한 구독자는 최신 메시지까지 따라잡고 다른 구독자는 아직 더 오래된 히스토리를 처리 중일 수 있으며, 서로 영향을 주지 않습니다.