当前位置: 首页 > news >正文

廉江网站开发公司wordpress用户集成

廉江网站开发公司,wordpress用户集成,做羞羞的事的网站,软件编程基础知识actor模型是用于容错和高度可扩展系统的设计模式。 角色是独立的工作程序模块#xff0c;仅通过消息传递与其他角色进行通信#xff0c;可以与其他角色隔离而失败#xff0c;但是可以监视其他角色的故障并在发生这种情况时采取一些恢复措施。 参与者是简单#xff0c;孤立但… actor模型是用于容错和高度可扩展系统的设计模式。 角色是独立的工作程序模块仅通过消息传递与其他角色进行通信可以与其他角色隔离而失败但是可以监视其他角色的故障并在发生这种情况时采取一些恢复措施。 参与者是简单孤立但又协调的并发工作者。 基于演员的设计带来许多好处 自适应行为 仅通过消息队列进行交互会使参与者松散耦合并允许他们 隔离故障 邮箱将消息队列解耦 使参与者可以在不中断服务的情况下重新启动。 最大并发容量 Actor在内存消耗和管理开销方面都非常轻巧 因此可以在一个盒子中生成甚至数百万个。 低复杂度 每个参与者都可以通过更改其私有状态来实现有状态行为而不必担心并发修改。 凭借Erlang 演员模型得到了广泛认可并成功实现了关键生产系统中的目标。 这是针对JVM的两个参与者库的比较回顾我们自己的Quasar和Typesafe的Akka 。 类星体 Quasar是一个用于简单轻量级JVM并发的开源库该库在JVM上实现了真正的轻量级线程AKA光纤。 Quasar光纤的行为与普通Java线程一样除了它们几乎没有内存和任务切换开销之外因此您可以在单个JVM中轻松产生数十万甚至上百万的光纤。 Quasar还提供了以Go语言提供的模式为模型的光纤间通信通道并带有通道选择器。 它还包含actor模型的完整实现该模型以Erlang为蓝本。 尽管本文主要涉及Quasar在Actor模型的实现上建立的该模型建立在Quasar光纤之上但请记住您可以在没有actor的情况下使用Quasar。 类星体演员实现了上面概述的完整的演员范式其中一些适用于Java 7Java 8 Clojure和Kotlin 。 Quasar当前不支持Scala。 由于Quasar光纤的工作原理与线程非常相似因此可以轻松地集成现有库因此可以在不更改代码或进行最少代码更改的情况下使用当前工具和库同时充分利用轻量级线程的效率。 这样可以保留现有代码并避免API锁定。 Comsat项目利用Quasar的集成框架以最少的代码为光纤提供了几个流行的标准API的端口移植它还引入了Web Actors 这是一个基于actor的新的HTTPWebSocket和SSE的基于Web的API。 Quasar光纤是通过创建和安排连续任务来实现的并且由于JVM还不支持本机连续因此Quasar通过选择性字节码检测来实现它们当前可以阻塞光纤的方法需要通过注释进行显式标记以便Quasar可以插入继续悬挂和恢复挂钩。 但是可以使用实验性的自动Clojure工具并且自动工具也将扩展到其他JVM语言。 可以作为附加的构建步骤或在运行时执行检测通过JVM代理或大多数常见Servlet容器的类加载器。 阿卡 Akka是用Scala编写的actor框架除了Scala之外它还支持Java 7Java 8从2.3.10开始的实验。 它提供基于异步基于回调的Actor DSL而不是基于Erlang的基于光纤的Actor系统。 Akka不提供轻量级线程而是依靠JVM线程来调度参与者。 Akka不是一个库而是一个提供全方位服务的框架涵盖了从配置和部署到测试的所有内容。 无阻塞 Akka和Quasar actor之间的主要区别是Akka使用了异步的非阻塞API而Quasar –例如ErlangGoClojure的core.async –使用了阻塞API在Akka中actor 实现了receive方法即当actor收到消息时触发的回调而在Quasar中actor 调用 receive方法该方法一直阻塞直到收到消息为止。 从理论上讲异步和直接或阻塞样式是双重的和等效的因为它们可以相互转换 但是在实践中实现的细节对性能和可伸缩性以及选择哪种样式有很大影响。编程语言可以使一种方法比另一种方法容易。 选择基于回调的异步方法的原因是阻塞普通的OS线程会带来大量开销就像许多线程的存在一样而使用非阻塞API可以避免这种情况。 但是由于Quasar与Erlang和Go一样具有真正的轻量级线程因此阻塞几乎没有开销。 在语言方面虽然Scala为monad提供了语法支持这使处理异步代码变得更加简单但是在对monad没有良好语法支持的语言例如Java中阻塞方法要简单得多。 阻塞代码的优点不仅在于更简单更具可读性和可维护性的 Java代码还在于更加熟悉和兼容的代码可以集成其他标准Java API。 API比较 Quasar Java API支持Java 7和8。Clojure支持是Pulsar的一部分 Pulsar是Quasar周围的一个很薄的包装层非常习惯并且提供了与Erlang相似的actor API。 Kotlin支持是最新添加的功能。 Kotlin是一种非常有前途的针对JVM和JavaScript的静态类型混合编程语言由领先的供应商JetBrains的开发工具设计和构建使其高效且可集成。 尽管Kotlin使使用现有Java API的效果比Java本身更有效更安全更轻松更愉快。 Quasar还提供了一个集成工具箱该工具箱可以添加对其他JVM语言的支持。 Akka在设计时主要考虑了Scala但一段时间以来它一直在提供附加的Java API。 以下是Quasar和Akka Java API之间的比较。 尽管还不够详尽但它涵盖了关键的差异。 这是一个简短的摘要 演员定义 Quasar Kotlin和Java参与者实现了doRun方法或Clojure中的函数就像在Erlang中一样该方法可以使用任意语言控制流构造并且只要开发人员认为合适就可以阻塞操作。 通常它将至少使用receive 正常或选择性和send class MyActor extends BasicActorString, MyActorResult {private final Logger log LoggerFactory.getLogger(MyActor.class);SuspendableOverrideprotected MyActorResult doRun() throws InterruptedException, SuspendExecution {// ...Arbitrary code here...final String msg receive(m - {if (test.equals(m)) return testMsg;else return null; // Defer});// ...Arbitrary code here...return new MyActorResult();} } 由Pulsar提供的Clojure API更加简洁 (def log (LoggerFactory/getLogger (class *ns*)))(spawn#(; ...Arbitrary code here...(receive ; Single, fiber-blocking, selective receivetest (do (. log info received test) testMsg)) ; Other messages will stay in the mailbox; ...Arbitrary code here...)) 类星体参与者如Erlang进程使用阻塞接收并被允许执行阻塞IO尽管阻塞IO操作最终不会阻塞OS线程而是阻塞光纤这使它们具有很高的可伸缩性。 Akka actor被实现为receive 事件的回调并且不允许阻塞 public class MyUntypedActor extends UntypedActor {LoggingAdapter log Logging.getLogger(getContext().system(), this);// receive must be toplevelpublic void onReceive(Object message) throws Exception {if (test.equals(message))log.info(received test);elselog.info(received unknown message)} }演员生命周期和监督层次 类星体 actor的创建和启动就像在光纤上一样容易 ActorRef myActor new MyActor().spawn(); 尽管Quasar和Akka都支持监视也可以监视 其他参与者的故障但Akka强制将参与者添加到适当的监督层次结构中因此必须始终通过指定参与者的类和适当的构造函数参数的配方来实例化参与者。 顶级演员必须由演员系统生成子演员必须由父母的上下文生成 ActorRef myActor system.actorOf(Props.create(MyActor.class), myactor); 监督是一种分层的故障管理模式提供了故障隔离的良好实践当子角色终止时主管将根据其监督策略进行操作。 受监督的儿童演员可能因永久性故障暂时性故障或仅完成工作而终止。 终止时主管通常可以选择使自己失败 升级 仅重新启动失败的孩子或重新启动所有孩子。 在Quasar中就像在Erlang中一样监督是可选的而supervisor只是一个预先构建的尽管是可配置的actor它通过内部使用原始actor监视操作监视和链接来提供监督。 当使用主管时Quasar也需要指定创建演员的方法以及其他信息例如主管在放弃之前应尝试多少次重试等 ChildSpec actorSpec new ChildSpec(myactor, TRANSIENT, 1, 1, MILLISECONDS, 100, MyActor::new); Supervisor mySupervisor new SupervisorActor(ALL_FOR_ONE, actorSpec).spawn(); Quasar还允许通过可Actor.reinstantiate方法来监督和重新启动预先构建的本地actor实例因此它可以与任何依赖项引擎一起使用。 Akka提供了几种关闭参与者的方法。 Quasar和Erlang一样只是鼓励一条简单的消息来表示关闭请求尽管这种通用机制已经是所有行为的一部分–参见下文 通过中断演员的基础线 线或纤维可以突然终止。 行为举止 Quasar遵循Erlang OTP库的示例为常见的actor类型称为behaviors提供可配置的actor模板。 行为都实现通用有用的消息传递模式但是在Quasar中它们还为参与者的引用添加了便捷方法。 Quasar的行为均以OTP建模 EventSourceActor 模仿Erlang的gen_event建模可以动态注册和取消注册处理程序这些处理程序将仅对收到的消息作出反应。 如果您认为这种特定类型的Quasar actor与仅反应的异步Akka actor非常接近那么您的方向正确。 ServerActor 模仿Erlang的gen_server建模对公开请求-响应API的服务进行建模。 ProxyServerActor允许编写基于接口的服务器它通过传递任何接口实现而构建并且将生成ActorRef 该ActorRef将代理接口并将与接口方法相对应的消息发送到底层服务器actor。 当然这只是一个用例但我认为当将传统API移植到Quasar actor时该行为actor会有所帮助。 在即将到来的Quasar 0.7.0以Erlang的gen_fsm建模中添加了FiniteStateMachineActor 可以轻松地将actor编写为显式的有限状态机。 Akka不包括这种预建的actor模板。 相反各种常见行为内置于标准API。 演员系统 Akka可以作为独立部署的容器或库运行 它是通过引用多个参与者系统的配置文件来设置的每个参与者系统由一个主管监督。 该配置包括日志记录调度AKA作为调度网络消息序列化和平衡AKA路由。 还提供了合理的默认值因此配置是可选的。 在Akka中actor系统是重量级的对象它对应于逻辑应用程序。 Quasar是一个库而不是一个框架它根本没有参与者系统的概念因为它不需要包含整个应用程序。 当然各种特定的配置是可能的 光纤的默认调度程序是fork-join工作窃取但甚至可以为每个光纤选择它。 参与者只是继承了用于其上运行的链的调度机制这意味着他们自己不需要调度/调度设置。 监督层次结构是可选的因此不需要“根”主管。 可以使用任何日志记录机制但是可选行为为此使用“标准”日志记录API SLF4J 。 Quasar提供了现成的Galaxy群集中的网络演员和演员迁移功能但可以提供更多支持。 群集功能是在群集提供程序的配置例如Galaxy中设置的而不是在Quasar本身中设置的。 类星体与部署无关。 对于适用于所有JVM应用程序也适用于采用Quasar的应用程序的酷部署解决方案建议您看一下Capsule 。 内部参与者API Quasar演员的默认内部API仅包括以下内容 receive / tryReceive方法和一个可重写的filterMessage用于在接收到消息之前将其丢弃。 对参与者的外部不透明引用。 基本的actor监视构造link watch和可handleLifecycleMessage 。 更多功能例如默认情况下嵌入的发件人引用日志记录终止请求处理请求服务事件处理和监督可以通过扩展预建行为来获得或由您添加。 而且由于有了Quasar光纤发送和接收操作可以同时被阻塞并且效率很高因此不需要异步的返回Future send变量例如Akka的ask 。 始终为所有参与者启用Akka功能例如监视和监督因此内部API广泛 receive方法。 对参与者的外部不透明引用。 对最后一个消息发件人的引用如果有。 可覆盖的生命周期方法。 使用的主管策略。 具有附加功能的context属性例如 创建受监管孩子的工厂方法。 Akka还提供了一个可选的Stash特性可以管理第二条已收到但应延迟处理的消息队列。 相反Quasar与Erlang一样允许选择性接收因此它不需要开发人员仅出于延迟消息处理的目的来管理其他消息队列。 热升级 Quasar通过在JMX或指定的“模块”目录中加载新类从而允许在运行时完全自动地升级actor。 Quasar还允许通过OnUpgrade注释的方法以受控方式升级OnUpgrade 。 换一个演员的部分功能用一个新的运行时虽然阿卡支持become方法但提供了一流的重新定义不支持所以无论是演员的行为必须以字节码已经存在于正在运行的JVM或新代码来替换必须通过一些其他的加载工具。 网络远程处理可靠性和集群 Quasar作为Galaxy上群集集群的一部分开箱即用地支持远程参与者但是可以添加更多的远程处理和群集提供程序。 Akka提供了类似的功能以及预先构建的功能可以直接在远程节点上生成角色并在单独节点上的角色之间进行负载平衡消息。 Quasar还通过实验支持actor 迁移 -暂停正在运行的actor并将其恢复到另一台计算机上的能力。 邮箱持久性 Akka包括一个基于其基础事件源引擎的实验性邮箱持久性支持并且要求actor扩展PersistentActor特性并为正常行为和恢复提供两个单独的事件处理程序以及显式调用persist 。 Quasar目前不支持actor邮箱持久性。 积分 Quasar不会强迫开发人员使用actor系统的所有功能也不会完全使用actor。 实际上Quasar为第三方技术提供了易于使用的集成框架这些框架具有异步基于未来的API或阻塞API 因此它们可以与轻量级线程“光纤”一起使用而不能与常规的重量级线程一起使用。 Quasar允许您自由地混合actor和非actor代码或使用actor代码中的任何集成库而无需专门的API。 Comsat使用此框架来集成标准和流行的Java和Clojure技术 Dropwizard 泽西岛 JAX-RS 客户端和服务器 Spring Boot Web控制器 OkHttp HTTP客户端 翻新 小程序 Clojure戒指 Comsat还包括Web Actors 这是一个新的actor API用于处理HTTPWebSocket和SSE交换。 目前 Akka项目提供 Apache Camel消息传递集成。 基于HTTP actor的API Spray 。 基于ZeroMQ actor的API。 基于TCP参与者的API。 基于UDP actor的API。 基于文件IO actor的API。 Akka与不基于消息传递的系统的集成必然是新的参与者API。 测试中 Quasar不包含专用的测试工具包因为它是一个支持临时参与者的阻塞框架临时参与者的链可以在终止时产生价值因此任何常规测试工具如JUnit都可以与常规多线程测试实践一起使用。 Akka是一个异步框架因此它必须以阻止单角色测试调用 TestActorRef TestFSMRef 的形式提供专用的API。 它还提供了启用了ScalaTest断言的特殊参与者以对整个参与者子系统 TestKit mixin或TestProbe 执行外部集成测试。 支持定时断言监督测试消息交换限制消息交换和故障跟踪。 系统监控与管理 Quasar通过标准JMX MBean公开了丰富的actor监视数据邮箱堆栈跟踪可以监视启用JMX的工具例如JDK的免费提供的JVisualVM和JConsole或者使用REST API使用Jolokia 。 此外Quasar还提供工具来微调仪器并记录详细的光纤执行轨迹。 可以通过专有软件Typesafe Console监视和管理Akka应用程序该软件需要生产系统的商业许可。 新的Relic和App Dynamics支持Akka和Quasar通过JMX。 完整应用比较类比股票和反应型股票 要了解Akka和Quasar之间的异同没有比查看使用两者编写的相同应用程序的代码更好的方法了。 Quasar Stocks是Reactive Stocks Play / Akka激活器模板的Java端口用于Quasar参与者和Comsat Web参与者。 在385行代码中纯Java Quasar应用程序几乎像半Scala Typesafe应用程序285个位置一样紧凑考虑到actor和Web Actor只能做一件事这特别好一切都是一致的。与JSON库无关因此您不必被迫仅使用一个Web框架并接受其有关Web开发问题的意见。 而且我仍然认为Quasar一个人比较容易理解因为它是一种古老的Java命令式样式仅在效率更高的轻量级线程实现上运行没有声明性/功能性/ monadic / async强制您解决JVM问题线程的足迹很大。 例如可以将Typesafe版本中基于“未来情绪”的Web服务替换为同等高效且完全传统的JAX-RS Jersey版本仅使用光纤阻塞而不是线程阻塞。 因此与其使用异步操作Future和专用的非标准DSL来组成它们就像在Typesafe版本中那样 object StockSentiment extends Controller {case class Tweet(text: String)implicit val tweetReads Json.reads[Tweet]def getTextSentiment(text: String): Future[WSResponse] WS.url(Play.current.configuration.getString(sentiment.url).get) post Map(text - Seq(text))def getAverageSentiment(responses: Seq[WSResponse], label: String): Double responses.map { response (response.json \\ label).head.as[Double]}.sum / responses.length.max(1) // avoid division by zerodef loadSentimentFromTweets(json: JsValue): Seq[Future[WSResponse]] (json \ statuses).as[Seq[Tweet]] map (tweet getTextSentiment(tweet.text))def getTweets(symbol:String): Future[WSResponse] {WS.url(Play.current.configuration.getString(tweet.url).get.format(symbol)).get.withFilter { response response.status OK}}def sentimentJson(sentiments: Seq[WSResponse]) {val neg getAverageSentiment(sentiments, neg)val neutral getAverageSentiment(sentiments, neutral)val pos getAverageSentiment(sentiments, pos)val response Json.obj(probability - Json.obj(neg - neg,neutral - neutral,pos - pos))val classification if (neutral 0.5)neutralelse if (neg pos)negelseposresponse (label - JsString(classification))}def get(symbol: String): Action[AnyContent] Action.async {val futureStockSentiments: Future[Result] for {tweets - getTweets(symbol) // get tweets that contain the stock symbolfutureSentiments loadSentimentFromTweets(tweets.json) // queue web requests each tweets sentimentssentiments - Future.sequence(futureSentiments) // when the sentiment responses arrive, set them} yield Ok(sentimentJson(sentiments))futureStockSentiments.recover {case nsee: NoSuchElementException InternalServerError(Json.obj(error - JsString(Could not fetch the tweets)))}} } 可以编写一个完全标准的熟悉的JAX-RS服务唯一的区别是附加的Suspendable注释和生成纤维而不是用于并行操作的线程 Singleton Path(/) public class Sentiment {final CloseableHttpClient client FiberHttpClientBuilder.create(Runtime.getRuntime().availableProcessors()).setMaxConnPerRoute(1000).setMaxConnTotal(1000000).build();GETPath({sym})Produces(MediaType.APPLICATION_JSON)Suspendablepublic JsonNode get(PathParam(sym) String sym) throws IOException, ExecutionException, InterruptedException {ListFiberJsonNode agents new ArrayList();ListJsonNode sentiments new ArrayList();for (JsonNode t : getTweets(sym).get(statuses))agents.add(sentimentRetriever(t.get(text).asText())); // spawn worker fibersfor (FiberJsonNode f : agents) // join fiberssentiments.add(f.get());return sentimentJson(sentiments);}private JsonNode sentimentJson(ListJsonNode sentiments) {Double neg getAverageSentiment(sentiments, neg);Double neutral getAverageSentiment(sentiments, neutral);Double pos getAverageSentiment(sentiments, pos);ObjectNode ret Application.Conf.mapper.createObjectNode();ObjectNode prob Application.Conf.mapper.createObjectNode();ret.put(probability, prob);prob.put(neg, neg);prob.put(neutral, neutral);prob.put(pos, pos);String c;if (neutral 0.5)c neutral;else if (neg pos)c neg;elsec pos;ret.put(label, c);return ret;}private Double getAverageSentiment(ListJsonNode sentiments, String label) {Double sum 0.0;final int size sentiments.size();for (JsonNode s : sentiments)sum s.get(probability).get(label).asDouble();return sum / (size 0 ? size : 1);}private FiberJsonNode sentimentRetriever(String text) throws IOException {return new Fiber (() - {HttpPost req new HttpPost(Application.Conf.sentimentUrl);ListNameValuePair urlParameters new ArrayList();urlParameters.add(new BasicNameValuePair(text, text));req.setEntity(new UrlEncodedFormEntity(urlParameters));return Application.Conf.mapper.readTree(EntityUtils.toString(client.execute(req).getEntity()));}).start();}Suspendableprivate JsonNode getTweets(String sym) throws IOException {return Application.Conf.mapper.readTree (EntityUtils.toString(client.execute(new HttpGet(Application.Conf.tweetUrl.replace(:sym:, sym))).getEntity()));} } 阻塞样式还有另一个好处Quasar API 更小 更简单 。 例如完全不需要Akka对计划消息的特定支持因为在Quasar中演员主体可以使用常规的控制流构造。 所以代替 // Fetch the latest stock value every 75ms val stockTick context.system.scheduler.schedule(Duration.Zero, 75.millis, self, FetchLatest) 在消息处理循环中定期进行光纤阻塞定时接收已绰绰有余 for(;;) {Object cmd receive(75, TimeUnit.MILLISECONDS);if (cmd ! null) {// ...} else self().send(new FetchLatest());// ... } 此外默认情况下Quasar Web Actor会自动将新的actor分配给新的HTTP会话或WebSocket连接因此Quasar完全不需要Typesafe版本的基于回调的应用程序控制器 因为一切都由actor直接处理它将浏览器或移动客户端简单地看作另一个参与者它可以监视以监视客户端的终止。 关于应用程序的Typesafe 教程提到了几种类型的设计模式 响应式推送基本上意味着将线程有效地分配给参与者以处理WebSocket交换。 通过使用Quasar的基于光纤的actor可以有效地完成此任务而不会限制常规控制流构造的使用。 反应性请求和反应性组合基本上是指使用异步构造例如Future的单子组合以实现Web服务中有效的线程使用。 在光纤上运行时这种复杂性是完全没有必要的您可以使用常规的直接的阻塞调用和控制流并且光纤调度程序可以为您处理线程以达到相同的效果和性能。 反应式UI基本上已经被复制到Quasar Stocks中。 最后Web Actor是100Servlet兼容的因此如果您不想运行非标准嵌入式服务器则无需运行。 相反Play必须独立运行2 。 性能比较 环形测试JMH基准测试套件基于Fiber-test 并从Fiber-test派生而来比较了基于AkkaQuasar ActorsJava Threads和Quasar光纤带有或不带有不同类型的通道的几种消息传递实现。 基准将工人参与者安排成一个环形并执行消息传递循环。 变量是 工作人员人数默认 503 循环的长度默认 1E 06消息交换 响铃次数默认 1 在每次消息交换及其参数之前执行的业务逻辑默认无。 所有测试均在2008年底的MacBook Pro铝制版8GB RAMMint LinuxLinux 3.13.0-49通用下使用Core 2 Duo P8600 2.4GhzJDK 1.8.0_45-b14进行了积极的优化和分层编译的情况下进行。已启用。 使用的JMH版本是1.8带有5个fork5个热身迭代和10个迭代。 首先让我们看一下带有默认参数的内存占用量 与光纤和Quasar actor相比Akka具有最高的堆使用率最高的GC事件数和最高的GC总时间因此Quasar总体上具有较低的内存占用量。 关于速度首先要注意的是改变工人角色的数量甚至达到数百万都不会改变Quasar和Akka的单环性能数据这证实了角色和光纤确实非常轻巧。 然后进行了两组测量第一个测量具有固定数量的1E 04消息交换和变化的业务工作量显示Quasar的启动速度稍快但是随着工作量开始占主导地位Akka和Quasar的执行情况非常相似 在没有工作负载和数量不定的消息交换的情况下我们测量的是纯框架开销 。 Quasar再次启动得更快但是Akka领先Quasar的额外开销达到并稳定在Akka的80左右 由于缺少JVM中的本机连续性JMH perfasm分析回合突出显示了Quasar中与用户堆栈管理相关的真正轻量级线程的额外成本。 Akka不提供真正的轻量级线程因此没有开销。 当然 任何开销无论多么小都比没有开销要大得多。 要了解实际开销是否重大我们必须将其与实际工作负载进行比较。 每条消息的业务工作量相当于对224个元素的int数组进行排序或者等效地在1700字节的纯alpha文本上匹配预编译的仅6个数字的正则表达式失败匹配项在3到4微秒上基准系统Quasar比Akka 慢1 。 这意味着在最坏的情况下 对于平均每个消息交换在1700字节文本上平均至少执行6字符正则表达式匹配的应用程序性能差异将小于1 。 由于大多数应用程序的功能远不止这些因此实际上您可以获得Quasar光纤和actor可以提供的与Akka 3 相同性能的大量额外编程功能 。 结论 Quasar是JavaClojure和Kotlin的快速精简和实用的并发库提供了真正的轻量级线程和许多成熟的并发范例包括与Erlang几乎相同的actor模型的实现。 Quasar的集成采用和退出成本也很低。 它的功能集中并且在提供日志记录和监视等其他功能的地方它使用标准APISLF4JJMX等。 Akka是一个应用程序框架与Play等其他Typesafe框架一样它是一个全面的选择涵盖了整个应用程序引入了自己的丰富API甚至用于日志记录测试工具监视和部署。 Akka –甚至是其Java API –受Scala的影响很大并且Java开发人员可能会觉得陌生。 无论您是编写JavaClojure还是Kotlin类星体演员都非常熟悉和习惯。 Akka的API是基于回调的。 Quasar提供了真正的光纤如Erlang或Go因此阻塞是免费的并且Quasar的actor API更简单更熟悉并且与其他代码兼容。 像基于Erlang那样基于阻塞和基于光纤允许使用很少的基本概念而Akka引入了许多不熟悉和多余的概念。 例如要解决缺少简单的阻止选择性接收由Erlang和Quasar提供的问题Akka必须引入消息存储。 其他概念如单子期货与业务逻辑或参与者模型无关但纯粹是偶然的复杂性。 如果发生以下情况Akka无疑是必经之路 您已经接受了Scala并喜欢它的编程风格。 您不用担心押在框架上并坚持下去也不必为选择退出而付出潜在的高昂重新设计/重写价格。 您准备为生产监视付费或者愿意编写自己的监视解决方案。 否则我建议您尝试一下Quasar它可用于生产轻量级快速基于标准易于集成完全免费且开源并且比Akka的异步参与者提供的功能更多且复杂度更低。 有几种参与者系统不支持选择性接收但是Erlang可以。 乌尔夫·维格Ulf Wiger的演讲“偶然复杂性导致的死亡”显示了如何使用选择性接收避免实现完整复杂且容易出错的转换矩阵。 在另一场演讲中 Wiger将非选择性FIFO接收与俄罗斯方块游戏进行了比较在俄罗斯方块游戏中您必须在拼图中放入每个拼图而选择性接收则将问题变成了拼图游戏您可以在其中寻找一块拼图你知道会适合的。 除非您使用具有某些限制的第三方插件 。 2048字节以上的Quasar变得比Akka更快但到目前为止的原因尚不清楚这可能与更有利的内联有关。 翻译自: https://www.javacodegeeks.com/2015/05/quasar-and-akka-a-comparison.html
http://www.zqtcl.cn/news/758240/

相关文章:

  • 个人做网站的时代已经过去大连男科医院排名表
  • 天津餐饮网站建设贵港做网站化司
  • 昆山哪家做网站好猪八戒网站建设
  • 网站的静态资源服务器怎么做河北网站备案
  • php儿童摄影网站源码东莞做网站的公司哪家最好
  • 金融投资网站建设wordpress九宫格主题
  • 玉田县网站建设手机网站建设西安
  • 高质量外链网站请大学生做网站
  • 2021能看的网站不要app贴吧网站以前在百度能搜索不到了
  • 个人做网站时不要做什么样的网站百度网站排名全掉
  • 鹤岗做网站制作企业网站需要注意的事项
  • 网站建设服务器是什么意思短网址转换器
  • 红叶网站开发工作室整站优化费用
  • 温州网站建站模板建设小企业网站步骤
  • 免费企业网站我为什么电商要学网站建设
  • 建设网站员工招聘策划方案win2012 iis配置网站
  • 织梦cms 5.6网站地图图标怎么在wordpress
  • instagram wordpress北京seo学校
  • 网站优化的基本思想企业网站建设和运营
  • 网站开发电销常遇到问题怎么建立一个群
  • worldpress 建站少儿编程加盟费一般多少钱
  • 哪个公司做网站建设好九一人才网赣州招聘官网
  • 城阳区规划建设局网站哈尔滨网站建设好
  • 中小型网站建设价位无锡有哪些互联网公司
  • 网站内容收费jquery 网站框架
  • 自己建网站买玩具外贸网站如何做推广
  • 网站 配色表注册公司有什么风险
  • 网站管理员登陆后缀重庆建筑证书查询网站
  • 义乌seoseo建站外贸
  • 只做早餐的网站老网站做seo能不能重新注册