此 endpoint 已更新,现包含 Post 编辑的 metadata。请参阅 “Edit Posts” 基础知识页面 以了解这些 metadata 的详细信息。
Decahose stream
- 扩展与增强的 URL: - 完整展开短链接并提供额外的 metadata(页面 title 和描述)
- Stream 分区 - 2 个分区,每个分区包含 Decahose stream 流量的 50%
- 增强的可靠性 - 后端系统具备地域多样性
ENTERPRISE
likes 流式传输
- likes 通过独立的 stream 传递
- likes 历史上称为“Favorites”。增强的原生格式载荷保留了这一命名
- streams 仅包含公共 likes
- “公共”意味着点赞用户、Post 创建者和 Post 在平台上均为公开
- likes 与 转发 非常相似,代表一种公开的互动信号
- 载荷元素包括:
- 原始 Post 对象
- 创建原始 Post 的参与者对象
- 执行 like 操作的参与者对象
- 只有原创内容可以被 like
- 转发 不能被 like。对转发 的 like 将应用于原始 Post
- 引用的 Tweet 可以 被 like
- like 活动包含适用的 Gnip Enrichments(如已购买/应用)
- 支持的产品/功能
- likes streams 支持 Backfill(如已购买/应用)
- likes streams 不支持 Replay
- likes 不支持 Search 或 Historical
- 目前暂无将 likes 支持添加到 PowerTrack 的计划
- 对于在 Decahose 中分发的 10% 抽样 Post,stream 将包含 100% 的适用公共 likes
- 分区: 2
- URL 结构
使用指南
恢复与冗余
- 为支持多个环境,我们可以为你的账户部署Additional Streams。这些 streams 互相独立,并带有不同的 stream_label 以便区分。
- 为帮助维持连接,每个 Decahose stream 都支持Redundant Connections。最常见的架构是一个 stream 建立两个连接,客户端侧有两个彼此独立的消费者——最好位于不同网络。通过这种设计,可在客户端侧的网络、服务器和数据存储路径上实现冗余。请注意,每个连接都会传输一份完整的数据副本,客户端必须能够容忍并处理重复数据。
- 每 10 秒会发送一次“heartbeat”;然而,在 Decahose stream 中,data 量足够大,即便是短时间(例如几秒)没有 Post 也可能表示连接问题。因此,既可通过“数据静默”也可通过缺少 heartbeat 来检测断连。
额外的 Streams
概述
Recovery 是一款数据恢复工具(不用于主要数据采集),可提供对最近 X 历史数据的滚动 5 天窗口的流式访问。它应在以下情况下用于数据恢复:当您的消费端应用因短时断连,或因其他原因在一段时间内未能摄取实时数据而错过实时 stream 数据时。使用 Recovery
通过 Recovery stream,您的应用可以以与实时 stream 相同的方式向其发起请求。但您的应用必须在 URL 中指定参数以表明所请求的时间窗口。换言之,Recovery 请求会向 API 请求“从时间 A 到时间 B 的 Posts”。随后,这些 Posts 将通过您的流式连接以模拟实时 stream 的方式交付,但速率会略低于实时。请参见下方示例: “https://stream-data-api.x.com/stream/powertrack/accounts/someAccountName/publishers/twitter/powertrack.json?startTime=2023-07-05T17:09:12.070Z” Posts 会从指定时间段的第一个(最早)分钟开始交付,按时间顺序持续到最后一分钟。届时,会通过连接发送一条 Recovery Request Completed 消息,随后服务器将关闭该连接。如果您的请求起始于匹配结果很少或没有结果的时间点,那么在首次结果交付前可能会有一段等待——当 Recovery 在当时正在处理的归档部分遇到匹配项时才会交付 data。当没有可交付的结果时,stream 将继续通过连接发送回车符(“心跳”)以防止连接超时。 Recovery 旨在作为一种便捷工具,用于恢复因短暂断连而遗漏的 data,而非用于覆盖很长的时间段(例如整整一天)。如果需要在较长时间段内恢复 data,建议将较长请求拆分为较短的时间窗口(例如两小时),以降低因网络波动或其他原因导致请求中途断开的可能性,并提升对长请求进度的可见性。数据可用性
回填
- 您可以在每次连接时始终使用“backfillMinutes=5”,然后处理可能出现的重复 data。
- 如果断开连接超过五分钟,您可以使用 Recovery 来恢复 data。
- 确定断开时长。
- 5 分钟及以下?
- 如果为 stream 启用了 Backfill,请使用合适的 backfillMinutes 参数准备连接请求。
- 超过 5 分钟?
- 如果您有 Recovery stream,请针对断开时间段发起 Recovery 请求(理想情况下使用您当前的实时规则集,必要时使用 Rules API)。
- 5 分钟及以下?
- 请求新的连接。
- 实施回填 回填允许您从断开 stream 连接之前的某一时间点重新连接,覆盖最长 5 分钟的断开。通过在连接请求中包含相应参数实现。
- 从其他位置消费冗余 stream 如果冗余 stream 能够接入相同的线上环境并对 data 进行去重,则除非主 stream 和冗余 stream 同时出现停机或断开,通常无需进行恢复。如果冗余 stream 无法实时接入生产环境,可将其写入单独的“应急”数据存储。这样,在主 stream 连接发生断开或停机时,系统可用其填补主数据库在相应时段的缺失 data。
- 实施 Recovery 当断开或停机同时影响主 stream 与冗余 stream 时,使用 Decahose Recovery 恢复遗漏的 data。该 API 提供覆盖 5 天存档的滚动窗口,最佳做法是每次请求不超过 1 小时的窗口并以流式方式导入,与实时 stream 并行进行。请注意,我们无法提供超出 Recovery 所提供 5 天窗口之外的 Decahose data 的恢复方案,因此务必使用冗余 stream,确保在您侧出现较长停机时,您仍拥有完整的 data 副本。
- 统计入站 Posts 系统应在摄取 App 的最前端统计接收的原始 Posts 数量,并提供方式将这些数字与最终数据存储中到达的 Posts 数量进行对比。可监控任何差异,并提醒团队注意接收后导致 data 丢失的问题。
- 分析异常的存储量 您也可以分析最终数据库中存储的 data 量,查找异常下降。这同样可能表明存在问题,尽管在某些情况下量的下降是正常的(例如 X 平台不可用,用户在一段时间内无法创建 Posts)。
API 参考文档
Decahose stream
方法
方法 | 说明 |
---|---|
GET /{stream-type}/:stream | 连接到数据流 |
GET :stream
建立与 Firehose stream 的持久连接,通过该连接传输实时 data。请求规范
请求方法 | HTTP GET |
连接类型 | Keep-Alive 应在请求的 header 中指定。 |
URL | 可在控制台中该 stream 的 API Help 页面找到,结构如下: Decahose: https://gnip-stream.x.com/stream/sample10/accounts/:account_name/publishers/twitter/:stream_label.json?partition=1 |
分区(必填) | partition=\{#} - 现需使用分区才能消费完整的 stream。连接到 stream 时需指定分区参数。以下为每个 stream 的分区数:* Decahose:2 partitions |
压缩 | Gzip。要以 Gzip 压缩连接到 stream,只需在连接请求中发送 Accept-Encoding header。该 header 应如下所示: Accept-Encoding: gzip |
字符编码 | UTF-8 |
响应格式 | JSON。请求的 header 中应指定响应采用 JSON 格式。 |
请求速率限制 | 每 60 秒 10 次请求。 |
Backfill 参数 | 如果你购买了启用 Backfill 的 stream,需要在 GET 请求中添加 “backfillMinutes” 参数以启用。 |
读取超时 | 在客户端设置读取超时,并确保其值大于 30 秒。 |
对 Tweet 编辑的支持 | 所有 Tweet 对象都将包含描述其编辑历史的 Tweet 编辑 metadata。更多详情请参见 “Edit Tweets” 基础页面。 |
响应
状态 | 文本 | 说明 |
---|---|---|
200 | 成功 | 连接已成功建立,新的活动会在到达时通过该连接发送。 |
401 | 未授权 | 由于凭据无效,HTTP 认证失败。请使用你的凭据登录 console.gnip.com,确认在请求中正确使用。 |
406 | 不可接受 | 通常发生于客户端未正确包含接受来自 stream 的 gzip 编码的请求头,但也可能在其他情况下出现。 将包含一条类似于 “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.” 的 JSON 消息。 |
429 | 触发请求速率限制 | 你的 App 已超出连接请求的限制。 |
503 | 服务不可用 | Twitter 服务器问题。请按指数退避模式重新连接。若 X API Status Page 上未发布关于此问题的通知,并且在 10 分钟后仍无法连接,请联系支持或紧急渠道。 |