이 엔드포인트에는 게시물 편집 메타데이터가 포함되도록 업데이트되었습니다. 이러한 메타데이터에 대해 더 알아보려면 “게시물 편집” 기초 페이지를 참조하세요.
Decahose 스트림
- 확장 및 고도화된 URL: - 단축 URL을 완전히 해제하고 추가 메타데이터(페이지 제목 및 설명)를 제공합니다
- 스트림 파티셔닝 - 2개의 파티션으로 구성되며, 각 파티션은 Decahose 스트림 볼륨의 50%를 포함
- 향상된 안정성 - 백엔드 시스템의 지리적 분산
ENTERPRISE
좋아요 스트리밍
- 좋아요는 독립적인 별도 스트림으로 전달됩니다
- 좋아요는 과거에 “Favorites”로 불렸습니다. 확장된 네이티브 형식의 페이로드는 이 명칭을 유지합니다
- 스트림에는 공개 좋아요만 포함됩니다
- 공개란, 좋아요한 사용자, 게시물 작성자, 게시물이 모두 플랫폼에서 공개 상태임을 의미합니다
- 좋아요는 리트윗과 매우 유사하며 공개적인 참여 신호를 나타냅니다
- 페이로드 요소에는 다음이 포함됩니다:
- 원본 게시물 객체
- 원본 게시물을 생성한 액터 객체
- 좋아요 작업을 수행한 액터 객체
- 원본 콘텐츠에만 좋아요를 할 수 있습니다
- 리트윗에는 좋아요를 할 수 없습니다. 리트윗에 대한 좋아요는 원본 게시물에 적용됩니다
- 인용 트윗은 좋아요할 수 있습니다
- 좋아요 활동에는 해당되는 경우 Gnip Enrichments가 포함됩니다(구매/적용된 경우)
- 지원 제품/기능
- 좋아요 스트림은 백필(Backfill)을 지원합니다(구매/적용된 경우)
- 좋아요 스트림은 리플레이를 지원하지 않습니다
- 좋아요에는 검색 또는 히스토리컬 지원이 없습니다
- PowerTrack에 좋아요 지원을 추가할 즉각적인 계획은 없습니다
- Decahose에서 제공되는 10% 샘플 게시물의 경우 스트림에는 해당되는 공개 좋아요가 100% 포함됩니다
- 파티션: 2
- URL 구조
가이드
복구 및 이중화
- 여러 환경을 지원하기 위해 계정에 추가 스트림 을(를) 배포할 수 있습니다. 이 스트림들은 서로 독립적이며 구분을 위해 서로 다른 stream_label을 가집니다.
- 안정적인 연결 유지를 돕기 위해 각 Decahose 스트림은 이중 연결을 지원합니다. 가장 일반적인 아키텍처는 하나의 스트림에 두 개의 연결을 두고, 클라이언트 측에는 이상적으로 서로 다른 네트워크에 위치한 두 개의 독립 소비자(consumer)를 두는 것입니다. 이 설계를 통해 클라이언트 측 네트워크, 서버, 데이터 저장 경로 전반에서 이중화를 확보할 수 있습니다. 각 연결에서는 데이터의 전체 복제본이 제공되므로, 클라이언트 측은 중복 데이터에 내성을 갖고 이를 처리해야 합니다.
- ‘하트비트’가 10초마다 제공됩니다. 다만 Decahose 스트림의 경우 데이터 양이 충분히 많아 짧은 시간(예: 수 초) 동안 게시물이 없으면 연결 문제를 의미할 수 있습니다. 따라서 ‘데이터 무음’과 하트비트 부재 모두를 이용해 연결 끊김을 감지할 수 있습니다.
추가 스트림
개요
Recovery는 최근 X 히스토리 데이터의 롤링 5일치 구간에 스트리밍 방식으로 접근할 수 있는 데이터 복구 도구입니다(기본 데이터 수집 용도로 사용하면 안 됨). 이 도구는 소비 애플리케이션이 실시간 스트림에서 데이터를 놓친 경우(짧은 시간 동안의 연결 해제 등으로 인한 경우 또는 일정 기간 동안 실시간 데이터를 수집하지 못한 기타 모든 상황) 해당 데이터를 복구하는 데 사용해야 합니다.Recovery 사용하기
Recovery 스트림을 사용하면 앱이 실시간 스트림과 동일한 방식으로 해당 스트림에 요청을 보낼 수 있습니다. 단, 요청하려는 시간 범위를 나타내는 매개변수를 URL에 지정해야 합니다. 즉, Recovery 요청은 API에 “시간 A부터 시간 B까지의 게시물”을 요청하는 것입니다. 이후 이러한 게시물은 실시간 스트림을 모방한 방식으로 스트리밍 연결을 통해 전달되지만, 실시간보다 약간 느린 속도로 전송됩니다. 아래 예시를 참고하세요: “https://stream-data-api.x.com/stream/powertrack/accounts/someAccountName/publishers/twitter/powertrack.json?startTime=2023-07-05T17:09:12.070Z” 게시물은 지정된 기간의 첫 번째(가장 오래된) 분부터 전달되기 시작해 마지막 분이 전달될 때까지 시간순으로 계속 진행됩니다. 그 시점에 Recovery Request Completed 메시지가 연결을 통해 전송되고, 이후 서버가 연결을 종료합니다. 요청이 매칭되는 결과가 거의 없거나 전혀 없는 시간대에서 시작되면 첫 결과가 전달되기까지 시간이 걸릴 수 있습니다. 데이터는 해당 시점에 처리 중인 아카이브 구간에서 Recovery가 매칭을 발견하는 즉시 전달됩니다. 전달할 결과가 없을 때에는 스트림이 연결을 통해 캐리지 리턴, 즉 “하트비트”를 계속 보내 타임아웃을 방지합니다. Recovery는 짧은 연결 끊김으로 인해 누락된 데이터를 쉽게 복구하기 위한 도구이며, 하루 전체와 같은 매우 긴 기간에는 적합하지 않습니다. 장기간의 데이터를 복구해야 하는 경우, 더 긴 요청을 더 짧은 시간 창(예: 2시간)으로 분할해 인터넷 불안정 등으로 요청 도중 연결이 끊길 가능성을 줄이고, 장시간 요청의 진행 상황을 더 명확히 파악할 수 있도록 할 것을 권장합니다.데이터 가용성
백필
- 연결 시 항상 ‘backfillMinutes=5’를 사용한 뒤 제공되는 중복 데이터를 처리하는 방법을 선택할 수 있습니다.
- 5분 이상 연결이 끊긴 경우 Recovery를 사용하여 데이터를 복구할 수 있습니다.
- 연결 끊김 시간 파악
- 5분 이하인가요?
- 스트림에 백필이 활성화되어 있다면, 적절한 ‘backfillMinutes’ 매개변수로 연결 요청을 준비하세요.
- 5분을 초과하나요?
- Recovery 스트림이 있다면, 끊긴 기간에 대해 Recovery 요청을 수행하세요(가능하면 현재 실시간 규칙 세트로, 필요 시 Rules API 사용).
- 5분 이하인가요?
- 새 연결을 요청하세요.
- 백필 구현 백필은 스트림 연결이 끊기기 이전 시점부터 재연결할 수 있게 하며, 최대 5분의 끊김을 보완합니다. 연결 요청에 매개변수를 포함해 구현합니다.
- 다른 위치에서 이중화 스트림 소비 이중화 스트림을 동일한 실시간 환경으로 스트리밍해 데이터 중복 제거가 가능하다면, 기본 스트림과 이중화 스트림이 동시에 다운타임이나 끊김을 겪지 않는 한 복구가 필요 없습니다. 이중화 스트림을 프로덕션 환경에 실시간으로 스트리밍할 수 없다면 별도의 “비상” 데이터 저장소에 기록할 수 있습니다. 그런 다음 기본 스트림 연결에 끊김이나 다운타임이 발생하면 누락된 구간의 데이터를 기본 데이터베이스에 보충할 수 있습니다.
- Recovery 구현 끊김이나 다운타임이 기본 스트림과 이중화 스트림 모두에 영향을 미치는 경우 Decahose Recovery를 사용해 누락된 데이터를 복구하세요. API는 보관 데이터에 대해 5일 롤링 윈도우를 제공하며, 한 번에 최대 1시간 분량씩 요청해 스트리밍하는 방식이 가장 효율적입니다. 이는 실시간 스트림과 병렬로 수행합니다. Recovery가 제공하는 5일 윈도우를 넘어선 Decahose 데이터 복구 솔루션은 없으므로, 중대한 다운타임에 대비해 이중화 스트림을 활용해 귀측에서 데이터를 완전하게 보관하는 것이 중요합니다.
- 게시물 수 집계 수집 앱의 최전단에서 수신한 원시 게시물 수를 집계하고, 그 수치와 최종 데이터 저장소에 도달한 게시물 수를 비교할 수 있어야 합니다. 차이를 모니터링해 수신 후 데이터가 누락되게 하는 문제를 팀에 알릴 수 있습니다.
- 비정상 저장량 분석 최종 데이터베이스의 저장 데이터량을 분석해 비정상적인 감소를 탐지할 수도 있습니다. 이는 문제를 시사할 수 있지만, 경우에 따라 볼륨 감소가 정상인 상황도 있습니다(예: X 플랫폼 가용성 저하로 일정 기간 동안 사용자가 게시물을 생성하지 못하는 경우).
API 레퍼런스
Decahose 스트림
메서드
| 메서드 | 설명 |
|---|---|
| GET /{stream-type}/:stream | 데이터 스트림에 연결합니다 |
GET :stream
실시간 데이터가 전달되는 Firehose 스트림에 대한 지속 연결을 설정합니다.요청 사양
| 요청 메서드 | HTTP GET |
| 연결 유형 | Keep-Alive 요청 헤더에 이를 지정해야 합니다. |
| URL | 대시보드의 스트림 API 도움말 페이지에서 다음 구조로 확인할 수 있습니다: Decahose: https://gnip-stream.x.com/stream/sample10/accounts/:account_name/publishers/twitter/:stream_label.json?partition=1 |
| 파티션(필수) | partition=\{#} - 전체 스트림을 수신하려면 이제 파티션이 필수입니다. 파티션 매개변수를 지정하여 스트림에 연결해야 합니다. 아래는 스트림별 파티션 수입니다:* Decahose: 파티션 2개 |
| 압축 | Gzip. Gzip 압축으로 스트림에 연결하려면 연결 요청에 Accept-Encoding 헤더만 추가하면 됩니다. 헤더 예시는 다음과 같습니다: Accept-Encoding: gzip |
| 문자 인코딩 | UTF-8 |
| 응답 형식 | JSON. 요청 헤더에 응답 형식으로 JSON을 지정해야 합니다. |
| 요율 제한 | 60초당 요청 10회. |
| 백필 매개변수 | Backfill이 활성화된 스트림을 구매한 경우 이를 사용하려면 GET 요청에 “backfillMinutes” 매개변수를 추가해야 합니다. |
| 읽기 타임아웃 | 클라이언트에 읽기 타임아웃을 설정하고 30초보다 큰 값으로 설정되어 있는지 확인하세요. |
| Tweet 편집 지원 | 모든 Tweet 객체에는 Tweet의 편집 내역을 설명하는 Tweet 편집 메타데이터가 포함됩니다. 자세한 내용은 “Edit Tweets” 기본 사항 페이지를 참조하세요. |
응답
| Status | Text | Description |
|---|---|---|
| 200 | Success | 연결이 정상적으로 열렸으며, 새 활동은 도착하는 대로 전송됩니다. |
| 401 | Unauthorized | 잘못된 자격 증명으로 인해 HTTP 인증에 실패했습니다. 요청에서 자격 증명을 올바르게 사용 중인지 확인하려면 console.gnip.com에 로그인하세요. |
| 406 | Not Acceptable | 일반적으로 스트림에서 gzip 인코딩을 수락하는 헤더를 클라이언트가 올바르게 포함하지 못했을 때 발생하지만, 다른 상황에서도 발생할 수 있습니다. 다음과 유사한 JSON 메시지가 포함됩니다: “This connection requires compression. To enable compression, send an ‘Accept-Encoding: gzip’ header in your request and be ready to uncompress the stream as it is read on the client end.” |
| 429 | Rate Limited | 앱이 연결 요청 한도를 초과했습니다. |
| 503 | Service Unavailable | X 서버 문제입니다. 지수 백오프 패턴을 사용해 재연결하세요. 이 문제에 대한 공지가 X API Status Page에 게시되지 않았다면, 10분 후에도 연결할 수 없는 경우 지원팀 또는 긴급 지원에 문의하세요. |