alpakka项目是一个基于akka-streams流处理编程工具的scala/java开源项目,通过提供connector连接各种数据源并在akka-streams里进行数据处理。...在alpakka中,实际的业务操作基本就是在akka-streams里的数据处理(transform),其实是典型的CQRS模式:读写两方互不关联,写时不管受众是谁,如何使用、读者不关心谁是写方。...alpakka提供的producer也就是akka-streams的一种组件,可以与其它的akka-streams组件组合形成更大的akka-streams个体。...alpakka-kafka streams组件使用这个消息类型作为流元素,最终把它转换成一或多条ProducerRecord写入kafka。...还有一类如commitableSink还包括了把消息读取位置offset写入commit的功能。
Akka包含很多模块,Akka Actor是Akka的核心模块,使用Actor模型实现并发和分布式,可以将你从Java的多线程痛苦中解救出来;Akka Streams可以让你以异步非阻塞的方式处理流数据...,并且支持背压(backpressure); Akka Http实现了一套基于流的HTTP服务端和客户端;Akka Cluster可以帮你实现一个分布式集群系统;Cluster Sharding可以帮你做集群的分片处理...;Distributed Data可以帮助你在集群之间分享数据;Alpakka可以帮你为Akka Streams集成不同的数据源;Akka Persistence可以帮你处理Actor消息的持久化存储,...防止重启后数据丢失。...WEB框架 基于Scala的Web框架有很多,Play、Lift、Scalatra和Finatra等等,其中Play是Lightbend官方维护的框架。
因为akka-streams是akka系列工具的基础,如:akka-http, persistence-query等都是基于akka-streams的,其实没有真正把akka-streams用起来。...所以流处理应该是分布式数据处理的理想方式了。这是这次写akka-streams的初衷:希望能通过akka-streams来实现分布式数据处理编程。...一个流对数据的处理包括两部分:1、对流中元素进行转变,如:source:Source[Int,NotUsed] = Source(1 to 10).map(i => i.toString),把流里的所有...akka-streams提供了简便一点的运算方式runWith:指定runWith参数流组件的M为最终运算值。...够复杂的了吧。很明显,复杂点的流处理需要根据上游元素内容来维护内部状态从而重新构建向下游发送元素的机制。
EventSourcedBehaviro是akka-typed为event-sourcing事件源模式提供的开发支持。具体的原理和使用方法在前面的博客里都介绍过了,在这篇就不再重复。...而一旦出现系统锁死重启后并无有效办法恢复数据库正确状态。event-sourcing恰恰就能有针对性的解决这些问题。...从CQRS流程来解释:这组销售数据在开单时为空,然后在完成所有单据操作后一次性产生,也就是在CQRS模式的读部分产生的。在这个过程中一直是写部分的操作,不影响交易数据库状态。...当然,我们还必须在内存里维护一个模拟的状态来对每项操作进行控制,如:用户未登录时不容许任何操作动作。...单据状态在结单时用EventSourcedBehavior拿了个snapshot作为下一单的起始状态。销售中途出现异常退出后可以在上一单状态快照的基础上实施动作重演把状态恢复到出现异常之前。
这不就是妥妥的CQRS模式吗?当然kafka也可以使用在其它一些场景如:消息队列,数据存储等,不过这些都是commit-log的具体应用。...不过akka在alpakka社区提供了alpakka-kafka:这个东西是个基于akka-streams的kafka scala终端编程工具,稍微过了一下,感觉功能比较全面,那就是它了。...每个partition分担所属topic消息类型下的一些指定的细分类消息或者事件,如"图书库房101"。...要注意的是创建topic和partition都是严格的管理工作admin,不是在某些程序中任意进行增减的。一般来讲,在创建一个新topic时就要确定它下面的partition数量了。...我觉着kafka的exactly-once能力最值得推介。因为在akka或者其它消息队列工具里不容易得到保证。而在一个消息驱动的实时交易系统里,保证事件重演能正确反映当时状态是关键。
而且kafka的消息是持久性的,有重复消费控制机制可以实现数据状态的重新计算,是事件源event-sourcing模式的一项理想工具选择。这就是我选择kafka的原因。...因为零售店其它业务,如:添订货、收发货、配退货等都需要及时、准确库存数据的支持。...我们把这个库存更新功能的实现作为典型的kafka应用案例来介绍,然后再在过程中对akka系列alpakka-kafka的使用进行讲解和示范。 首先,后端业务功能与前端数据采集是松散耦合的。...这个平台是一个以alpakka-kafka-stream为主要运算框架的流计算软件。我们可以通过这次示范深入了解alpakka-kafka-stream的原理和应用。...为了实现高流量的数据消费,在设计应用系统时可以考虑构建多个kafka消费端,也就是多个reader。
Checkpoint介绍 checkpoint机制是Flink可靠性的基石,可以保证Flink集群在某个算子因为某些原因(如 异常退出)出现故障时,能够将整个应用流图的状态恢复到故障之前的某一状态,保...证应用流图状态的一致性。...1) 假设算子C有A和B两个输入源 2) 在第i个快照周期中,由于某些原因(如处理时延、网络时延等)输入源A发出的 barrier 先到来,这时算子C暂时将输入源A的输入通道阻塞,仅收输入源B的数据。...4) 当由于某些原因出现故障时,CheckpointCoordinator通知流图上所有算子统一恢复到某个周期的checkpoint状态,然后恢复数据流处理。...无论配置的最大状态大小如何,状态都不能大于akka帧的大小(请参阅配置)。 聚合状态必须适合 JobManager 内存。 建议MemoryStateBackend 用于: 本地开发和调试。
---- Akka概述 Akka 是一个开源的并发、分布式、基于消息驱动的框架,用于构建高可伸缩性、可靠性和并发性强的应用程序。...它提供了监督策略,允许在 Actor 发生故障时采取自定义的恢复操作。这有助于系统在故障时继续运行,提高了系统的可用性。...插件和扩展:Akka 提供了丰富的插件和扩展机制,可以轻松集成其他库和框架,如 Akka HTTP、Akka Streams 等,以构建全栈应用程序。...具有群集分片的事件源和CQRS(Command Query Responsibility Segregation,读写责任分离)。...对调用堆栈的误解 传统的调用堆栈模型不适用于并发编程,因为异步任务无法通过调用堆栈传递异常或通知主线程。 异步任务执行失败时,任务状态可能丢失,需要引入新的错误信令机制以及从故障中恢复的方法。
在不同的服务之间,「Akka HTTP」或「Akka gRPC」可用于同步(但不阻塞)通信,而「Akka Streams Kafka」或其他「Alpakka」连接器可用于集成异步通信。...同样重要的是要注意,当使用这些工具时,通信的双方不必使用 Akka 实现,编程语言也不重要。 传统的分布式应用 我们承认微服务也带来了许多新的挑战,它不是构建应用程序的唯一方法。...传统的分布式应用程序可能不那么复杂,在许多情况下也工作得很好。例如,对于一个小的初创企业,只有一个团队,在那里构建一个应用程序,上市时间就是一切。Akka 集群可以有效地用于构建这种分布式应用程序。...联接到种子节点 注释:当在云系统上启动集群时,如 Kubernetes、AWS、Google Cloud,、Azure、Mesos 或其他维护 DNS 或其他发现节点的方式,你可能希望使用开源「Akka...如果在系统加载时遇到可疑的误报,你应该为集群 Actor 定义一个单独的调度程序,如「Cluster Dispatcher」中所述的。 如何测试?
由于gRPC支持http/2通讯协议,支持持久连接方式及双向数据流。...所以对于POS设备这样的前端选择gRPC作为网络连接方式来实现实时的操作控制应该是正确的选择,毕竟采用恒久连接和双向数据流效率会高很多。...但NettyChannelBuilder还具备更多的设置参数,如ssl/tls设置。 3、还有:因为客户端是按照顺序来发送操作指令的,每发一个指令,等待返回结果后才能再发下一个指令。..., "com.typesafe.akka" %% "akka-persistence" % akkaVersion, "com.lightbend.akka" %% "akka-stream-alpakka-cassandra..." % "1.0.1", "org.mongodb.scala" %% "mongo-scala-driver" % "2.6.0", "com.lightbend.akka" %% "akka-stream-alpakka-mongodb
通常不令人担忧的死信 消息传递可靠性 Akka 帮助你构建可靠的应用程序,这些应用程序可以在一台机器中使用多个处理器核心(scaling up,纵向扩展)或分布在计算机网络中(scaling out,横向扩展...下文将进一步讨论这种权衡(trade-off)的细节。 作为补充部分,我们对如何在内置的基础上构建更强的可靠性给出了一些建议。...事件源 事件源(和分片)是大型网站扩展到数十亿用户的原因,其思想非常简单:当一个组件(思考 Actor)处理一个命令时,它将生成一个表示命令效果的事件列表。除了应用于组件的状态之外,还存储这些事件。...这个方案的好处在于,事件只会被附加到存储中,不会发生任何变化;这样可以完美地复制和扩展这个事件流(event stream)的使用者(即,其他组件可能会使用事件流作为在不同区域复制组件状态或对更改作出反应的手段...如果组件的状态由于机器故障或被推出缓存而丢失,则可以通过重放事件流(通常使用快照来加快进程)来重建。Akka Persistence 支持「事件源」。
关于「Actor Systems」的前一节解释了 Actor 如何形成层次结构,以及在构建应用程序时是最小的单元。本节将孤立地研究一个这样的 Actor,解释在实现它时遇到的概念。...Akka 确保这个实现细节不会影响处理 Actor 的状态。 因为内部状态对 Actor 的操作至关重要,所以状态不一致是致命的。...因此,当 Actor 失败并由其监督者重新启动时,将从头开始创建状态,就像第一次创建 Actor 时一样。这是为了使系统能够自我修复。...或者,可以通过持久化接收到的消息并在重新启动后重播(请参见「Persistence」),将 Actor 的状态自动恢复到重新启动前的状态。 行为 每次处理消息时,它都与 Actor 的当前行为相匹配。...子列表在 Actor 的上下文中维护,并且 Actor 可以访问它。
这些事件对象一般是按照二进制binary方式如blob存入数据库的。...=> updateState(event) } } 这些事件描述的存写即写这个ActionGo时不会影响到实际业务数据状态。...因为业务逻辑中一个动作的发生时间顺序往往会对周围业务数据产生不同的影响,所以现在只能考虑事件源event-sourcing这种模式了。...eventsByPersistenceId(...)启动了一个数据流,然后akka-persistence-query会按refresh-interval时间间隔重复运算这个流stream。...我们可以run这个stream把数据读入一个集合里,然后可以在任何一个线程里用这个集合演算业务逻辑(如我们前面提到的写端状态转变维护过程),可以用router/routee模式来实现一种在集群节点中负载均衡式的分配
在有状态的流处理中,当开发人员启用了 Flink 中的检查点功能时,状态会持久化存储以防止数据的丢失并确保发生故障时能够完全恢复。为应用程序选择何种状态后端,取决于状态持久化的方式和位置。...MemoryStateBackend MemoryStateBackend 是将状态维护在 Java 堆上的一个内部状态后端。键值状态和窗口算子使用哈希表来存储数据值和定时器。...可以通过 MemoryStateBackend 的构造函数增加最大大小。 状态大小受到 Akka 帧大小的限制,所以无论在配置中怎么配置状态大小,都不能大于 Akka 的帧大小。...我们需要在此强调,对于使用合并操作的有状态流处理应用程序,例如 ListState,随着时间的推移可能会累积超过 2^31 字节大小,这将会导致后续的任何检索的失败。...RocksDBStateBackend 是目前唯一支持有状态流处理应用程序增量检查点的状态后端。 在使用 RocksDB 时,状态大小只受限于磁盘可用空间的大小。
Gearpump 是以 Akka 为核心的分布式轻量级流计算,Akka stream 和 Akka http 模块享誉技术圈。...在各种会上,经常会被问到 Spark 和 Flink 的区别,如何取舍? 下面从数据模型、运行时架构、调度、时延和吞吐、反压、状态存储、SQL 扩展性、生态、适用场景等方面来逐一分析。...当前处在试验阶段的流式引擎,提供了 1 毫秒的时延,但不能保证 exactly-once 语义,支持 at-least-once 语义。同时,微批作业打了快照,作业改为流式模式重启作业是不兼容的。...而且 Flink 也支持增量快照,面对内存超大状态数据,增量无疑能降低网络和磁盘开销。 Spark 的快照 API 是 RDD 基础能力,定时开启快照后,会对同一时刻整个内存数据持久化。...只要实时产生数据、实时分析数据能产生价值,那么就可以用实时流计算技术,单纯地写一写脚本和开发应用程序,已经无法满足这些复杂的场景需求。 数据计算越实时越有价值,Hadoop 造就的批计算价值已被榨干。
简介 Akka 持久性使有状态的 Actor 能够持久化其状态,以便在 Actor 重新启动(例如,在 JVM 崩溃之后)、由监督者或手动停止启动或迁移到集群中时可以恢复状态。...事件源(Event sourcing):基于上面描述的构建块,Akka 持久化为事件源应用程序的开发提供了抽象(详见「事件源」部分)。...事件源 请参阅「EventSourcing」的介绍,下面是 Akka 通过持久性 Actor 实现的。 持久性 Actor 接收(非持久性)命令,如果该命令可以应用于当前状态,则首先对其进行验证。...换句话说,与命令相反,事件在被重播到持久性 Actor 时不会失败。事件源 Actor 还可以处理不更改应用程序状态的命令,例如查询命令。...在这种情况下,你可以配置如何在恢复时过滤来自多个编写器(writers)的重播(replayed)消息。
Akka 应用程序示例简介 写散文时,最难的部分往往是写前几句话。在开始构建 Akka 系统时,也有类似的“空白画布(blank canvas)”感觉。你可能会想:哪个应该是第一个 Actor?...您可以想象这样的传感器也可以收集相对湿度或其他有趣的数据,应用程序应该支持读取和更改设备配置,甚至可能在传感器状态超出特定范围时向房主发出警报。...在实际系统中,应用程序将通过移动应用程序或浏览器暴露给客户。本指南仅着重于存储通过网络协议(如 HTTP)调用的温度的核心逻辑,它还包括编写测试来帮助你熟悉和精通测试 Actors。...教程应用程序由两个主要组件组成: 设备数据收集:Device data collection,维护远程设备的本地表示,一个家庭的多个传感器设备被组织成一个设备组。...因为我们对每个传感器设备的状态感兴趣,所以我们将把设备建模为 Actors。正在运行的应用程序将根据需要创建尽可能多的设备 Actors 和设备组实例。 ? 在本教程中你将学到什么?
Checkpoint介绍 checkpoint机制是Flink可靠性的基石,可以保证Flink集群在某个算子因为某些原因(如 异常退出)出现故障时,能够将整个应用流图的状态恢复到故障之前的某一状态,保...证应用流图状态的一致性。...具体如下图所示: 1) 假设算子C有A和B两个输入源 2) 在第i个快照周期中,由于某些原因(如处理时延、网络时延等)输入源A发出的 barrier 先到来,这时算子C暂时将输入源A的输入通道阻塞...4) 当由于某些原因出现故障时,CheckpointCoordinator通知流图上所有算子统一恢复到某个周期的checkpoint状态,然后恢复数据流处理。...无论配置的最大状态大小如何,状态都不能大于akka帧的大小(请参阅配置)。 聚合状态必须适合 JobManager 内存。 建议MemoryStateBackend 用于: 本地开发和调试。
Source是一种允许异步流式传输和处理消息的Akka流API。 ? 此服务调用具有严格的请求类型和流响应类型。...使用流式传输消息需要使用Akka流。 tick服务调用将返回以指定间隔发送消息的源。 Akka流对这样的流有一个有用的构造函数: ? 前两个参数是发送消息之前的延迟以及它们应该发送的间隔。...将消息发送到Broker,如Apache Kafka,可以进一步解耦通信。 Lagom的Message Broker API提供至少一次的语义并使用Kafka。...当实体启动时,它会重放存储的事件以恢复当前状态。这可以是完整的更改历史记录或从快照启动,这将减少恢复时间。...每个命令必须通过实现PersistentEntity.ReplyType接口来定义要用作命令的消息类型。 ? 当一个事件成功保存时,通过将事件应用到当前状态来更新当前状态。
上面这段文字摘抄自 Akka 官网(akka.io),翻译成中文也就是:“Akka 是一个为 Java 和 Scala 构建高并发、分布式和弹性消息驱动应用程序的工具包”。...同时,作为一个“工具包”,Akka 还额外提供了许多功能,由于篇幅有限,这里就简单介绍几个包,有兴趣可以前往官网(见参考文档)详细了解~ akka-streams:流处理组件,提供直观、安全的方式来进行异步...、非阻塞的背压流处理。...~ 3.1 开发 Actor 首先,不得不提的一点是,Akka 从 2.6 版本开始,维护了 2 套 API(算上 Scala 和 Java 版本就 4 套了...看着IDE的智能提示就头大...)...如果使用现有协议如 HTTP,发送也许 3 行代码能搞定,但接收一定远不止三行。
领取专属 10元无门槛券
手把手带您无忧上云