内容提要
Canva的产品分析在帮助团队衡量产品特性的影响并做出数据驱动的决策方面起着重要作用。他们通过A/B测试新功能,确保只发布提供更好用户体验的功能。他们的产品分析管道每天处理250亿个事件,可实现99.999%的正常运行时间。他们的团队将任务分为三个类别:结构、收集和分发。他们使用Protobuf定义分析事件模式,并使用Datumgen生成多种语言的代码。他们使用Kinesis Data Stream收集事件,并使用Snowpipe Streaming将事件传递给Snowflake。他们还使用SQS作为KDS的回退选项。他们的服务提供至少一次的保证,确保事件至少被传递一次。
延伸解读
模式兼容性:为何必须完全传递兼容
Canva要求分析事件模式必须完全传递兼容,即任意版本的模式都能反序列化任意版本的事件。这是因为事件数据被无限期存储,数据科学家需要用当前模式读取三年前的数据,而未来模式也要能读取今天的数据。若进行破坏性变更,需迁移所有历史数据,成本高昂。因此,唯一允许的破坏性变更是创建全新模式。这种严格规则确保了数据的长期可读性和下游消费者的稳定性。
从SQS/SNS迁移到Kinesis:成本与维护的权衡
早期MVP使用SQS和SNS,虽然易于设置和扩展,但费用占整个服务成本的80%。迁移时对比了MSK和KDS:MSK成本降低40%,延迟低30%(仅10-20ms差异),但维护复杂;KDS成本降低85%,维护极低,仅需调整分片数量。最终选择KDS,使成本降低20倍。这表明在成本敏感且维护资源有限时,KDS是更优选择。
压缩与SQS回退:优化成本与延迟
通过将事件批量压缩(zstd)后发送,压缩比达10倍,每年节省60万美元AWS成本。同时,针对KDS的高尾延迟和分片吞吐限制,使用SQS作为溢出保护,当KDS节流或响应过慢时转投SQS,保持p99响应时间低于20ms,每月SQS成本不到100美元。这既保障了性能,又提供了故障转移能力。
至少一次交付:消费者需自行去重
Canva的分析事件服务提供至少一次交付保证,即事件被服务器接受后,至少会送达所有订阅消费者一次。这意味着消费者可能收到重复事件,需要自行实现去重逻辑。这种设计简化了服务端的复杂性,但要求消费者具备幂等处理能力。对于数据准确性要求高的场景,去重是必要步骤。
Q&A
Canva的产品分析如何帮助团队做出决策?
Canva的产品分析通过衡量产品特性的影响,帮助团队做出数据驱动的决策,并确保只发布提供更好用户体验的新功能。
Canva每天处理多少个事件?
Canva的产品分析管道每天处理250亿个事件,正常运行时间达到99.999%。
Canva如何确保事件模式的兼容性?
Canva使用Protobuf定义事件模式,确保事件模式具有良好的文档和机器可读性,并遵循向前和向后兼容的规则。
Canva使用什么工具生成事件模式的代码?
Canva使用名为Datumgen的工具生成多种语言的代码,以支持事件的发送和消费。
Canva如何优化数据传输成本?
Canva通过压缩数据和批量发送事件来优化数据传输成本,节省了AWS成本。
Canva的事件传递保证是什么?
Canva的服务提供至少一次的保证,确保事件至少被传递一次,消费者需自行处理事件去重。