Faust:把 Kafka Streams 搬到 Python 里 文章目录Faust把 Kafka Streams 搬到 Python 里Faust把 Kafka Streams 搬到 Python 里Robinhood 开源的 Faust是一个 Python 流处理库斩获 6.8k Star。Faust 做的事情很明确把 Kafka Streams 那套能力搬到了 Python 里。Robinhood 用它搭建分布式系统和实时数据管道每天处理数十亿事件。纯 Python不用 DSLFaust 不需要专用 DSL会 Python 就能上手。它基于 3.6 的 async/await 语法同时支持 mypy 静态类型检查。定义 agent 就是在消费一个 Kafka topicimportfaustclassOrder(faust.Record):account_id:stramount:intappfaust.App(myapp,brokerkafka://localhost)app.agent(value_typeOrder)asyncdeforder(orders):asyncfororderinorders:print(fOrder for{order.account_id}:{order.amount})Agent 是 async def 函数除了处理流数据还能同时做 HTTP 请求。Faust 也用 app.timer 装饰器支持定时任务方便做数据生产或周期性操作。Record 定义了消息的序列化结构底层用 JSON 编解码开发者只管写 Python 类就行。带状态的流处理Faust 内置了分布式 K/V 存储基于 RocksDB用法跟字典一样countsapp.Table(click_counts,defaultint)app.agent(click_topic)asyncdefcount_click(clicks):asyncforurl,countinclicks.items():counts[url]count数据按 key 分区同一 key 落到同一个 worker。状态通过 Kafka changelog topic 做预写日志节点宕机后 standby 节点从 changelog 恢复状态并接管工作。Table 支持窗口聚合统计过去一小时的点击数这类场景开箱即用。支持 tumbling、hopping、sliding 三种窗口类型过期数据自动清理。规模与性能单 core worker 实例每秒可处理数万事件。数据经过 Kafka topic 分区天然支持水平扩展加实例就能提升吞吐。生态整合Faust 可以和 NumPy、PyTorch、Django、Flask、SQLAlchemy 等库一起用。通过 eventlet 桥接现有 Django/Flask 项目也能集成 Faust。安装pip install -U faust生产环境推荐安装 RocksDB 支持pip install faust[rocksdb]其他可选插件包括 redis缓存、datadog/statsd监控、uvloop事件循环优化。现状项目已 deprecated官方停止维护。社区活跃分支在 faust-streaming。Faust 的意义在于它证明了 Python 也能做流处理。之前这类工作基本被 Java 生态垄断Faust 把门槛降到了会 Python 就行的程度。对于已经重度使用 Python 的团队这是一个值得关注的方向。这类工作基本被 Java 生态垄断Faust 把门槛降到了会 Python 就行的程度。对于已经重度使用 Python 的团队这是一个值得关注的方向。