需要先了解一下Actor并发方案依赖的一个重要思想

前一篇文章里,我向大家介绍了Scala并发处理的第二块基石:Actor模型,它是Future-Promise模型的一种补充。你已经学习了如何定义和创建Actor,如何给它们发送消息以及Actor如何处理消息,比如它可能因为一条消息而修改它的内部状态或是异步地发送一个应答消息给发送方。 为了能激发你对Actor模型的兴趣,我们前面忽略了一些重要的概念,在你准备开发一个复杂的基于Actor的应用之前,你必须要先了解它们。 Actor模型意在帮助你提升系统的容错性,在这篇文章里,我们将了解到基于Actor的系统如何进行错误处理,这将完全不同于传统的分层的服务器架构。 错误处理与Akka里的一些核心概念密切相关,因此,本文会先对相关的理念和组件进行介绍。 Actor的层次结构 想要弄清Actor内部发生错误时会发生什么,需要先了解一下Actor并发方案依赖的一个重要思想,这个思想是Akka允许我们创建容错的并发应用的基础,它就是:Actor是按照一定的层次结构组织的。 什么意思呢?首先,每个Actor必定有一个父Actor(后文也会称之为父节点),同时它也可以创建自己的子Actor(后文也会称之为子节点)。你可以把Actor系统看作是一个由众多Actor组成的金字塔,父Actor会监管它的子Actor,就像现实生活里那样,当孩子还在蹒跚学步时父母要帮他们站稳脚跟,后面你会看到这是怎样进行的。 Guardian Actor 前一篇文章里,我只引入了两个Actor,一个Barista,一个Customer。我不会再重复它们的实现细节,但会聚焦在如何实例化他们: import akka.actor.ActorSystem val system = ActorSystem("Coffeehouse") val barista = system.actorOf(Props[Barista],"Barista") val customer = system.actorOf(Props(classOf[Customer],barista),"Customer") 1 2 3 4 1 2 3 4 如你所见,我们通过ActorSystem的actorOf方法创建了两个Actor实例,那这两个Actor的父Actor是谁呢?是这个Actor系统吗?不,但是很接近了。Actor系统自己本身并不是一个Actor,但它有一个所谓的“守护”Actor(Guardian Actor),它会作为所有由用户定义的顶层Actor的共同父Actor,比如这里我们通过actorOf方法创建的barista和customer. Guardian Actor不应该成为系统里所有Actor的直接父节点,我们应该让顶层的Actor创建子节点并委派任务给它们。 Actor路径 当我们查看Actor的路径时,Actor系统的层次结构会显得非常清晰。这些Actor的URL可以清晰地描述它们的位置。你可以通过调用ActorRef的path方法来获取一个Actor的路径。 barista.path // => akka.actor.ActorPath = akka://Coffeehouse/user/Barista customer.path // => akka.actor.ActorPath = akka://Coffeehouse/user/Customer 1 2 1 2 Actor的路径使用Akka定义的格式:开头是akka协议,然后是你的Actor系统的名称,再后面是Guardian Actor的名称(即user),再然后是通过actorOf方法创建Actor时给Actor起的名字。对于远程的Actor,因为它们运行在不同的机器上,你还需要在路径上指定主机地址和端口。 Actor路径可以用来查找Actor。比如,不同于给Customer的构造函数传递Barista的引用,一个Customer Actor可以通过一个相对路径从ActorContext的 actorSelection方法获取Barista的引用: context.actorSelection("../Barista") 1 1 通过路径查找一个Actor总是有用的,这比传递一个依赖给一个构造函数要好。 在Actor系统里,依赖越密集越容易出现问题,并且日后很难重构。 一个Actor层次机构的示例 为了说明父Actor如何监管子Actor以及如何保证系统容错性,我们再回到咖啡馆的例子,让我们给Barista一个子Actor以便分摊一些咖啡馆的运营工作给它。 如果我们真的要给咖啡师的工作进行建模,我们很有可能会设计更多的角色来进行更细的分工,但为了不至于失去焦点,我们必须尽可能地简化我们的例子。 假设咖啡师现在有了一个Register(收银机),它负责处理交易,打印收据以及合计销售额,下面是它的第一个版本: import akka.actor._ object Register { sealed trait Article case object Espresso extends Article case object Cappuccino extends Article case class Transaction(article: Article) } class Register extends Actor { import Register._ import Barista._ var revenue = 0 val prices = Map[Article,Int](Espresso -> 150,Cappuccino -> 250) def receive = { case Transaction(article) => val price = prices(article) sender ! createReceipt(price) revenue += price } def createReceipt(price: Int): Receipt = Receipt(price) } 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 它有一份价格清单,是一个Map,它还有一个整型变量代表销售额,无论什么时候,当它收到一条“交易”信息时,它会把咖啡售价累计到销售额里,同时打印的一张收据给消息的发送方,也就是顾客。 Register是Barista的子节点,这意味着我们不会通过Actor系统直接创建它,而是在Barista内部创建它,代码如下: object Barista { case object EspressoRequest case object ClosingTime case class EspressoCup(state: EspressoCup.State) object EspressoCup { sealed trait State case object Clean extends State case object Filled extends State case object Dirty extends State } case class Receipt(amount: Int) } class Barista extends Actor { import Barista._ import Register._ import EspressoCup._ import context.dispatcher import akka.util.Timeout import akka.pattern.ask import akka.pattern.pipe import concurrent.duration._ implicit val timeout = Timeout(4.seconds) val register = context.actorOf(Props[Register],"Register") def receive = { case EspressoRequest => val receipt = register ? Transaction(Espresso) receipt.map((EspressoCup(Filled),_)).pipeTo(sender) case ClosingTime => context.stop(self) } } 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 首先, 我们定义了Barista能够处理的消息类型。我们还引入了咖啡杯(EspressoCup),它只有三个有限的状态,因此它的State是sealed。 更为有趣的部分是Barista类的实现,导入dispatcher、ask和pipe以及声明隐式变量timeout这些工作都是必须的,因为在偏函数Reveive里,我们要用到Akka的ask机制:当咖啡师(Barista)接收到一份意式浓咖啡订单(EspressoRequest)时,它会生成一条交易(Transaction),发送给收银机,后者则会产生一个收据(Receipt),然后咖啡师把返回的收据和一杯制作好的咖啡一起交给顾客,顾客那里收到的就是(EspressoCup,Receipt)这样的一个Tuple。像这样委派任务给子节点然后再基于它们的返回结果进行聚合的工作方式在基于Actor的应用程序里是非常典型的。 还有,不要忘了我们不是用ActorSystem而是用ActorContext的actorOf方法创建的子Actor,只有这样做,被创建出来的Actor才是调用这个方法的Actor的子Actor,这和父节点是Guardian Actor的顶层Actor的创建方法是不同的。 最后,同样作为顶层的Actor,我们的Customer也是Guardian Actor的子节点,它是这样的: object Customer { case object CaffeineWithdrawalWarning } class Customer(coffeeSource: ActorRef) extends Actor with ActorLogging { import Customer._ import Barista._ import EspressoCup._ def receive = { case CaffeineWithdrawalWarning => coffeeSource ! EspressoRequest case (EspressoCup(Filled),Receipt(amount)) => log.info(s"yay,caffeine for ${self}!") } } 1 2 3 4 5 6 7 8 9 10 11 12 13 1 2 3 4 5 6 7 8 9 10 11 12 13 抛开Barista的Actor层次结构,让我们来看看第一次出现的ActorLogging特质,它给我们的程序添加了日志功能,不再只是向控制台打印消息了。现在,让我们用一个Barista和两个Customer来组建我们的Actor系统,它们在一起应该可以很好的工作了: import Customer._ val system = ActorSystem("Coffeehouse") val barista = system.actorOf(Props[Barista],"Barista") val customerJohnny = system.actorOf(Props(classOf[Customer],"Johnny") val customerAlina = system.actorOf(Props(classOf[Customer],"Alina") customerJohnny ! CaffeineWithdrawalWarning customerAlina ! CaffeineWithdrawalWarning 1 2 3 4 5 6 7 1 2 3 4 5 6 7 试试看,你会得到来自两位满意的顾客输出的日志信息。 崩溃了怎办? 当然,我们真正感兴趣的不是顾客是否满意,而是出了问题会怎样? 我们的收银机是一台脆弱的设备,它的打印功能并不怎么稳定,纸张经常会卡住而导致无法打印收据。我们在收银机的伴生对象里添加一个PaperJamException异常来代表我们所说的这个问题: class PaperJamException(msg: String) extends Exception(msg) 1 1 然后相应地改变一下Register的createReceipt方法: def createReceipt(price: Int): Receipt = { import util.Random if (Random.nextBoolean()) throw new PaperJamException("OMG,not again!") Receipt(price) } 1 2 3 4 5 6 1 2 3 4 5 6 现在,当处理交易的时候,收银机会有一半的概率会抛出PaperJamException异常。这对我们的Actor系统或应用程序有什么影响吗?幸运的是,Akka非常健壮,它不会受到抛出异常的任何影响,但是,出问题的节点会把这种异常行为通知给它的父节点。记住,父节点总是在监管它的子节点,此时就是需要父节点决定如何处理问题的时候了。 监管策略 处理子Actor异常的工作并不是由父Actor的Receive偏函数来负责的,因为那将扰乱父Actor自己的业务逻辑,这两部分职责要被清晰地隔离开。每个Actor会定义它自己的“监管策略”(supervisor strategy),这个策略告诉Akka当它的子Actor发生某些类型的错误时它打算如何应对。 有两种基本的监管策略:OneForOneStrategy和AllForOneStrategy,前者意味着你只会处理你子Actor中的错误,并只会影响到出错的那个子Actor,而后者会影响到所有的子Actor。哪种策略更好取决于你的应用程序面临的场景。 不管你为你的Actor选择何种SupervisorStrategy,你都要指定一个Decider,它也是一个偏函数:PartialFunction[Throwable,Directive],Decider允许你匹配Throwable的某些子类型,然后决定针对出问题的子Actor(或所有的子Actor,如果你选的是all-for-one策略的话)要采取什么应对措施。 指令 以下是Akka提供的一些在错误发生时可用的指令: sealed trait Directive case object Resume extends Directive case object Restart extends Directive case object Stop extends Directive case object Escalate extends Directive 1 2 3 4 5 1 2 3 4 5 Resume: 如果你选择Resume,意味着你认为你的子Actor并没有大问题,它的异常情况不会造成大的影响,你决定让子Actor恢复消息处理。 Restart: Restart指令会让Akka创建你的子Actor的新实例。这样做的原因是你假定子Actor或子子Actor的状态因某种方式崩溃之后无法再处理消息了。你希望通过重启Actor让它回到初始的状态。 Stop: 直接停止,不再重启。 Escalate: 如果你选择Escalate,可能是因为当前你不知道如何处理这个错误,你把如何处理错误的决策权交给了你的父Actor。如果Actor进行了escalate,那它自己应该也做好被父Actor重启的准备。 默认策略 你不需要为你的每一个Actor指定监管策略。实际上,我们也没这么做过,因为默认的监管策略总会生效。它看起来像这样: final val defaultStrategy: SupervisorStrategy = { def defaultDecider: Decider = { case _: ActorInitializationException ⇒ Stop case _: ActorKilledException ⇒ Stop case _: Exception ⇒ Restart } OneForOneStrategy()(defaultDecider) } 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 这意味着除了ActorInitializationException和ActorKilledException异常之外,出异常的子Actor将被重启。因此,当Register抛出了一个PaperJamException异常之后,它的父ActorBarista的监管策略会让Register重启,因为我们并不没有复盖过默认的监管策略。如果你这样试了,你会在日志里得到异常的stacktrace,但是没有关于Register重启的信息。让我们来验证一下Register是否真的重启了,要这样做,我们得先学习一下Actor的声明周期。 Actor的生命周期 为了理解监管策略的相关指令实际做了什么,我们需要知道一些Actor生命周期相关的知识。基本上可以归结为:通过actorOf创建时,Actor处于started状态,之后,如果出现什么问题,它还以被restart任意多次,最后,一个Actor会被stopped进而消亡。在Actor的生命周期上有多个回调方法可以来重写,但了解它们的默认实现也是很重要的。让我们追一过一下: preStart: 一个Actor在启动之后会回调该方法以便让你做一些初始化工作。默认实现是空的。 postStop: 在stop被调用之后会回调这个方法以便做一些资源释放工作,默认实现也是空的。 preRestart: 一个崩溃的Actor在重启之前会回调这个方法,它的默认实现是停止需所有的子Actor,然后调用postStop方法去释放资源。 postRestart: 一个Actor在重启完成之后会立即回调这个方法,它的默认实现是调用一下preStart。 让我们给Register的postRestart方法加些日志输出来看一下它是不是在失效之后真的重启了。为此,我们让Register继承ActorLogging特质,然后添加如下方法: override def postRestart(reason: Throwable) { super.postRestart(reason) log.info(s"Restarted because of ${reason.getMessage}") } 1 2 3 4 1 2 3 4 http://v.youku.com/v_show/id_XMTgyMjQyODM0MA==.html http://v.youku.com/v_show/id_XMTgyMjQyOTI0MA==.html http://v.youku.com/v_show/id_XMTgyMjQ3ODc4OA==.html http://v.youku.com/v_show/id_XMTgyMjQ4NzE1Mg==.html http://v.youku.com/v_show/id_XMTgyMjQ5MDMyMA==.html http://v.youku.com/v_show/id_XMTgyMjQ5MTQyMA==.html http://dianshiju.xkyn.com/shipin/youku-XMTgyMjQyODM0MA==.html http://dianshiju.xkyn.com/shipin/youku-XMTgyMjQyOTI0MA==.html http://dianshiju.xkyn.com/shipin/youku-XMTgyMjQ3ODc4OA==.html http://dianshiju.xkyn.com/shipin/youku-XMTgyMjQ4NzE1Mg==.html http://dianshiju.xkyn.com/shipin/youku-XMTgyMjQ5MDMyMA==.html http://dianshiju.xkyn.com/shipin/youku-XMTgyMjQ5MTQyMA==.html http://zuihao.xkyn.com/ms-XMTgyMjQyODM0MA==.html http://zuihao.xkyn.com/ms-XMTgyMjQyOTI0MA==.html http://zuihao.xkyn.com/ms-XMTgyMjQ3ODc4OA==.html http://zuihao.xkyn.com/ms-XMTgyMjQ4NzE1Mg==.html http://zuihao.xkyn.com/ms-XMTgyMjQ5MDMyMA==.html http://zuihao.xkyn.com/ms-XMTgyMjQ5MTQyMA==.html http://v.youku.com/v_show/id_XMTgyMjQyODM0MA==.html?from=y1.7-2 http://v.youku.com/v_show/id_XMTgyMjQyOTI0MA==.html?from=y1.7-2 http://v.youku.com/v_show/id_XMTgyMjQ3ODc4OA==.html?from=y1.7-2 http://v.youku.com/v_show/id_XMTgyMjQ4NzE1Mg==.html?from=y1.7-2 http://v.youku.com/v_show/id_XMTgyMjQ5MDMyMA==.html?from=y1.7-2 http://v.youku.com/v_show/id_XMTgyMjQ5MTQyMA==.html?from=y1.7-2 http://dianshiju.xkyn.com/shipin/youku-XMTgyMjQyODM0MA==.html?from=y1.7-2 http://dianshiju.xkyn.com/shipin/youku-XMTgyMjQyOTI0MA==.html?from=y1.7-2 http://dianshiju.xkyn.com/shipin/youku-XMTgyMjQ3ODc4OA==.html?from=y1.7-2 http://dianshiju.xkyn.com/shipin/youku-XMTgyMjQ4NzE1Mg==.html?from=y1.7-2 http://dianshiju.xkyn.com/shipin/youku-XMTgyMjQ5MDMyMA==.html?from=y1.7-2 http://dianshiju.xkyn.com/shipin/youku-XMTgyMjQ5MTQyMA==.html?from=y1.7-2 http://zuihao.xkyn.com/ms-XMTgyMjQyODM0MA==.html?from=y1.7-2 http://zuihao.xkyn.com/ms-XMTgyMjQyOTI0MA==.html?from=y1.7-2 http://zuihao.xkyn.com/ms-XMTgyMjQ3ODc4OA==.html?from=y1.7-2 http://zuihao.xkyn.com/ms-XMTgyMjQ4NzE1Mg==.html?from=y1.7-2 http://zuihao.xkyn.com/ms-XMTgyMjQ5MDMyMA==.html?from=y1.7-2 http://zuihao.xkyn.com/ms-XMTgyMjQ5MTQyMA==.html?from=y1.7-2 http://v.youku.com/v_show/id_XMTgyMjQyODM0MA==.html?from=s1.8-3-1.1 http://v.youku.com/v_show/id_XMTgyMjQyOTI0MA==.html?from=s1.8-3-1.1 http://v.youku.com/v_show/id_XMTgyMjQ3ODc4OA==.html?from=s1.8-3-1.1 http://v.youku.com/v_show/id_XMTgyMjQ4NzE1Mg==.html?from=s1.8-3-1.1 http://v.youku.com/v_show/id_XMTgyMjQ5MDMyMA==.html?from=s1.8-3-1.1 http://v.youku.com/v_show/id_XMTgyMjQ5MTQyMA==.html?from=s1.8-3-1.1 http://dianshiju.xkyn.com/shipin/youku-XMTgyMjQyODM0MA==.html?from=s1.8-3-1.1 http://dianshiju.xkyn.com/shipin/youku-XMTgyMjQyOTI0MA==.html?from=s1.8-3-1.1 http://dianshiju.xkyn.com/shipin/youku-XMTgyMjQ3ODc4OA==.html?from=s1.8-3-1.1 http://dianshiju.xkyn.com/shipin/youku-XMTgyMjQ4NzE1Mg==.html?from=s1.8-3-1.1 http://dianshiju.xkyn.com/shipin/youku-XMTgyMjQ5MDMyMA==.html?from=s1.8-3-1.1 http://dianshiju.xkyn.com/shipin/youku-XMTgyMjQ5MTQyMA==.html?from=s1.8-3-1.1 http://zuihao.xkyn.com/ms-XMTgyMjQyODM0MA==.html?from=s1.8-3-1.1 http://zuihao.xkyn.com/ms-XMTgyMjQyOTI0MA==.html?from=s1.8-3-1.1 http://zuihao.xkyn.com/ms-XMTgyMjQ3ODc4OA==.html?from=s1.8-3-1.1 http://zuihao.xkyn.com/ms-XMTgyMjQ4NzE1Mg==.html?from=s1.8-3-1.1 http://zuihao.xkyn.com/ms-XMTgyMjQ5MDMyMA==.html?from=s1.8-3-1.1 http://zuihao.xkyn.com/ms-XMTgyMjQ5MTQyMA==.html?from=s1.8-3-1.1 http://v.youku.com/v_show/id_XMTgyMjQyODM0MA==.html?from=y1.6-85.3.1.4d7066f48dc711e59e2a http://v.youku.com/v_show/id_XMTgyMjQyOTI0MA==.html?from=y1.6-85.3.1.4d7066f48dc711e59e2a http://v.youku.com/v_show/id_XMTgyMjQ3ODc4OA==.html?from=y1.6-85.3.1.4d7066f48dc711e59e2a http://v.youku.com/v_show/id_XMTgyMjQ4NzE1Mg==.html?from=y1.6-85.3.1.4d7066f48dc711e59e2a http://v.youku.com/v_show/id_XMTgyMjQ5MDMyMA==.html?from=y1.6-85.3.1.4d7066f48dc711e59e2a http://v.youku.com/v_show/id_XMTgyMjQ5MTQyMA==.html?from=y1.6-85.3.1.4d7066f48dc711e59e2a http://dianshiju.xkyn.com/shipin/youku-XMTgyMjQyODM0MA==.html?from=y1.6-85.3.1.4d7066f48dc711e59e2a http://dianshiju.xkyn.com/shipin/youku-XMTgyMjQyOTI0MA==.html?from=y1.6-85.3.1.4d7066f48dc711e59e2a http://dianshiju.xkyn.com/shipin/youku-XMTgyMjQ3ODc4OA==.html?from=y1.6-85.3.1.4d7066f48dc711e59e2a http://dianshiju.xkyn.com/shipin/youku-XMTgyMjQ4NzE1Mg==.html?from=y1.6-85.3.1.4d7066f48dc711e59e2a http://dianshiju.xkyn.com/shipin/youku-XMTgyMjQ5MDMyMA==.html?from=y1.6-85.3.1.4d7066f48dc711e59e2a http://dianshiju.xkyn.com/shipin/youku-XMTgyMjQ5MTQyMA==.html?from=y1.6-85.3.1.4d7066f48dc711e59e2a http://zuihao.xkyn.com/ms-XMTgyMjQyODM0MA==.html?from=y1.6-85.3.1.4d7066f48dc711e59e2a http://zuihao.xkyn.com/ms-XMTgyMjQyOTI0MA==.html?from=y1.6-85.3.1.4d7066f48dc711e59e2a http://zuihao.xkyn.com/ms-XMTgyMjQ3ODc4OA==.html?from=y1.6-85.3.1.4d7066f48dc711e59e2a http://zuihao.xkyn.com/ms-XMTgyMjQ4NzE1Mg==.html?from=y1.6-85.3.1.4d7066f48dc711e59e2a http://zuihao.xkyn.com/ms-XMTgyMjQ5MDMyMA==.html?from=y1.6-85.3.1.4d7066f48dc711e59e2a http://zuihao.xkyn.com/ms-XMTgyMjQ5MTQyMA==.html?from=y1.6-85.3.1.4d7066f48dc711e59e2a http://v.youku.com/v_show/id_XMTgyMjQyODM0MA==.html?from=s1.8-3-3.2 http://v.youku.com/v_show/id_XMTgyMjQyOTI0MA==.html?from=s1.8-3-3.2 http://v.youku.com/v_show/id_XMTgyMjQ3ODc4OA==.html?from=s1.8-3-3.2 http://v.youku.com/v_show/id_XMTgyMjQ4NzE1Mg==.html?from=s1.8-3-3.2 http://v.youku.com/v_show/id_XMTgyMjQ5MDMyMA==.html?from=s1.8-3-3.2 http://v.youku.com/v_show/id_XMTgyMjQ5MTQyMA==.html?from=s1.8-3-3.2 http://dianshiju.xkyn.com/shipin/youku-XMTgyMjQyODM0MA==.html?from=s1.8-3-3.2 http://dianshiju.xkyn.com/shipin/youku-XMTgyMjQyOTI0MA==.html?from=s1.8-3-3.2 http://dianshiju.xkyn.com/shipin/youku-XMTgyMjQ3ODc4OA==.html?from=s1.8-3-3.2 http://dianshiju.xkyn.com/shipin/youku-XMTgyMjQ4NzE1Mg==.html?from=s1.8-3-3.2 http://dianshiju.xkyn.com/shipin/youku-XMTgyMjQ5MDMyMA==.html?from=s1.8-3-3.2 http://dianshiju.xkyn.com/shipin/youku-XMTgyMjQ5MTQyMA==.html?from=s1.8-3-3.2 http://zuihao.xkyn.com/ms-XMTgyMjQyODM0MA==.html?from=s1.8-3-3.2 http://zuihao.xkyn.com/ms-XMTgyMjQyOTI0MA==.html?from=s1.8-3-3.2 http://zuihao.xkyn.com/ms-XMTgyMjQ3ODc4OA==.html?from=s1.8-3-3.2 http://zuihao.xkyn.com/ms-XMTgyMjQ4NzE1Mg==.html?from=s1.8-3-3.2 http://zuihao.xkyn.com/ms-XMTgyMjQ5MDMyMA==.html?from=s1.8-3-3.2 http://zuihao.xkyn.com/ms-XMTgyMjQ5MTQyMA==.html?from=s1.8-3-3.2 http://zuihao.xkyn.com/ms-XMTgxOTM4MDU0MA==.html http://zuihao.xkyn.com/ms-XMTgxOTM3ODUxNg==.html http://zuihao.xkyn.com/ms-XMTgxOTM3NzU2MA==.html http://zuihao.xkyn.com/ms-XMTgxOTM3NjM4OA==.html http://zuihao.xkyn.com/ms-XMTgxOTM3NzU2MA==.html http://zuihao.xkyn.com/ms-XMTgxOTM3NTE2OA==.html http://zuihao.xkyn.com/ms-XMTgxOTM3MTYyMA==.html http://zuihao.xkyn.com/ms-XMTgxOTM3ODUxNg==.html?from=y1.7-2 http://zuihao.xkyn.com/ms-XMTgxOTM3NzU2MA==.html?from=y1.7-2 http://zuihao.xkyn.com/ms-XMTgxOTM4MDU0MA==.html?from=y1.7-2 http://zuihao.xkyn.com/ms-XMTgxOTM3NjM4OA==.html?from=y1.7-2 http://zuihao.xkyn.com/ms-XMTgxOTM3MTYyMA==.html?from=y1.7-2 http://zuihao.xkyn.com/ms-XMTgxOTM3NTE2OA==.html?from=y1.7-2 http://zuihao.xkyn.com/ms-XMTgxOTM4MDU0MA==.html?from=s1.8-3-1.1 http://zuihao.xkyn.com/ms-XMTgxOTM3ODUxNg==.html?from=s1.8-3-1.1 http://zuihao.xkyn.com/ms-XMTgxOTM3NzU2MA==.html?from=s1.8-3-1.1 http://zuihao.xkyn.com/ms-XMTgxOTM3NjM4OA==.html?from=s1.8-3-1.1 http://zuihao.xkyn.com/ms-XMTgxOTM3NzU2MA==.html?from=s1.8-3-1.1 http://zuihao.xkyn.com/ms-XMTgxOTM3NTE2OA==.html?from=s1.8-3-1.1 http://zuihao.xkyn.com/ms-XMTgxOTM3MTYyMA==.html?from=s1.8-3-1.1 http://zuihao.xkyn.com/ms-XMTgxOTM4MDU0MA==.html?from=s1.8-1-1.2 http://zuihao.xkyn.com/ms-XMTgxOTM3ODUxNg==.html?from=s1.8-1-1.2 http://zuihao.xkyn.com/ms-XMTgxOTM3NzU2MA==.html?from=s1.8-1-1.2 http://zuihao.xkyn.com/ms-XMTgxOTM3NjM4OA==.html?from=s1.8-1-1.2 http://zuihao.xkyn.com/ms-XMTgxOTM3NzU2MA==.html?from=s1.8-1-1.2 http://zuihao.xkyn.com/ms-XMTgxOTM3NTE2OA==.html?from=s1.8-1-1.2 http://zuihao.xkyn.com/ms-XMTgxOTM3MTYyMA==.html?from=s1.8-1-1.2 http://zuihao.xkyn.com/ms-XMTgxOTM4MDU0MA==.html?from=y1.6-85.3.1.4d7066f48dc711e59e2a http://zuihao.xkyn.com/ms-XMTgxOTM3ODUxNg==.html?from=y1.6-85.3.1.4d7066f48dc711e59e2a http://zuihao.xkyn.com/ms-XMTgxOTM3NzU2MA==.html?from=y1.6-85.3.1.4d7066f48dc711e59e2a http://zuihao.xkyn.com/ms-XMTgxOTM3NjM4OA==.html?from=y1.6-85.3.1.4d7066f48dc711e59e2a http://zuihao.xkyn.com/ms-XMTgxOTM3NzU2MA==.html?from=y1.6-85.3.1.4d7066f48dc711e59e2a http://zuihao.xkyn.com/ms-XMTgxOTM3NTE2OA==.html?from=y1.6-85.3.1.4d7066f48dc711e59e2a http://zuihao.xkyn.com/ms-XMTgxOTM3MTYyMA==.html?from=y1.6-85.3.1.4d7066f48dc711e59e2a http://zuihao.xkyn.com/ms-XMTgxOTM4MDU0MA==.html?from=s1.8-3-3.2 http://zuihao.xkyn.com/ms-XMTgxOTM3ODUxNg==.html?from=s1.8-3-3.2 http://zuihao.xkyn.com/ms-XMTgxOTM3NzU2MA==.html?from=s1.8-3-3.2 http://zuihao.xkyn.com/ms-XMTgxOTM3NjM4OA==.html?from=s1.8-3-3.2 http://zuihao.xkyn.com/ms-XMTgxOTM3NzU2MA==.html?from=s1.8-3-3.2 http://zuihao.xkyn.com/ms-XMTgxOTM3NTE2OA==.html?from=s1.8-3-3.2 http://zuihao.xkyn.com/ms-XMTgxOTM3MTYyMA==.html?from=s1.8-3-3.2 http://zuihao.xkyn.com/ms-XMTgxOTM4MDU0MA==.html?20161115=s1.8-3-1.1 http://zuihao.xkyn.com/ms-XMTgxOTM3ODUxNg==.html?20161115=s1.8-3-1.1 http://zuihao.xkyn.com/ms-XMTgxOTM3NzU2MA==.html?20161115=s1.8-3-1.1 http://zuihao.xkyn.com/ms-XMTgxOTM3NjM4OA==.html?20161115=s1.8-3-1.1 http://zuihao.xkyn.com/ms-XMTgxOTM3NzU2MA==.html?20161115=s1.8-3-1.1 http://zuihao.xkyn.com/ms-XMTgxOTM3NTE2OA==.html?20161115=s1.8-3-1.1 http://zuihao.xkyn.com/ms-XMTgxOTM3MTYyMA==.html?20161115=s1.8-3-1.1 http://zuihao.xkyn.com/ms-XMTgxOTM3ODUxNg==.html?20161115=from=y1.7-2 http://zuihao.xkyn.com/ms-XMTgxOTM3NzU2MA==.html?20161115=from=y1.7-2 http://zuihao.xkyn.com/ms-XMTgxOTM4MDU0MA==.html?20161115=from=y1.7-2 http://zuihao.xkyn.com/ms-XMTgxOTM3NjM4OA==.html?20161115=from=y1.7-2 http://zuihao.xkyn.com/ms-XMTgxOTM3MTYyMA==.html?20161115=from=y1.7-2 http://zuihao.xkyn.com/ms-XMTgxOTM3NTE2OA==.html?20161115=from=y1.7-2 http://zuihao.xkyn.com/ms-XMTgxOTM4MDU0MA==.html?20161115=from=s1.8-3-1.1 http://zuihao.xkyn.com/ms-XMTgxOTM3ODUxNg==.html?20161115=from=s1.8-3-1.1 http://zuihao.xkyn.com/ms-XMTgxOTM3NzU2MA==.html?20161115=from=s1.8-3-1.1 http://zuihao.xkyn.com/ms-XMTgxOTM3NjM4OA==.html?20161115=from=s1.8-3-1.1 http://zuihao.xkyn.com/ms-XMTgxOTM3NzU2MA==.html?20161115=from=s1.8-3-1.1 http://zuihao.xkyn.com/ms-XMTgxOTM3NTE2OA==.html?20161115=from=s1.8-3-1.1 http://zuihao.xkyn.com/ms-XMTgxOTM3MTYyMA==.html?20161115=from=s1.8-3-1.1 http://zuihao.xkyn.com/ms-XMTgxOTM4MDU0MA==.html?20161115=from=s1.8-1-1.2 http://zuihao.xkyn.com/ms-XMTgxOTM3ODUxNg==.html?20161115=from=s1.8-1-1.2 http://zuihao.xkyn.com/ms-XMTgxOTM3NzU2MA==.html?20161115=from=s1.8-1-1.2 http://zuihao.xkyn.com/ms-XMTgxOTM3NjM4OA==.html?20161115=from=s1.8-1-1.2 http://zuihao.xkyn.com/ms-XMTgxOTM3NzU2MA==.html?20161115=from=s1.8-1-1.2 http://zuihao.xkyn.com/ms-XMTgxOTM3NTE2OA==.html?20161115=from=s1.8-1-1.2 http://zuihao.xkyn.com/ms-XMTgxOTM3MTYyMA==.html?20161115=from=s1.8-1-1.2 http://zuihao.xkyn.com/ms-XMTgxOTM4MDU0MA==.html?20161115=from=y1.6-85.3.1.4d7066f48dc711e59e2a http://zuihao.xkyn.com/ms-XMTgxOTM3ODUxNg==.html?20161115=from=y1.6-85.3.1.4d7066f48dc711e59e2a http://zuihao.xkyn.com/ms-XMTgxOTM3NzU2MA==.html?20161115=from=y1.6-85.3.1.4d7066f48dc711e59e2a http://zuihao.xkyn.com/ms-XMTgxOTM3NjM4OA==.html?20161115=from=y1.6-85.3.1.4d7066f48dc711e59e2a http://zuihao.xkyn.com/ms-XMTgxOTM3NzU2MA==.html?20161115=from=y1.6-85.3.1.4d7066f48dc711e59e2a http://zuihao.xkyn.com/ms-XMTgxOTM3NTE2OA==.html?20161115=from=y1.6-85.3.1.4d7066f48dc711e59e2a http://zuihao.xkyn.com/ms-XMTgxOTM3MTYyMA==.html?20161115=from=y1.6-85.3.1.4d7066f48dc711e59e2a http://zuihao.xkyn.com/ms-XMTgxOTM4MDU0MA==.html?20161115=from=s1.8-3-3.2 http://zuihao.xkyn.com/ms-XMTgxOTM3ODUxNg==.html?20161115=from=s1.8-3-3.2 http://zuihao.xkyn.com/ms-XMTgxOTM3NzU2MA==.html?20161115=from=s1.8-3-3.2 http://zuihao.xkyn.com/ms-XMTgxOTM3NjM4OA==.html?20161115=from=s1.8-3-3.2 http://zuihao.xkyn.com/ms-XMTgxOTM3NzU2MA==.html?20161115=from=s1.8-3-3.2 http://zuihao.xkyn.com/ms-XMTgxOTM3NTE2OA==.html?20161115=from=s1.8-3-3.2 http://zuihao.xkyn.com/ms-XMTgxOTM3MTYyMA==.html?20161115=from=s1.8-3-3.2 http://dianshiju.xkyn.com/shipin/youku-XMTgxOTM4MDU0MA==.html http://dianshiju.xkyn.com/shipin/youku-XMTgxOTM3ODUxNg==.html http://dianshiju.xkyn.com/shipin/youku-XMTgxOTM3NzU2MA==.html http://dianshiju.xkyn.com/shipin/youku-XMTgxOTM3NjM4OA==.html http://dianshiju.xkyn.com/shipin/youku-XMTgxOTM3NzU2MA==.html http://dianshiju.xkyn.com/shipin/youku-XMTgxOTM3NTE2OA==.html http://dianshiju.xkyn.com/shipin/youku-XMTgxOTM3MTYyMA==.html http://dianshiju.xkyn.com/shipin/youku-XMTgxOTM3ODUxNg==.html?from=y1.7-2 http://dianshiju.xkyn.com/shipin/youku-XMTgxOTM3NzU2MA==.html?from=y1.7-2 http://dianshiju.xkyn.com/shipin/youku-XMTgxOTM4MDU0MA==.html?from=y1.7-2 http://dianshiju.xkyn.com/shipin/youku-XMTgxOTM3NjM4OA==.html?from=y1.7-2 http://dianshiju.xkyn.com/shipin/youku-XMTgxOTM3MTYyMA==.html?from=y1.7-2 http://dianshiju.xkyn.com/shipin/youku-XMTgxOTM3NTE2OA==.html?from=y1.7-2 http://dianshiju.xkyn.com/shipin/youku-XMTgxOTM4MDU0MA==.html?from=s1.8-3-1.1 http://dianshiju.xkyn.com/shipin/youku-XMTgxOTM3ODUxNg==.html?from=s1.8-3-1.1 http://dianshiju.xkyn.com/shipin/youku-XMTgxOTM3NzU2MA==.html?from=s1.8-3-1.1 http://dianshiju.xkyn.com/shipin/youku-XMTgxOTM3NjM4OA==.html?from=s1.8-3-1.1 http://dianshiju.xkyn.com/shipin/youku-XMTgxOTM3NzU2MA==.html?from=s1.8-3-1.1 http://dianshiju.xkyn.com/shipin/youku-XMTgxOTM3NTE2OA==.html?from=s1.8-3-1.1 http://dianshiju.xkyn.com/shipin/youku-XMTgxOTM3MTYyMA==.html?from=s1.8-3-1.1 http://dianshiju.xkyn.com/shipin/youku-XMTgxOTM4MDU0MA==.html?from=s1.8-1-1.2 http://dianshiju.xkyn.com/shipin/youku-XMTgxOTM3ODUxNg==.html?from=s1.8-1-1.2 http://dianshiju.xkyn.com/shipin/youku-XMTgxOTM3NzU2MA==.html?from=s1.8-1-1.2 http://dianshiju.xkyn.com/shipin/youku-XMTgxOTM3NjM4OA==.html?from=s1.8-1-1.2 http://dianshiju.xkyn.com/shipin/youku-XMTgxOTM3NzU2MA==.html?from=s1.8-1-1.2 http://dianshiju.xkyn.com/shipin/youku-XMTgxOTM3NTE2OA==.html?from=s1.8-1-1.2 http://dianshiju.xkyn.com/shipin/youku-XMTgxOTM3MTYyMA==.html?from=s1.8-1-1.2 http://dianshiju.xkyn.com/shipin/youku-XMTgxOTM4MDU0MA==.html?from=y1.6-85.3.1.4d7066f48dc711e59e2a http://dianshiju.xkyn.com/shipin/youku-XMTgxOTM3ODUxNg==.html?from=y1.6-85.3.1.4d7066f48dc711e59e2a http://dianshiju.xkyn.com/shipin/youku-XMTgxOTM3NzU2MA==.html?from=y1.6-85.3.1.4d7066f48dc711e59e2a http://dianshiju.xkyn.com/shipin/youku-XMTgxOTM3NjM4OA==.html?from=y1.6-85.3.1.4d7066f48dc711e59e2a http://dianshiju.xkyn.com/shipin/youku-XMTgxOTM3NzU2MA==.html?from=y1.6-85.3.1.4d7066f48dc711e59e2a http://dianshiju.xkyn.com/shipin/youku-XMTgxOTM3NTE2OA==.html?from=y1.6-85.3.1.4d7066f48dc711e59e2a http://dianshiju.xkyn.com/shipin/youku-XMTgxOTM3MTYyMA==.html?from=y1.6-85.3.1.4d7066f48dc711e59e2a http://dianshiju.xkyn.com/shipin/youku-XMTgxOTM4MDU0MA==.html?from=s1.8-3-3.2 http://dianshiju.xkyn.com/shipin/youku-XMTgxOTM3ODUxNg==.html?from=s1.8-3-3.2 http://dianshiju.xkyn.com/shipin/youku-XMTgxOTM3NzU2MA==.html?from=s1.8-3-3.2 http://dianshiju.xkyn.com/shipin/youku-XMTgxOTM3NjM4OA==.html?from=s1.8-3-3.2 http://dianshiju.xkyn.com/shipin/youku-XMTgxOTM3NzU2MA==.html?from=s1.8-3-3.2 http://dianshiju.xkyn.com/shipin/youku-XMTgxOTM3NTE2OA==.html?from=s1.8-3-3.2 http://dianshiju.xkyn.com/shipin/youku-XMTgxOTM3MTYyMA==.html?from=s1.8-3-3.2 http://dianshiju.xkyn.com/shipin/youku-XMTgxOTM4MDU0MA==.html?20161115=s1.8-3-1.1 http://dianshiju.xkyn.com/shipin/youku-XMTgxOTM3ODUxNg==.html?20161115=s1.8-3-1.1 http://dianshiju.xkyn.com/shipin/youku-XMTgxOTM3NzU2MA==.html?20161115=s1.8-3-1.1 http://dianshiju.xkyn.com/shipin/youku-XMTgxOTM3NjM4OA==.html?20161115=s1.8-3-1.1 http://dianshiju.xkyn.com/shipin/youku-XMTgxOTM3NzU2MA==.html?20161115=s1.8-3-1.1 http://dianshiju.xkyn.com/shipin/youku-XMTgxOTM3NTE2OA==.html?20161115=s1.8-3-1.1 http://dianshiju.xkyn.com/shipin/youku-XMTgxOTM3MTYyMA==.html?20161115=s1.8-3-1.1 http://dianshiju.xkyn.com/shipin/youku-XMTgxOTM3ODUxNg==.html?20161115=from=y1.7-2 http://dianshiju.xkyn.com/shipin/youku-XMTgxOTM3NzU2MA==.html?20161115=from=y1.7-2 http://dianshiju.xkyn.com/shipin/youku-XMTgxOTM4MDU0MA==.html?20161115=from=y1.7-2 http://dianshiju.xkyn.com/shipin/youku-XMTgxOTM3NjM4OA==.html?20161115=from=y1.7-2 http://dianshiju.xkyn.com/shipin/youku-XMTgxOTM3MTYyMA==.html?20161115=from=y1.7-2 http://dianshiju.xkyn.com/shipin/youku-XMTgxOTM3NTE2OA==.html?20161115=from=y1.7-2 http://dianshiju.xkyn.com/shipin/youku-XMTgxOTM4MDU0MA==.html?20161115=from=s1.8-3-1.1 http://dianshiju.xkyn.com/shipin/youku-XMTgxOTM3ODUxNg==.html?20161115=from=s1.8-3-1.1 http://dianshiju.xkyn.com/shipin/youku-XMTgxOTM3NzU2MA==.html?20161115=from=s1.8-3-1.1 http://dianshiju.xkyn.com/shipin/youku-XMTgxOTM3NjM4OA==.html?20161115=from=s1.8-3-1.1 http://dianshiju.xkyn.com/shipin/youku-XMTgxOTM3NzU2MA==.html?20161115=from=s1.8-3-1.1 http://dianshiju.xkyn.com/shipin/youku-XMTgxOTM3NTE2OA==.html?20161115=from=s1.8-3-1.1 http://dianshiju.xkyn.com/shipin/youku-XMTgxOTM3MTYyMA==.html?20161115=from=s1.8-3-1.1 http://dianshiju.xkyn.com/shipin/youku-XMTgxOTM4MDU0MA==.html?20161115=from=s1.8-1-1.2 http://dianshiju.xkyn.com/shipin/youku-XMTgxOTM3ODUxNg==.html?20161115=from=s1.8-1-1.2 http://dianshiju.xkyn.com/shipin/youku-XMTgxOTM3NzU2MA==.html?20161115=from=s1.8-1-1.2 http://dianshiju.xkyn.com/shipin/youku-XMTgxOTM3NjM4OA==.html?20161115=from=s1.8-1-1.2 http://dianshiju.xkyn.com/shipin/youku-XMTgxOTM3NzU2MA==.html?20161115=from=s1.8-1-1.2 http://dianshiju.xkyn.com/shipin/youku-XMTgxOTM3NTE2OA==.html?20161115=from=s1.8-1-1.2 http://dianshiju.xkyn.com/shipin/youku-XMTgxOTM3MTYyMA==.html?20161115=from=s1.8-1-1.2 http://dianshiju.xkyn.com/shipin/youku-XMTgxOTM4MDU0MA==.html?20161115=from=y1.6-85.3.1.4d7066f48dc711e59e2a http://dianshiju.xkyn.com/shipin/youku-XMTgxOTM3ODUxNg==.html?20161115=from=y1.6-85.3.1.4d7066f48dc711e59e2a http://dianshiju.xkyn.com/shipin/youku-XMTgxOTM3NzU2MA==.html?20161115=from=y1.6-85.3.1.4d7066f48dc711e59e2a http://dianshiju.xkyn.com/shipin/youku-XMTgxOTM3NjM4OA==.html?20161115=from=y1.6-85.3.1.4d7066f48dc711e59e2a http://dianshiju.xkyn.com/shipin/youku-XMTgxOTM3NzU2MA==.html?20161115=from=y1.6-85.3.1.4d7066f48dc711e59e2a http://dianshiju.xkyn.com/shipin/youku-XMTgxOTM3NTE2OA==.html?20161115=from=y1.6-85.3.1.4d7066f48dc711e59e2a http://dianshiju.xkyn.com/shipin/youku-XMTgxOTM3MTYyMA==.html?20161115=from=y1.6-85.3.1.4d7066f48dc711e59e2a http://dianshiju.xkyn.com/shipin/youku-XMTgxOTM4MDU0MA==.html?20161115=from=s1.8-3-3.2 http://dianshiju.xkyn.com/shipin/youku-XMTgxOTM3ODUxNg==.html?20161115=from=s1.8-3-3.2 http://dianshiju.xkyn.com/shipin/youku-XMTgxOTM3NzU2MA==.html?20161115=from=s1.8-3-3.2 http://dianshiju.xkyn.com/shipin/youku-XMTgxOTM3NjM4OA==.html?20161115=from=s1.8-3-3.2 http://dianshiju.xkyn.com/shipin/youku-XMTgxOTM3NzU2MA==.html?20161115=from=s1.8-3-3.2 http://dianshiju.xkyn.com/shipin/youku-XMTgxOTM3NTE2OA==.html?20161115=from=s1.8-3-3.2 http://dianshiju.xkyn.com/shipin/youku-XMTgxOTM3MTYyMA==.html?20161115=from=s1.8-3-3.2 现在,如果你给这两个Customer发送一堆CaffeineWithdrawalWarning消息,你会看到一个或者另一个的日志里会证实我们的Register确实重启过了。 Actor的消亡 有时候反复重启一个Actor是没有意义的,比如:一个Actor要通过网络和其他服务进行通信,而服务可能在一段时间内暂时不可用。在这种情况下,一个好的解决方法是告诉Akka应该在多长时间内重启Actor,如果超出了限定的时间,就停止这个Actor进而导致了Actor的消亡。这个限制时间可以在监控策略的构造函数里配置:

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


什么是设计模式一套被反复使用、多数人知晓的、经过分类编目的、代码 设计经验 的总结;使用设计模式是为了 可重用 代码、让代码 更容易 被他人理解、保证代码 可靠性;设计模式使代码编制  真正工程化;设计模式使软件工程的 基石脉络, 如同大厦的结构一样;并不直接用来完成代码的编写,而是 描述 在各种不同情况下,要怎么解决问题的一种方案;能使不稳定依赖于相对稳定、具体依赖于相对抽象,避免引
单一职责原则定义(Single Responsibility Principle,SRP)一个对象应该只包含 单一的职责,并且该职责被完整地封装在一个类中。Every  Object should have  a single responsibility, and that responsibility should be entirely encapsulated by t
动态代理和CGLib代理分不清吗,看看这篇文章,写的非常好,强烈推荐。原文截图*************************************************************************************************************************原文文本************
适配器模式将一个类的接口转换成客户期望的另一个接口,使得原本接口不兼容的类可以相互合作。
策略模式定义了一系列算法族,并封装在类中,它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。
设计模式讲的是如何编写可扩展、可维护、可读的高质量代码,它是针对软件开发中经常遇到的一些设计问题,总结出来的一套通用的解决方案。
模板方法模式在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中,使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。
迭代器模式提供了一种方法,用于遍历集合对象中的元素,而又不暴露其内部的细节。
外观模式又叫门面模式,它提供了一个统一的(高层)接口,用来访问子系统中的一群接口,使得子系统更容易使用。
单例模式(Singleton Design Pattern)保证一个类只能有一个实例,并提供一个全局访问点。
组合模式可以将对象组合成树形结构来表示“整体-部分”的层次结构,使得客户可以用一致的方式处理个别对象和对象组合。
装饰者模式能够更灵活的,动态的给对象添加其它功能,而不需要修改任何现有的底层代码。
观察者模式(Observer Design Pattern)定义了对象之间的一对多依赖,当对象状态改变的时候,所有依赖者都会自动收到通知。
代理模式为对象提供一个代理,来控制对该对象的访问。代理模式在不改变原始类代码的情况下,通过引入代理类来给原始类附加功能。
工厂模式(Factory Design Pattern)可细分为三种,分别是简单工厂,工厂方法和抽象工厂,它们都是为了更好的创建对象。
状态模式允许对象在内部状态改变时,改变它的行为,对象看起来好像改变了它的类。
命令模式将请求封装为对象,能够支持请求的排队执行、记录日志、撤销等功能。
备忘录模式(Memento Pattern)保存一个对象的某个状态,以便在适当的时候恢复对象。备忘录模式属于行为型模式。 基本介绍 **意图:**在不破坏封装性的前提下,捕获一个对象的内部状态,并在该
顾名思义,责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。这种类型的设计模式属于行为
享元模式(Flyweight Pattern)(轻量级)(共享元素)主要用于减少创建对象的数量,以减少内存占用和提高性能。这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结