️ 引言 近两年,一直在折腾用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中较重要的改变是加入了EventSourcedBehavior.也就是说增加了一种专门负责EventSource模式的actor, 最终和其它种类的actor一道可以完美实现CQRS.新的actor,我还是把它称为persistentActor,还是一种能维护和维持运行状态的actor.即,actor内部状态可以存放在数据库里,然后通过一组功能函数来提供对状态的处理转变,即持续化处理persistence.当然作为一种具备EventSourcedBehavior的…
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 Persistence 中,数据都缓存在服务内存(状态),后端存储的都是一些持久化的事件日志,没法使用类似 SQL 一样的 DSL 来进行分页查询.利用 Akka Streams 和 Actor 我们可以通过编码的方式来实现分页查询的效果,而且这个分页查询还是分步式并行的…… EventSourcedBehavior Akka Persistence的EventSourcedBehavior里实现了CQRS模型,通过commandHandler与eventHandler解耦了命令处…
引言 朋友看罢我之前整理的<Akka Typed 官方文档之随手记>,一人用了诗歌<长城长>作为回赠,另一人则要求推出简化版本.于是抽空整理了几张思维导图,并且用了一些不太恰当的比喻,不知此番效果如何. Markdown语法默认不支持图片比例,所以请使用右键点击图片 -> 在新标签页中打开图片可看大图. Actor简话 一图说明Actor究竟是个什么东西,包括Actor的特点.结构.生命周期和一些必须遵守的重要原则,等等. 怎么和Actor谈恋爱 一图说明怎么和Actor打交…
引言 Lagom是出品Akka的Lightbend公司推出的一个微服务框架,目前最新版本为1.6.2.Lagom一词出自瑞典语,意为"适量". https://www.lagomframework.com/documentation/1.6.x/scala/Home.html Lagom框架坚持,微服务是按服务边界Boundary将系统切分为若干个组成部分的结果,这意味着要使它们与限界上下文Bounded Context.业务功能和模块隔离等要求保持一致,才能达到可伸缩性和弹性要求,从…
引言 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…
1.evanyou效果-彩带的实现,效果如下 注:这个主要用的是Canvas画布实现的,点击背景绘制新的图形,代码如下: /*Html代码:*/ <canvas id="></canvas> /*CSS代码:*/ <style type="text/css"> #evanyou{ position:fixed; width:%; height:%; left:; top:; } </style> /*JS代码:*/ // eva…
在本章 概述Akka 了解Actors和Actor系统 Akka的适用范围 在第一章中,会介绍给你Akk的个方面,它能做什么,与现有的解决方案有那些不同.重点关注Akka有哪些功能和使用范围和强大的并发功能,以及分布式应用.Akka的出现时一次革命:打破了传统的容器,然而这样的想法已经存在一段时间了,Actor System(如果你从没有听说过Actors,不用担心,我们会在正本书中讨论他).你将能学到Akk怎么简单的实现同步和并行的任务,它也提供了分布式的容错,这是一个让人兴奋的功能.最后我们…
在以前的博文中我们介绍了Slick,它是一种FRM(Functional Relation Mapper).有别于ORM,FRM的特点是函数式的语法可以支持灵活的对象组合(Query Composition)实现大规模的代码重复利用,但同时这些特点又影响了编程人员群体对FRM的接受程度,阻碍了FRM成为广为流行的一种数据库编程方式.所以我们只能从小众心态来探讨如何改善Slick现状,希望通过与某些Stream库集成,在Slick FRM的基础上恢复一些人们熟悉的Recordset数据库光标(cu…
akka-typed中已经没有PersistentActor了.取而代之的是带有EventSourcedBehavior的actor,也就是一种专门支持EventSource模式的actor.EventSource的原理和作用在之前的博客里已经有了比较详细的介绍,这里就不再重复了.本篇直接从EventsourcedBehavior actor的具体应用开始介绍.支持EventSource应用的基本数据类型包括 指令Command, 事件Event,状态State.EventSourcing其实就…
1.mailbox Akka的每个actor默认有一个mailbox,按照FIFO顺序单线程处理.在抛出异常导致父actor根据设置的监管策略执行重启或恢复操作时,会从触发异常的消息的后续消息开始处理,邮箱并不会被清空.如果你想重新处理那个触发异常的消息,可以通过重写preRestart方法来访问该消息,java 中的preRestart参数为(Throwable reason, Option<Object> message),message.get()可以获得该消息(因为是从Option对象…
Come From https://blogs.msdn.microsoft.com/rickandy/2011/01/28/dynamic-v-strongly-typed-views/ There are three ways to pass information from a controller to a view in ASP.NET MVC 3: As a strongly typed model object. As a dynamic type (using @model dy…
前言 在Spark集群 + Akka + Kafka + Scala 开发(1) : 配置开发环境中,我们已经部署好了一个Spark的开发环境. 在Spark集群 + Akka + Kafka + Scala 开发(2) : 开发一个Spark应用中,我们已经写好了一个Spark的应用. 本文的目标是写一个基于akka的scala工程,在一个spark standalone的集群环境中运行. akka是什么? akka的作用 akka的名字是action kernel的回文.根据官方定义:akk…
Quick Start Guide: Reactive Tweets 快速入门指南: Reactive Tweets (reactive tweets 大概可以理解为“响应式推文”,在此可以测试下GFW是否还在正常工作 Twitter) A typical use case for stream processing is consuming a live stream of data that we want to extract or aggregate some other data fr…
本章介绍 Netty介绍 为什么要使用non-blocking IO(NIO) 堵塞IO(blocking IO)和非堵塞IO(non-blocking IO)对照 Java NIO的问题和在Netty中的解决方式 Netty是基于Java NIO的网络应用框架,假设你是Java网络方面的新手,那么本章将是你学习Java网络应用的開始:对于有经验的开发人员来说,学习本章内容也是非常好的复习.假设你熟悉NIO和NIO2,你能够随时跳过本章直接从第二章開始学习.在你的机器上执行第二章编写的Netty…
在上篇讨论里我们提到了become/unbecome.由于它们本质上是堆栈操作,所以只能在较少的状态切换下才能保证堆栈操作的协调及维持程序的清晰逻辑.对于比较复杂的程序流程,Akka提供了FSM:一种通过状态变化进行功能切换的Actor.FSM模式的状态转变特别适合对应现实情况中的程序流程,我们可以用每一种状态来代表一个程序流程.FSM是个trait,定义如下: trait FSM[S, D] extends Actor with Listeners with ActorLogging {...…
Akka-Cluster可以在一部物理机或一组网络连接的服务器上搭建部署.用Akka开发同一版本的分布式程序可以在任何硬件环境中运行,这样我们就可以确定以Akka分布式程序作为标准的编程方式了. 在上面两篇讨论里我们介绍了Akka-Remoting.Akka-Remoting其实是一种ActorSystem之间Actor对Actor点对点的沟通协议.通过Akka-Remoting来实现一个ActorSystem中的一个Actor与另一个Actorsystem中的另一个Actor之间的沟通.在Re…
前面我们讨论过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…
从总体上看:akka-stream是由数据源头Source,流通节点Flow和数据流终点Sink三个框架性的流构件(stream components)组成的.这其中:Source和Sink是stream的两个独立端点,而Flow处于stream Source和Sink中间可能由多个通道式的节点组成,每个节点代表某些数据流元素转化处理功能,它们的链接顺序则可能代表整体作业的流程.一个完整的数据流(可运行数据流)必须是一个闭合的数据流,即:从外表上看,数据流两头必须连接一个Source和一个Sin…
当我们把Akka-http作为数据库数据交换工具时,数据是以Source[ROW,_]形式存放在Entity里的.很多时候除数据之外我们可能需要进行一些附加的信息传递如对数据的具体处理方式等.我们可以通过Akka-http的raw-header来实现附加自定义消息的传递,这项功能可以通过Akka-http提供的raw-header筛选功能来实现.在客户端我们把附加消息放在HttpRequest的raw header里,如下: import akka.http.scaladsl.model.hea…
  akka集群是高容错.去中心化.不存在单点故障以及不存在单点瓶颈的集群.它使用gossip协议通信以及具备故障自动检测功能. Gossip收敛   集群中每一个节点被其他节点监督(默认的最大数量为5).集群中的节点互相监督着,某节点所监督的状态也正在被其他监督着.通过gossip协议,节点向其他节点传递自己所见节点的最新状态(Up.Joining等等),同时节点也在接收来自其他节点的信息,这些信息包括哪些节点以及这些节点对应的状态,并这些节点加入到自己的seen表里去,表示自己已经看见了这些…
cluster sharding 的目的在于提供一个框架,方便实现 DDD,虽然我至今也没搞明白 DDD 到底适用于是什么场合,但是 cluster sharding 却是我目前在做的一个 project 扩展到集群上非常需要的工具. sharding 要做这么几件事 1. 对于每一个 entity,创建一个 actor.该 entity 有 Id 作为唯一标示.该 entity 的所有消息都由此 actor 来处理 2. 该 actor 在一段时间内不工作时,会超时并 kill self 3.…
当我们把Akka-http作为数据库数据交换工具时,数据是以Source[ROW,_]形式存放在Entity里的.很多时候除数据之外我们可能需要进行一些附加的信息传递如对数据的具体处理方式等.我们可以通过Akka-http的raw-header来实现附加自定义消息的传递,这项功能可以通过Akka-http提供的raw-header筛选功能来实现.在客户端我们把附加消息放在HttpRequest的raw header里,如下: import akka.http.scaladsl.model.hea…
实现效果,文字逐个输出. 实例代码: <script> $(function(){ $("#head-title").typed({ strings: ["为艺术家而生^1000", "为艺术家服务^1000" ,"为艺术家坚持与创新^1000","帝萃 艺术家^1000"], typeSpeed: 100, loop: true, startDelay: 100 }); }); </sc…
FunDA设计的主要目的是解决FRM(Functional Relation Mapping)如Slick这样的批次型操作工具库数据源行间游动操作的缺失问题.FRM产生的结果集就是一种静态集合,缺乏动态更新操作方式.FunDA提出的解决方案是把FRM产生的静态集合转变成动态流(stream),流内元素代表数据行(data row),一个完整的数据流代表一连串的数据行.用户可以利用数据流和FunDA提供的函数组件在数据流中游动进行数据更新操作.FunDA的数据流只支持单向游动(fda_next),…
本来初期打算用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地址.文件路径.在服务端部署基…