️ 引言 近两年,一直在折腾用FP与OO共存的编程语言Scala,采取以函数式编程为主的方式,结合TDD和BDD的手段,采用Domain Driven Design的方法学,去构造DDDD应用(Domain Driven Design & Distributed).期间,尝试了大量的框架:业务领域主要适用Akka.Scalaz等框架,UI和基础设施方面主要适用Spring.Kafka等框架,测试则主要适用Spock.ScalaTest.Selenium等框架. 两年的折腾,不能说没有一点收获.在…
对不起,akka typed 我是不准备进行源码分析的,首先这个库的API还没有release,所以会may change,也就意味着其概念和设计包括API都会修改,基本就没有再深入分析源码的意义了.另外这个typed actor跟OOP的class差别还是很大的,目前的API还是很丑的,至少我看着非常别扭啊.如果各位读者对这个有兴趣,去谷歌一下,看看它一些简单的介绍就好了,千万不要在生产使用. 不过我们也可以分析一下akka typed出现的原因.在我们会用actor开发的时候一定会遇到这样的…
引言 2019年11月6号LightBend公司发布了AKKA 2.6版本,带来了类型安全的actor,新的Akka Cluster底层通信设施——Artery,带来了更好的稳定性,使用Jackson进行消息序列化,支持SLF4J日志接口.Akka Typed与之前的经典actor编程模式有较大的不同,本文翻译自Manuel Bernhardt——Akka技术推广大使,在2019年7月发布的系列文章:Tour of Akka Typed: Protocols and Behaviors,文中的示…
akka-typed中已经没有PersistentActor了.取而代之的是带有EventSourcedBehavior的actor,也就是一种专门支持EventSource模式的actor.EventSource的原理和作用在之前的博客里已经有了比较详细的介绍,这里就不再重复了.本篇直接从EventsourcedBehavior actor的具体应用开始介绍.支持EventSource应用的基本数据类型包括 指令Command, 事件Event,状态State.EventSourcing其实就…
Actors Defining an actor class MyActor extends Actor { def receive = { } } In Scala, the receive block is actually a partial function, which allows the usage of pattern matching syntax. Creating actors Actor with default constructor 使用actorOf创建actor,…
引言 朋友看罢我之前整理的<Akka Typed 官方文档之随手记>,一人用了诗歌<长城长>作为回赠,另一人则要求推出简化版本.于是抽空整理了几张思维导图,并且用了一些不太恰当的比喻,不知此番效果如何. Markdown语法默认不支持图片比例,所以请使用右键点击图片 -> 在新标签页中打开图片可看大图. Actor简话 一图说明Actor究竟是个什么东西,包括Actor的特点.结构.生命周期和一些必须遵守的重要原则,等等. 怎么和Actor谈恋爱 一图说明怎么和Actor打交…
引言 DDD是近年软件设计的热门.CQRS与Event Sourcing作为实施DDD的一种选择,也逐步进入人们的视野.围绕这两个主题,软件开发的大咖[Martin Fowler].[Greg Young].[Udi Dahan]分别有所论述,[MSDNC QRS Journey].[Implementing DDD].[Patterns, Principles, and Practices of DDD]等著述也提供了范例,国内外各大论坛的文章和DDD开源框架更是数不胜数,为学习CQRS和Ev…
引言 Lagom是出品Akka的Lightbend公司推出的一个微服务框架,目前最新版本为1.6.2.Lagom一词出自瑞典语,意为"适量". https://www.lagomframework.com/documentation/1.6.x/scala/Home.html Lagom框架坚持,微服务是按服务边界Boundary将系统切分为若干个组成部分的结果,这意味着要使它们与限界上下文Bounded Context.业务功能和模块隔离等要求保持一致,才能达到可伸缩性和弹性要求,从…
Akka程序的特点之一就是高弹性或者强韧性(resilient)的,因为Actor具有自我修复的能力.当Actor模式的程序出现中断情况如:系统崩溃.人为终结等,系统在重启后有关Actor可以恢复之前的状态.这项功能是通过PersistentActor实现的.PersistentActor是一种特殊的带有内部状态的Actor,它是以事件来源模式(event-sourcing)来进行内部状态持久化的.持久化是指存入由文件或数据库形成的日志.事件来源模式具体的工作原理原则上就是把使状态产生变化的事件…
前面提到过,akka-typed中较重要的改变是加入了EventSourcedBehavior.也就是说增加了一种专门负责EventSource模式的actor, 最终和其它种类的actor一道可以完美实现CQRS.新的actor,我还是把它称为persistentActor,还是一种能维护和维持运行状态的actor.即,actor内部状态可以存放在数据库里,然后通过一组功能函数来提供对状态的处理转变,即持续化处理persistence.当然作为一种具备EventSourcedBehavior的…
个人觉得akka提供的cluster工具中,sharding是最吸引人的.当我们需要把actor分布在不同的节点上时,Cluster sharding非常有用.我们可以使用actor的逻辑标识符与actor进行通信,而不用关心其物理位置.简单来说就是把actor的actorPath或actorRef进一步抽象,用一个字符串表示. sharding可以表示为DDD领域中的聚合根,此时actor叫做“实体”.这些actor一般都具有持久化的状态.每个实体actor只运行在某个节点,我们可以在不知道a…
在很多应用场景中都会出现在系统中需要某类Actor的唯一实例(only instance).这个实例在集群环境中可能在任何一个节点上,但保证它是唯一的.Akka的Cluster-Singleton提供对这种Singleton Actor模式的支持,能做到当这个实例所在节点出现问题需要脱离集群时自动在另一个节点上构建一个同样的Actor,并重新转交控制.当然,由于涉及了一个新构建的Actor,内部状态会在这个过程中丢失.Single-Actor的主要应用包括某种对外部只能支持一个接入的程序接口,或…
通过上篇关于Cluster-Singleton的介绍,我们了解了Akka为分布式程序提供的编程支持:基于消息驱动的运算模式特别适合分布式程序编程,我们不需要特别的努力,只需要按照普通的Actor编程方式就可以实现集群分布式程序了.Cluster-Singleton可以保证无论集群节点出了任何问题,只要集群中还有节点在线,都可以持续的安全运算.Cluster-Singleton这种模式保证了某种Actor的唯一实例可以安全稳定地在集群环境下运行.还有一种情况就是如果有许多特别占用资源的Actor需…
消息保证送达是指消息发送方保证在任何情况下都会至少一次确定的消息送达.AtleastOnceDelivery是一个独立的trait,主要作用是对不确定已送达的消息进行补发,这是一种自动的操作,无需用户干预.既然涉及到消息的补发,就不可避免地影响发送方和接收方之间消息传递的顺序.接收方重复收到相同的消息等问题,这些用户必须加以关注.从另一个方面,AtleastOnceDelivery模式保证了强韧性Actor系统的不丢失消息,这项要求可能是一些系统的核心要求. AtleastOnceDeliver…
前面我们讨论过FSM,一种专门为维护内部状态而设计的Actor,它的特点是一套特殊的DSL能很方便地进行状态转换.FSM的状态转换模式特别适合对应现实中的业务流程,因为它那套DSL可以更形象的描述业务功能.为了实现FSM的可用性,就必须为FSM再增加自我修复能力,PersistentFSM是FSM和PersistentActor的合并,是在状态机器模式的基础上再增加了状态转变事件的持久化,从而实现内部状态的自我修复功能的.在FSM结构基础上,PersistentFSM又增加了领域事件(domai…
akka-stream是多线程non-blocking模式的,一般来说,运算任务提交到另外线程后这个线程就会在当前程序控制之外自由运行了.任何时候如果需要终止运行中的数据流就必须采用一种任务柄(handler)方式来控制在其它线程内运行的任务.这个handler可以在提交运算任务时获取.akka-stream提供了KillSwitch trait来支持这项功能: /** * A [[KillSwitch]] allows completion of [[Graph]]s from the out…
在以前的博文中我们介绍了Slick,它是一种FRM(Functional Relation Mapper).有别于ORM,FRM的特点是函数式的语法可以支持灵活的对象组合(Query Composition)实现大规模的代码重复利用,但同时这些特点又影响了编程人员群体对FRM的接受程度,阻碍了FRM成为广为流行的一种数据库编程方式.所以我们只能从小众心态来探讨如何改善Slick现状,希望通过与某些Stream库集成,在Slick FRM的基础上恢复一些人们熟悉的Recordset数据库光标(cu…
本来初期打算用Hadoop 2,可是后来有限的服务器部署了Solr Cloud,各种站点,发现资源不够了,近10T的文件,已经几乎把服务器的磁盘全部用光.想来想去,由于目前架构基于Scala的,所以还是用Scala Akka实现了一个简单版本的分布式文件系统. Scala版本是2.10.3:http://www.scala-lang.org,Akka版本是2.2.3:http://akka.io. 所有文件随机放在不同的服务器上,在数据库中记录了文件存放的服务器IP地址.文件路径.在服务端部署基…
参考Akka Essentials   1 Introduction to Akka Actor Model Actor模式的由来 In 1973, Carl Hewitt, Peter Bishop, and Richard Steiger wrote a paper-A Universal Modular ACTOR Formalism for Artificial Intelligence, which introduced the concept of Actors. Subsequen…
一.介绍  当您需要在集群中的多个节点之间分配Actor,并希望能够使用其逻辑标识符与它们进行交互时,集群分片是非常有用的.你无需关心Actor在集群中的物理位置,因为这可能也会随着时间的推移而发生变化. 例如,它可以是代表域驱动设计术语中聚合根的参与者.在这里,我们称这些Actore为“实体”.这些Actor通常具有持久状态,但此功能不仅限于具有持久化状态的Actor. 当你有一个很消耗资源的Actor,例如占内存或者CPU,把它放在一台机器上可能吃不消,这时候集群分片就能够提供很好的帮助,将…
Akka Persistence Query是对akka持久化的一个补充,它提供了统一的.异步的流查询接口.今天我们就来研究下这个Persistence Query. 前面我们已经分析过Akka Persistence,它是用来持久化actor状态并在适当时机恢复actor的,简单来说它是用来写入的.那么Persistence Query与Persistence相对应,是用来读取数据的,一般用在读写分离的read side. Persistence Query主要的目标是设计一套松散的API,这…
使用过akka的应该都知道,默认情况下,消息是按照最多一次发送的,也就是tell函数会尽量把消息发送出去,如果发送失败,不会重发.但有些业务场景,消息的发送需要满足最少一次,也就是至少要成功发送一次.akka在Persistence的基础之上提供了at-least-once传递的语法. 简单来说akka中的at-least-once机制,会在规定时间内等待消息接收成功的确认消息.如果收到,则发送成功:否则,尝试重发:超过重试次数则不再重发. 其实如果不看akka的源码,让我们自己来实现至少一次的…
在学习akka过程中,我们了解了它的监督机制,会发现actor非常可靠,可以自动的恢复.但akka框架只会简单的创建新的actor,然后调用对应的生命周期函数,如果actor有状态需要回复,我们需要hook对应的生命周期函数,自己恢复状态.但此时恢复的只是初始状态,如果actor在接收消息过程中,状态发生了变化,为了保证可恢复就需要我们自行把状态保存在第三方组件了.考虑到通用性以及Actor模型的特点,akka提供了持久化机制,可以帮助我们做状态恢复. 其实,actor的状态千差万别,怎么来统一…
前言........ 这一篇文章主要是讲解Akka persistence的核心设计理念,也是CQRS(Command Query Responsibility Segregation)架构设计的典型应用,就让我们来看看为什么Akka persistence会采用CQRS架构设计. CQRS 很多时候我们在处理高并发的业务需求的时候,往往能把应用层的代码优化的很好,比如缓存,限流,均衡负载等,但是很难避免的一个问题就是数据的持久化,以致数据库的性能很可能就是系统性能的瓶颈,我前面的那篇文章也讲到…
前言.......... 我们在使用Akka时,会经常遇到一些存储Actor内部状态的场景,在系统正常运行的情况下,我们不需要担心什么,但是当系统出错,比如Actor错误需要重启,或者内存溢出,亦或者整个系统崩溃,如果我们不采取一定的方案的话,在系统重启时Actor的状态就会丢失,这会导致我们丢失一些关键的数据,造成系统数据不一致的问题.Akka作为一款成熟的生产环境应用,为我们提供了相应的解决方案就是Akka persistence. 为什么需要持久化的Actor? 万变不离其宗,数据的一致性…
Akka Java 中文文档 Introduction What is Akka? | 什么是Akka? Why Akka? | 为什么选择Akka? Getting Started | Akka入门 The Obligatory Hello World | Hello world Use-case and Deployment Scenarios | 用例与部署场景 Examples of use-cases for Akka | Akka的用例示例 General Terminology,…
在 Akka Persistence 中,数据都缓存在服务内存(状态),后端存储的都是一些持久化的事件日志,没法使用类似 SQL 一样的 DSL 来进行分页查询.利用 Akka Streams 和 Actor 我们可以通过编码的方式来实现分页查询的效果,而且这个分页查询还是分步式并行的…… EventSourcedBehavior Akka Persistence的EventSourcedBehavior里实现了CQRS模型,通过commandHandler与eventHandler解耦了命令处…
akka 2.6.x正式发布以来已经有好一段时间了.核心变化是typed-actor的正式启用,当然persistence,cluster等模块也有较大变化.一开始从名称估摸就是把传统any类型的消息改成强类型消息,所以想拖一段时间看看到底能对我们现有基于akka-classic的应用软件有什么深层次的影响.不过最近考虑的一些系统架构逼的我不得不立即开始akka-typed的调研,也就是说akka-classic已经无法或者很困难去实现新的系统架构,且听我道来:最近在考虑一个微服务中台.作为后台…
本文适合有 Java 基础知识的人群 作者:HelloGitHub-Salieri HelloGitHub 推出的<讲解开源项目>系列. Akka is a toolkit for building highly concurrent, distributed, and resilient message-driven applications for Java and Scala. 上面这段文字摘抄自 Akka 官网(akka.io),翻译成中文也就是:"Akka 是一个为 Jav…
Carl Hewitt 在1973年对Actor模型进行了如下定义:"Actor模型是一个把'Actor'作为并发计算的通用原语". Actor是异步驱动,可以并行和分布式部署及运行的最小颗粒.也就是说,它可以被分配,分布,调度到不同的CPU,不同的节点,乃至不同的时间片上运行,而不影响最终的结果.因此Actor在空间(分布式)和时间(异步驱动)上解耦的.而Akka是Lightbend(前身是Typesafe)公司在JVM上的Actor模型的实现.我们在了解actor模型之前,首先来了…