在之前的akka设计模式系列-消息模型中,我们介绍了akka的消息设计方案,但随着实践的深入,发现了一些问题,这里重新梳理一下设计方法,避免之前的错误.不当的观点给大家带来误解. 命令和事件 我们仍然把akka中的消息分为命令和事件两大类,但二者的具体含义和实现有一点变化.“命令,是指一个actor给另外一个actor发送指令做相关的业务逻辑:事件,则是actor对某个命令的响应结果,或者对其他事件的响应结果”.之前是这样定义的,但在具体的实践过程中发现了一些问题. 比如,命令如何归类?是根据命…
通过前面的文章我们总结了几个常见的actor设计模式,但此处不得不提前介绍一下在Akka中消息的设计模式.随着对Akka的使用,我们会发现,使用Akka设计系统其实就是面向消息编程.actor之间消息设计的是否合理,往往意味着Akka应用设计的是否合理.那么actor之间的消息该如何设计呢? 命令和事件 actor之间都是通过“消息”进行通信的,对各种各样的“消息”进行分析,我们可以把它简单的分为命令和事件两类.命令,是指一个actor给另外一个actor发送指令做相关的业务逻辑:事件,则是ac…
慎用ask应该是Akka设计的一个准则,很多时候我们应该禁用ask.之所以单独把ask拎出来作为一篇博文,主要是akka的初学者往往对ask的使用比较疑惑. "Using ask will send a message to the receiving Actor as with tell, and the receiving actor must reply with sender() ! reply in order to complete the returned Future with…
由于本人爱好Scala,顺便也就爱好Akka,但目前网上对Akka的介绍大多都是概念上或技术方向上的介绍,基本没有Akka设计模式或者Actor模型设计模式的资料.这对于Akka的普及非常不利,因为即使大家知道了Akka的基本功能和框架,也很难用它来正确的设计一个系统. 鉴于上述情况,我准备将使用Akka开发系统中总结的设计模式或者最佳实践分享出来,供大家参考. 考虑到读者对Akka的认知程度不同,这个博客系列大致会分几个部分:Actor模型.Akka基本概念.Akka基本组件介绍.Akka基本…
谈到Akka就必须介绍Actor并发模型,而谈到Actor就必须看一篇叫做<A Universal Modular Actor Formalism for Artificial Intelligence >的论文,它最早发表于1973年,提出了一种并发计算的理论模型,Actor就源于该模型. 在Actor模型中,actor是一个并发原语,简单的说,一个actor就是一个工人,与进程或线程一样都能够工作或处理任务.其实这还有点不好理解,我们可以把它想象成面向对象编程语言中的一个对象实例.在OOP…
While模式严格来说是while循环在Akka中的合理实现.while是开发过程中经常用到的语句之一,也是绝大部分编程语言都支持的语法.但while语句是一个循环,如果循环条件没有达到会一直执行while语句体的代码,且会阻塞while语句外的代码.如果在Akka中简单的使用while语句会极大的限制当前actor的功能. object GeneralWhile { def main(args: Array[String]): Unit = { var i=0 val maxLine = 10…
上一节我们介绍了Akka使用的基本模式,简单点来说就是,发消息给actor,处理结束后返回消息.但这种模式有个缺陷,就是一旦某个消息处理的比较慢,就会阻塞后面所有消息的处理.那么有没有方法规避这种阻塞呢,这就是本章要讲的Backend模式. 关于Backend模式,我们可以类比java中的线程池来理解,简单点来说就是把耗时或者阻塞的操作放到后台去执行.java中可能会将耗时的操作放到后台线程去执行,这样主线程不会阻塞.同样在Akka中我们也有类似的处理方式,只不过最简单的形式是用future来实…
actor锚定模式是指使用actorSelection对acor进行锚定的设计模式,也可以说是一个对actor的引用技巧.在某些情况下,我们可能需要能够根据Actor的path锚定对应的实例.简单来说就是,无论actor是因为异常导致的restart还是用户主动stop,然后再重新actorOf,只要actor的路径和name相同,我们都希望把消息发送给改Actor的一个实例.那我们来看一下actorSelection和ActorRef的使用区别. class AnchorActor exten…
链式调用在很多框架和系统中经常存在,算不得上是我自己总结的设计模式,此处只是简单介绍在Akka中的两种实现方式.我在这边博客中简化了链式调用的场景,简化后也更符合Akka的设计哲学. trait Chained{ def receive:Receive = Actor.emptyBehavior } trait IntReceiveChained1 extends Chained{ override def receive:Receive = super.receive orElse { cas…
本博客讨论一下akka在秒杀场景下的应用,提出自己的见解,只做抛砖引玉,大神勿喷.秒杀活动涉及到前中后台各个阶段,为了说明问题,我们简化场景,只研究akka在后台如何处理秒杀业务. 秒杀活动 所谓的秒杀活动,简单点来说,就是把某个稀缺商品或促销商品,挂到页面,供大量客户抢购.这里有两个关键点,商品数量不多,客户量非常大或抢购流量非常大.客户量或抢购流量往往意味着并发量非常大,容易给服务器造成很大的瞬时压力. 同样,为了简化问题,我们把秒杀活动中的概念也进行简化,分为库存和抢购请求.库存:待抢购商…