注意: 不幸的是这个问题已经关闭,但是如果有其他人提出同样的问题,我正试图维护它.
我一直在寻找在Scala中开发服务的良好解决方案,该服务将位于移动设备和现有Web服务之间.
目前可行的选项清单是:
那里可能有更多的选择.如何决定使用哪一个?什么是一个好的Scala中间件选择的特征(借口双关语;-).一方面,我想去Akka,因为它是TypeSafe Scala堆栈的一部分,但另一方面,像Finagle这样的东西有一组丰富的库,使管道变得如此简单.喷雾看起来很好用,很简单.
任何建议,见解或经验将不胜感激.我相信那里的某些人必须有一些经验,他们不介意分享.
更新:
我很乐意重新开启这个问题.这个问题的一个很好的答案将有助于新的Scalateers避免相关的陷阱.
更新2:
这些是我自问这个问题后的经验:
Finagle - 我用Finagle进行了一个项目,它坚如磐石.
喷雾 - 在我的最新项目中,我正在使用Spray,我非常高兴.最新版本基于Akka 2构建,您可以使用Spray-can库直接运行它,无需Web服务器.Spray是一组库,而不是框架,非常模块化.在了解喷雾:在阿卡视频REST给出了一个很好的概述,而这个博客在Cakesolutions显示了一个非常好的发展方式和结构.
更新3:
生活移动得非常快.如果你不停下来,偶尔环顾四周,你可能会错过它.- Ferris Bueller
这些天选择变得更加简单.在我的拙见中,Spray赢得了这场战斗.它被整合到Akka中,成为下一个Akka HTTP.我现在一直在使用Spray进行多个项目,并且可以诚实地说它是我遇到的奇妙和最好的支持软件.
这不能回答最初的问题,但至少可以说明为什么Spray在大多数情况下似乎是最佳选择.它非常灵活,无阻塞且非常稳定.它有客户端和服务器端库以及一个很棒的测试工具包.另外,请查看这些统计信息以了解性能:Web框架基准测试
向Actors发送消息时感叹号(!)和问号(?)之间有什么区别?
myActor ! Hello(value1)
myActor ? Hello(value1)
Run Code Online (Sandbox Code Playgroud) 我是Akka框架的新手,我正在Netty + Akka上构建一个HTTP服务器应用程序.
到目前为止,我的想法是为每种类型的请求创建一个actor.例如,我有一个POST到/ my-resource的actor和另一个GET到/ my-resource的actor.
在哪里我感到困惑的是我应该如何创作演员呢?我是不是该:
为每个请求创建一个新的actor(我的意思是我应该为每个请求做一个相应的actor的TypedActor.newInstance())?创建新演员有多贵?
在服务器启动时创建每个actor的一个实例,并为每个请求使用该actor实例?我读过一个演员一次只能处理一条消息,所以这不是瓶颈吗?
做点别的吗?
感谢您的任何反馈.
Akka 2.x需要很多命令才能引用ActorSystem.因此,要创建一个actor的实例,MyActor您可能会说:
val system = ActorSystem()
val myActor = system.actorOf(Props[MyActor])
Run Code Online (Sandbox Code Playgroud)
由于经常需要ActorSystem:许多代码示例省略了代码的创建,并假设读者知道system变量的来源.
如果您的代码在不同的地方生成actor,您可以复制此代码,可能创建其他ActorSystem实例,或者您可以尝试ActorSystem通过引用某些全局或通过传递来共享同一实例ActorSystem.
Akka文档提供了"Actor Systems"标题下的actor系统的一般概述,并且有该类的文档ActorSystem.但这些都没有帮助解释为什么Akka的用户不能仅仅依靠Akka来管理这个问题.
ActorSystem每次共享同一个对象或创建一个新对象有什么含义?
这里的最佳做法是什么?一直四处走动ActorSystem看起来非常严厉.
一些例子给出了ActorSystem一个名字:ActorSystem("MySystem")其他人只是打电话ActorSystem().这会有什么不同,如果你两次使用相同的名称怎么办?
是否akka-testkit要求您ActorSystem与传递给TestKit构造函数的共享共享?
所以,如果我有一个演员,我可以给它一个名字.但是,我可以在内部访问该名称吗?例:
class Actorz extends Actor with ActorLogging {
val actorName = //??What function
def receive = {
case x => log.debug(actorName+": Received Message: "+x)
}
}
val actor = system.actorOf(Props[Actorz], "named")
actor ! "dogs"
Run Code Online (Sandbox Code Playgroud)
现在,我可以将其名称作为构造函数参数传递.但是,如果有一种方法可以在内部获取名称,那么这似乎是不必要的重复...因为它是在我使用实例化actor时设置的system.actorOf.API文档似乎没有任何内容.
如果我发送相同的消息,告诉和转发有什么区别:
case msg: Message =>
otherActor tell (msg,sender)
Run Code Online (Sandbox Code Playgroud)
和
case msg: Message =>
otherActor forward msg
Run Code Online (Sandbox Code Playgroud) Play的主页说:
Play基于Akka构建,可为高度可扩展的应用程序提供可预测的最小资源消耗(CPU,内存,线程).
我想知道Akka在Play中的使用方式和位置,以及在Akka上使用Play构建的后果.
你能否告诉我Apache Spark和AKKA之间的区别,我知道这两个框架都意味着编程分布式和并行计算,但我没有看到它们之间的链接或区别.
此外,我想得到适合他们每个人的用例.
parallel-processing distributed-computing bigdata akka apache-spark
我正试图找到'正确'的演员实现.我意识到有一堆它们,选择一个有点令人困惑.就个人而言,我对远程演员特别感兴趣,但我想完整的概述会对很多人有所帮助.这是一个非常普遍的问题,所以请随意回答您所了解的实施问题.
我知道以下Scala Actor实现(SAI).请添加缺少的.
Scalaz(http://code.google.com/p/scalaz/)
这些SAI的目标用例是什么(轻量级与"重型"企业框架)?
我想Source在它上面创建一个和后来的推送元素,如:
val src = ... // create the Source here
// and then, do something like this
pushElement(x1, src)
pushElement(x2, src)
Run Code Online (Sandbox Code Playgroud)
建议的方法是什么?
谢谢!