이 엔드포인트는 게시물 편집 메타데이터를 포함하도록 업데이트되었습니다. 이러한 메타데이터에 대해 더 알아보려면 “게시물 편집” 기본 개념 페이지를 참조하세요.
Decahose 스트림
- 확장 및 향상된 URL: - 단축 URL을 완전히 풀어 원본 URL을 제공하고, 추가 메타데이터(페이지 제목 및 설명)를 제공합니다.
- 스트림 파티셔닝 - 2개의 파티션으로 구성되며, 각 파티션은 Decahose 스트림 전체 볼륨의 50%를 포함합니다.
- 향상된 안정성 - 백엔드 시스템의 지리적 다양성
ENTERPRISE
좋아요 스트리밍
- 좋아요는 독립적인 별도 스트림으로 전달됩니다.
- 좋아요는 과거에는 “Favorites”로 불렸습니다. Enriched 네이티브 형식 페이로드는 이 명칭을 그대로 유지합니다.
- 스트림에는 공개 좋아요만 포함됩니다.
- 공개란, 좋아요를 누른 사용자, 게시물 작성자, 게시물이 모두 플랫폼에서 공개 상태임을 의미합니다.
- 좋아요는 리트윗과 매우 유사하며, 참여에 대한 공개 신호를 나타냅니다.
- 페이로드 요소에는 다음이 포함됩니다.
- 원본 게시물 객체
- 원본 게시물을 생성한 Actor 객체
- 좋아요 작업을 수행한 Actor 객체
- 원본 콘텐츠에만 좋아요를 남길 수 있습니다.
- 리트윗에는 좋아요를 남길 수 없습니다. 리트윗에 남긴 좋아요는 원본 게시물에 적용됩니다.
- 인용 Tweet에는 좋아요를 남길 수 있습니다.
- 좋아요 활동에는 (구매/적용된 경우) 해당되는 Gnip Enrichment가 포함됩니다.
- 지원되는 제품 / 기능
- 좋아요 스트림은 (구매/적용된 경우) Backfill을 지원합니다.
- 좋아요 스트림에는 Replay 지원이 없습니다.
- 좋아요에는 Search나 Historical 지원이 제공되지 않습니다.
- PowerTrack에 좋아요 지원을 추가할 즉각적인 계획은 없습니다.
- Decahose에서 제공되는 10% 샘플 포스트의 경우, 스트림에는 해당하는 공개 좋아요가 100% 포함됩니다.
- 파티션: 2
- URL 구조
가이드
복구 및 중복성
- 여러 환경을 지원하기 위해, 계정에 대해 Additional Streams를 구성할 수 있습니다. 이 스트림들은 서로 독립적이며, 서로를 구분할 수 있도록 서로 다른 stream_label을 가집니다.
- 연결 유지를 지원하기 위해, 각 Decahose 스트림은 Redundant Connections를 지원합니다. 가장 일반적인 아키텍처에서는 하나의 스트림이 두 개의 연결을 사용하며, 클라이언트 측에는 이상적으로 서로 다른 네트워크에 위치한 두 개의 독립적인 소비자가 존재합니다. 이러한 설계로 클라이언트 측 네트워크, 서버, 데이터 저장소 경로 전반에 걸쳐 중복성을 둘 수 있습니다. 각 연결마다 데이터의 전체 사본이 제공되므로, 클라이언트 측은 중복 데이터를 허용하고 이를 처리할 수 있어야 합니다.
- ‘heartbeat’가 10초마다 전송됩니다. 하지만 Decahose 스트림의 경우 데이터 양이 충분히 많기 때문에, 짧은 기간(예: 몇 초) 동안 포스트가 전혀 없는 것도 연결 문제를 의미할 수 있습니다. 따라서 데이터가 전혀 전송되지 않는 구간(data silence)과 heartbeat 부재 모두를 연결 끊김을 감지하는 데 사용할 수 있습니다.
추가 스트림
Connect to decahose partition=1
Connect to decahose partition=2 위 상황에서는 총 세 개의 연결이 발생합니다. partition=1에 두 개의 연결, partition=2에 한 개의 연결이 있는 상태입니다. 일반적으로는 각 파티션에 동일한 수의 연결을 두는 것이 바람직하므로, 이 예시는 partition=2에 대한 이중화된 연결이 끊어진 상황을 보여 주며, 추가 조사가 필요한 상태를 강조합니다. 복구
개요
Recovery 사용하기
데이터 가용성
백필(Backfill)
backfillMinutes=N 파라미터를 추가해야 합니다. 여기서 N은 연결이 다시 수립될 때 백필할 분 수(1–5, 정수만 허용)입니다. 예를 들어, 90초 동안 연결이 끊겼다면 연결 요청에 backfillMinutes=2를 추가해야 합니다. 이 요청은 연결이 끊기기 전 30초 구간을 포함해 2분 동안의 백필 데이터를 제공하므로, consumer 앱은 중복 데이터를 처리할 수 있어야 합니다.
파티션 1에 5분 백필을 요청하는 Decahose 연결 요청 URL 예시는 다음과 같습니다:
https://gnip-stream.x.com/stream/sample10/accounts/:account_name/publishers/twitter/:stream_label.json?partition=1&backfillMinutes=5
참고 사항:
-
연결 시 항상
backfillMinutes=5를 사용하는 선택지도 있으며, 그 경우 제공되는 중복 데이터를 애플리케이션에서 처리해야 합니다. - 5분을 초과해 연결이 끊긴 경우, Recovery를 사용해 데이터를 복구할 수 있습니다.
- 연결이 끊긴 기간 길이를 파악합니다.
- 5분 이내인가요?
- 스트림에 Backfill이 활성화되어 있다면, 적절한
backfillMinutes파라미터로 연결 요청을 준비합니다.
- 스트림에 Backfill이 활성화되어 있다면, 적절한
- 5분 초과인가요?
- Recovery 스트림이 있다면, 끊긴 기간에 대해 Recovery 요청을 수행합니다(필요하다면 Rules API를 사용해 현재 실시간 룰 세트를 활용하는 것이 이상적입니다).
- 5분 이내인가요?
- 새 연결을 요청합니다.
- Backfill 구현 Backfill을 사용하면 스트림 연결이 끊기기 이전 시점부터 다시 연결할 수 있으며, 최대 5분 간의 연결 끊김을 보완할 수 있습니다. 이는 연결 요청에 파라미터를 포함하는 방식으로 구현됩니다.
- 다른 위치에서 중복 스트림 소비 중복 스트림을 동일한 실시간 환경으로 흘려보내면서 데이터를 중복 제거할 수 있다면, 일반 스트림과 중복 스트림이 동시에 다운되거나 연결이 끊기는 경우를 제외하고는 Recovery가 필요하지 않습니다. 중복 스트림을 운영(production) 환경으로 실시간 스트리밍할 수 없다면 별도의 “비상(emergency)” 데이터 저장소에 적재할 수 있습니다. 그런 다음 기본 스트림 연결에 연결 끊김이나 다운타임이 발생했을 때, 시스템은 누락된 기간에 대해 기본 데이터베이스를 보완할 수 있는 데이터를 보유하게 됩니다.
- Recovery 구현 연결 끊김이나 다운타임이 기본 스트림과 중복 스트림 모두에 영향을 주는 경우, Decahose Recovery를 사용해 누락된 데이터를 복구합니다. API는 아카이브의 5일치 구간을 롤링 윈도우로 제공하며, 한 번에 최대 1시간 분량만 요청해 스트리밍하는 방식으로 활용하는 것이 가장 좋습니다. 이는 실시간 스트림과 병렬로 수행됩니다. Recovery가 제공하는 5일 윈도우를 넘어선 Decahose 데이터의 복구 솔루션은 제공되지 않으므로, 귀측 환경에서 상당한 다운타임이 발생했을 때에도 귀측에 온전한 데이터 복사본이 있도록 중복 스트림을 활용하는 것이 중요합니다.
- 수신 포스트 개수 세기 시스템은 수집 앱의 가장 초기에 수신하는 원본 포스트 개수를 집계하고, 그 숫자를 최종 데이터 저장소에 도달한 포스트 개수와 비교할 수 있는 방법을 제공해야 합니다. 차이가 발생하면 이를 모니터링하여, 수신 후 데이터가 누락되게 만드는 문제에 대해 팀에 알림을 보낼 수 있습니다.
- 비정상적인 저장 볼륨 분석 최종 데이터베이스에 저장된 데이터 볼륨을 분석해 비정상적인 감소가 있는지 확인하는 것도 좋습니다. 이 역시 문제를 나타낼 수 있지만, 볼륨 감소가 정상인 상황도 있을 수 있습니다(예: X 플랫폼을 사용할 수 없어 일정 시간 동안 사용자가 포스트를 작성할 수 없는 경우 등).
API 참조 문서
Decahose 스트림
메서드
| 메서드 | 설명 |
|---|---|
| GET /{stream-type}/:stream | 데이터 스트림에 연결합니다 |
GET :stream
실시간 데이터를 전달하는 Firehose 스트림에 대한 지속 연결을 설정합니다.요청 사양
| Request Method | HTTP GET |
| Connection Type | Keep-Alive 요청 헤더에 이를 명시해야 합니다. |
| URL | 대시보드의 스트림 API Help 페이지에서 다음 구조를 사용해 확인할 수 있습니다: Decahose: https://gnip-stream.x.com/stream/sample10/accounts/:account_name/publishers/twitter/:stream_label.json?partition=1 |
| Partition (required) | partition=\{#} - 전체 스트림을 수신하기 위해 이제 파티션 지정이 필수입니다. partition 파라미터를 지정하여 스트림에 연결해야 합니다. 스트림별 파티션 수는 아래와 같습니다:* Decahose: 파티션 2개 |
| Compression | Gzip. Gzip 압축을 사용해 스트림에 연결하려면, 연결 요청에 Accept-Encoding 헤더를 포함하면 됩니다. 헤더는 다음과 같은 형식이어야 합니다: Accept-Encoding: gzip |
| Character Encoding | UTF-8 |
| Response Format | JSON. 응답 형식으로 JSON을 사용하도록 요청 헤더에 명시해야 합니다. |
| Rate Limit | 60초당 요청 10건. |
| Backfill Parameter | Backfill이 활성화된 스트림을 구매한 경우, 이를 사용하려면 GET 요청에 “backfillMinutes” 파라미터를 추가해야 합니다. |
| Read Timeout | 클라이언트에 읽기 타임아웃(read timeout)을 설정하고, 그 값이 30초보다 크도록 설정해야 합니다. |
| Support for Tweet edits | 모든 Tweet 객체에는 Tweet의 편집 내역을 설명하는 Tweet 편집 메타데이터가 포함됩니다. 자세한 내용은 “Edit Tweets” 기본 사항 페이지를 참고하세요. |
응답
| Status | Text | Description |
|---|---|---|
| 200 | Success | 연결이 성공적으로 열렸으며, 새 activity가 도착하는 대로 전송됩니다. |
| 401 | Unauthorized | 잘못된 자격 증명으로 인해 HTTP 인증에 실패했습니다. 요청에서 자격 증명을 올바르게 사용하고 있는지 확인하기 위해, 해당 자격 증명으로 console.gnip.com에 로그인하세요. |
| 406 | Not Acceptable | 일반적으로 스트림에서 gzip 인코딩을 수락하기 위한 헤더를 클라이언트가 제대로 포함하지 않았을 때 발생하지만, 다른 상황에서도 발생할 수 있습니다. “이 연결에는 압축이 필요합니다. 압축을 활성화하려면 요청에 ‘Accept-Encoding: gzip’ 헤더를 보내고, 클라이언트 쪽에서 스트림을 읽을 때 압축을 해제할 준비를 하세요.”와 비슷한 JSON 메시지를 포함합니다. |
| 429 | Rate Limited | App이 연결 요청 한도를 초과했습니다. |
| 503 | Service Unavailable | Twitter 서버 문제입니다. 지수 백오프 패턴을 사용하여 다시 연결하세요. 이 문제에 대한 공지가 X API Status Page에 게시되어 있지 않고 10분 후에도 연결할 수 없다면 지원팀 또는 비상 연락처로 문의하세요. |