流处理的前世今生(十)从演员到智能体akka的商业化大戏

B站影视 韩国电影 2025-09-30 05:33 1

摘要:Akka Streams 是响应式流处理库之一,已为特斯拉等公司处理了数万亿个事件,在最新基准测试中实现了延迟仅为9毫秒的性能下,提供每秒140万笔交易,。Akka的最大优势在于其自动背压管理和类型安全的组合模型,使开发者能够构建复杂的流处理应用程序,优雅地处

Akka Streams 是响应式流处理库之一,已为特斯拉等公司处理了数万亿个事件,在最新基准测试中实现了延迟仅为9毫秒的性能下,提供每秒140万笔交易,。Akka的最大优势在于其自动背压管理和类型安全的组合模型,使开发者能够构建复杂的流处理应用程序,优雅地处理资源约束。然而,这种复杂性伴随着陡峭的学习曲线。

Akka的开发团队认为,编写正确的并发与分布式、具备弹性与自愈能力的应用程序太过困难。大多数情况下,这是因为使用了错误的工具和错误的抽象层次。

Akka 设计的目的就是为了改变这一情况。

通过采用 Actor 模型,提升了抽象层次,提供了一个更好的平台来构建正确的并发与可扩展应用程序。这个模型与 Reactive Manifesto(响应式宣言)中提出的原则完美契合。

在弹性方面,Akka的设计采用了 “让它崩溃”(Let it crash) 的模型。电信行业正是通过这种方式取得巨大成功,构建出能够自我修复、永不停机的应用和系统。

同时,Actor 还提供了透明分布式的抽象,并为真正可扩展且具备容错能力的应用奠定了基础。

Actor 模型是一种并发编程的思维方式,它把程序里的计算单元看作一个个“Actor”(演员/角色),而不是传统的线程或对象。

Actor的核心概念:

最基本的单位Actor每个 Actor 就像一个独立的小个体,有自己的状态和行为(逻辑)。它不会被外部直接修改状态,只能通过消息通信来互动。消息传递Actor 之间靠 异步消息 来通信,不共享内存。这避免了锁、竞争条件等传统并发编程里的麻烦。消息处理每个 Actor 收到消息时,会依次处理(相当于自己的“邮箱”)。处理消息时,它可以做三件事:改变自己的内部状态。给其他 Actor 发送消息。创建新的 Actor。容错和监督(Supervision)Actor 可以监控它创建的子 Actor,如果子 Actor 出错,可以选择重启它,而不是让整个系统崩溃。这就是 Akka 提到的 “Let it crash” 哲学。

举个例子, 想象一个餐厅:

服务员是一个 Actor,厨师是另一个 Actor。顾客(外部输入)把订单给服务员,服务员不会自己做菜,而是把消息(订单)发给厨师。厨师做完菜,再通过消息通知服务员。每个人只管自己的职责,不会直接修改对方的状态。

Actor Model

这样做的好处是:

天然并发(每个 Actor 独立工作)。高容错(某个 Actor 崩了,不影响其他 Actor)。可扩展(多加几个厨师 Actor 就能扩展处理能力)。

Actor 模型和面向对象(OOP)在表面上有点像:

都强调对象/Actor有自己的状态和行为。都是通过封装来保护内部状态。

但核心区别在于 并发模型通信方式

状态共享方式面向对象 (OOP):对象之间常常共享内存,方法调用可能直接修改别的对象的状态。Actor 模型:Actor 的状态只能自己改,外部不能直接访问,只能通过消息传递。通信方式OOP:对象之间通过同步方法调用(像打电话,等对方接听并回应)。Actor 模型:Actor 之间通过异步消息通信(像发短信,发完就不用等,可以继续干别的并发处理OOP:并发依赖线程 + 锁,开发者要自己处理 race condition、死锁等复杂问题。Actor 模型:天然支持并发,每个 Actor 独立处理消息队列,不需要显式加锁。错误处理OOP:错误一般用异常机制,但错误可能蔓延到整个系统。Actor 模型:有监督(Supervision)机制,Actor 可以监控和重启子 Actor 。

总之,OOP 注重 “对象之间的关系和协作”,偏建模和封装。Actor 模型注重 “并发下的独立性和消息驱动”,偏分布式和容错。

响应式宣言(Reactive Manifesto,2013年)是业界在面对大规模互联网应用、移动互联和云计算环境下提出的一套系统设计原则。

它定义了现代系统应该具备的四个特性:

Responsive(响应性):系统能在合理时间内对用户或事件做出响应。Resilient(弹性):系统即使部分出错也能继续工作(容错)。Elastic(伸缩性):系统能根据负载自动扩展或收缩。Message-driven(消息驱动):系统内部组件通过异步消息传递解耦,从而支持响应性、弹性和伸缩性。

它的目标是:帮助开发者构建在复杂分布式环境下依然稳定、高效、可扩展的应用系统。

在大规模并发和分布式系统中,传统架构面临:

阻塞调用导致响应慢。单点故障导致系统崩溃。难以扩展以应对突发流量。开发者需要写大量复杂的并发控制代码(锁、线程管理)。

响应式宣言提供了一套系统性设计原则,告诉我们应该通过消息驱动的方式来实现高响应性、容错性和可扩展性。而Akka则是这一原则的践行者。

Akka Streams 是Akka 工具包的一个核心模块,专门用于构建响应式流处理应用。是 Akka 生态系统的重要组成部分。

Akka的主要模块是

Akka Core(Actor 系统) - 底层基础Akka Streams - 基于 Actor 构建的流处理层Akka HTTP - 基于 Streams 构建的 Web 服务层// Akka Streams 底层运行在 Actor 系统之上iMPLicit val system: ActorSystem = ActorSystem("StreamSystem")implicit val materializer: Materializer = Materializer(system)// 流处理实际上是由 Actor 执行的Source(1 to 100).map(_ * 2) // 在 Actor 中执行.runWith(Sink.foreach(println)) // 物化为 Actor 图

2010年,Akka Actor 系统首次发布, 2015年Akka Streams 作为 Akka 2.4 的一部分发布。现在: Akka Streams 是 Akka 平台的标准流处理解决方案

Akka Streams 提供了三个基本抽象:

Source - 数据源Flow - 数据变换Sink - 数据终点val source: Source[Int, NotUsed] = Source(1 to 1000)val flow: Flow[Int, String, NotUsed] = Flow[Int].map(_.toString)val sink: Sink[String, Future[Done]] = Sink.foreach(println)// 组合成完整的流处理图source.via(flow).runWith(sink)

与 Akka HTTP 集成

// HTTP 路由中使用 Streamspath("upload") {fileUpload("file") { case (metadata, byteSource) =>val sink = FileIO.toPath(Paths.get("/tmp/upload"))val uploadFuture = byteSource.runWith(sink)onComplete(uploadFuture) { ... }}}

与 Akka Actors 互操作

// Actor 作为 Sinkval actorSink = Sink.actorRef[String](ref = myActor,onCompleteMessage = "stream-completed")// Actor 作为 Source val actorSource = Source.actorRef[String](completionMatcher = PartialFunction.empty,failureMatcher = PartialFunction.empty,bufferSize = 100,overflowStrategy = OverflowStrategy.fail)


简单来说Akka Streams = Akka Actors + 流处理抽象

它让你能够:

从最近的进展来看,Akka streams已经成功转型,定位为为AI智能体编排提供实时数据处理。

source https://akka.io/app-types/agentic-ai

那么Akka streams为什么能转型做 AI 智能体编排呢?

AI 智能体编排的主要面临以下的难题,而Akka可以很好的解决这些挑战:

异步并发调用一个智能体可能要并发调用多个外部模型或 API(LLM、数据库、工具),传统同步方式容易阻塞。Akka 的 Actor 天生异步,不会出现阻塞线程的问题。Actor 模型不依赖具体领域,它描述的是“独立智能体之间通过消息交互”的模式。AI 智能体本质上就是 Actor 的一种应用:有自己的状态、逻辑、消息输入输出。上下文数据流管理智能体要处理长上下文(对话历史、环境数据),还可能是实时流(日志、传感器、事件流)。智能体编排需要处理实时上下文(对话流、事件流、传感器数据等)。Akka Streams 提供了背压(backpressure)、容错和高吞吐的流式处理模型,能稳定地把数据送到智能体。Akka Streams 提供了强大的数据流处理和组合能力。容错与自愈智能体可能失败(API超时、模型挂了),如果没有恢复机制会导致整个系统崩溃。Akka 的监督机制(Supervisor)可以自动重启失败组件。复杂的AI 智能体往往需要分布在不同节点(比如推理服务、数据流、检索引擎),Akka 的分布式透明性 + Supervisor 模型(“Let it crash”)保证了可靠性。可扩展性随着智能体数量和调用量的增长,需要自动扩展。Akka Cluster + Sharding 能让 Actor 按需分布式部署,天然支持水平扩展。多智能体协作智能体之间要互发消息、协同完成任务(比如一个负责搜索,一个负责推理,一个负责决策)。智能体交互必须响应快、容错好、能扩展,而这正是响应式宣言的四大特性。Akka 已经是一个响应式编程框架,自然能延伸到 AI 智能体的场景。Actor 模型就是为这种 消息驱动协作 而生的。

Akka 之前一直是Apache 2.0 开源许可,广泛应用于分布式系统、IoT、金融、电信等关键场景。但 Akka 的主要开发公司 Lightbend 长期承担核心维护、升级、文档、社区支持等成本。大量大公司(尤其是金融、云厂商、流媒体等)在生产系统中使用 Akka,但并没有为其开发和维护投入资金。

Lightbend 面临 商业模式难题

继续完全免费 → 难以维持高水平研发。纯商业闭源 → 会导致生态断裂,社区用户流失。


于是Lightbend决定把Akka的许可证从Apache转为BSL。那么为什么要选择 BSL(Business Source License)

BSL 是一种“延迟开源”许可:软件仍然开源(源代码可见),但商业使用受到限制。一般会规定:小公司或非商业用途可以免费使用,大公司需要付费。一段时间后(比如 3 年),代码自动转换为更宽松的开源许可(比如 Apache 2.0)。

对 Akka 来说:

保证可持续的商业收入(大公司必须付费才能合法使用)。保持一定程度的 开源透明度(代码依然公开)。给予社区和学术研究一定的 免费空间

Lightbend 在 2022 年官方公告中提到的主要理由:

确保核心团队可持续发展:避免“免费为大企业打工”。加速研发:希望通过商业收入支持更多功能、性能优化、与 AI/云原生结合。公平性:让从 Akka 获益巨大的大公司承担合理费用。

于是社区出现分裂 → Apache Pekko 诞生(Akka 的开源分支,延续 Apache 2.0 许可)。

在开源社区,这样的故事并不是一个个例,类似的故事还有

MongoDB原始许可:AGPLv3变更后:SSPL(Server Side Public License,2018年)原因:云厂商(尤其是 AWS)基于 MongoDB 提供托管服务,却没有回馈社区。结果:MongoDB 改用 SSPL,要求任何把 MongoDB 作为 SaaS 提供的厂商必须开源其整个托管平台 ,争议很大,未被 OSI 批准为“开源”。Elastic (Elasticsearch & Kibana)原始许可:Apache 2.0变更后:SSPL + Elastic License (2021年)原因:和 MongoDB 类似,大型云厂商提供 Elasticsearch 托管服务而没有贡献回馈。结果:Elastic 公司宣布双许可,社区一度分裂,出现了 Amazon 主导的 OpenSearch 分支。Redis (Redis Modules)原始许可:核心 Redis 是 BSD,但部分官方模块曾用 Apache 2.0变更后:改为 Redis Source Available License (RSAL, 2018年)原因:避免云厂商直接商业化 Redis 模块而不回馈。结果:核心 Redis 仍然是开源(BSD),但部分模块改为 Source Available。CockroachDB原始许可:Apache 2.0变更后:BSL (2019年)原因:和 Akka 类似,想避免大公司免费用,同时保障 Cockroach Labs 的商业可持续性。结果:BSL 下三年后代码会回归开源(Apache 2.0),算是折中的做法。TimescaleDB原始许可:Apache 2.0变更后:Timescale License (2021年,类似 BSL)原因:确保商业收入,用于支持持续开发。结果:基本思路和 CockroachDB、Akka 一样:免费用在小规模或非商业,企业级功能要付费HashiCorp (Terraform, Vault, Consul, Nomad)原始许可:MPL 2.0变更后:BUSL(Business Source License,2023年)原因:云厂商直接基于 HashiCorp 产品提供托管服务,而没有商业合作。结果:引起社区强烈反弹,Terraform 社区分叉出 OpenTF(后改名为 OpenTofu)Neo4j原始许可:AGPL变更后:Neo4j Commercial License + 开源核心 (2018年)原因:商业化需要,类似于“核心开源 + 企业功能闭源”的策略。Benthos (Redpanda connect)原始许可:MIT变更后:核心引擎仍是 MIT 许可,但部分连接器或扩展被重新许可为收费/企业版本结果:社区对这种商业化控制、重命名整合等操作存在质疑,已有分叉项目 Bento 出现。

Akka /Akka Streams 是一个成熟且技术先进的平台,它在响应式流处理领域成功地平衡了性能、可靠性和开发者生产力。其 12 年的发展历程展现了惊人的适应能力——从分布式并发框架 → 响应式系统 → 流式处理 → AI 智能体编排编,演变为支撑全球范围内万亿级事件系统的生产级基础设施。

该技术在一些特定的场景中表现尤为出色:需要中高吞吐量并具备自动资源管理、复杂集成需求,以及对类型安全和容错能力有严格要求。像 Adobe、Tubi 和 Tesla 等公司都已在生产环境中成功部署,展现出令人印象深刻的性能特征和运行可靠性。

然而Akka也有一定的限制,主要表现为:

陡峭的学习曲线Actor模型思维转换(从OOP到消息传递)异步编程复杂性响应式流概念理解开发者反馈需要2-3个月达到生产级熟练度调试和故障排查困难异步消息传递难以跟踪Dead Letters问题诊断分布式系统的状态一致性检查缺乏传统断点调试支持许可证和生态系统问题2022年,Akka从Apache 2.0转为Business Source License (BSL),社区的社区贡献减少Apache Pekko分支出现,生态开始分裂性能权衡和复杂性Actor创建开销(每个Actor ~400字节)消息传递比直接方法调用慢序列化/反序列化成本网络通信延迟

Akka 的 12 年演化史,不仅是技术从 Actor 模型到智能体编排的历程,也是开源软件在商业化压力下不断自我调整的缩影。它们的代码仍在运行,但自由的边界已悄然改变。

来源:闻数起舞

相关推荐