你能否告诉我Apache Spark和AKKA之间的区别,我知道这两个框架都意味着编程分布式和并行计算,但我没有看到它们之间的链接或区别.
此外,我想得到适合他们每个人的用例.
parallel-processing distributed-computing bigdata akka apache-spark
我是Azure Service Fabric的新手,也是我遇到的最大问题
这个问题困扰了我一段时间了(我希望我不是唯一的一个).我想采用一个典型的3层Java EE应用程序,看看它可能看起来像是用actor实现的.我想知道是否真的有意义进行这样的转换以及如果它确实有意义我可以从中获利(可能是性能,更好的架构,可扩展性,可维护性等等).
这是典型的Controller(演示),服务(业务逻辑),DAO(数据):
trait UserDao {
def getUsers(): List[User]
def getUser(id: Int): User
def addUser(user: User)
}
trait UserService {
def getUsers(): List[User]
def getUser(id: Int): User
def addUser(user: User): Unit
@Transactional
def makeSomethingWithUsers(): Unit
}
@Controller
class UserController {
@Get
def getUsers(): NodeSeq = ...
@Get
def getUser(id: Int): NodeSeq = ...
@Post
def addUser(user: User): Unit = { ... }
}
Run Code Online (Sandbox Code Playgroud)
你可以在许多弹簧应用中找到类似的东西.我们可以采用没有任何共享状态的简单实现,因为没有同步块...所以所有状态都在数据库中,应用程序依赖于事务.服务,控制器和dao只有一个实例.因此,对于每个请求,应用程序服务器将使用单独的线程,但线程不会相互阻塞(但将被DB IO阻止).
假设我们正在尝试与actor实现类似的功能.它看起来像这样:
sealed trait UserActions
case class GetUsers extends UserActions
case class GetUser(id: Int) extends UserActions …Run Code Online (Sandbox Code Playgroud) 如果我已经有java使用spring和servlet容器的现有Web应用程序.将Akka整合到其中的正确方法是什么?
就像我将拥有Actor1并Actor2相互沟通一样.什么是开始使用这些演员的切入点?(比如:1.把它放在那里2.更改配置3.获取对actor的引用)
我找到了http://doc.akka.io/docs/akka/2.2-M3/general/configuration.html但是他没有给我提供胶水.只想获得整合的真实例子.
有一些简单的集成示例吗?
编辑: 应用程序执行一些搜索,从外部获取一些数据,将信息存储到文件.
应用程序非常大.有些组件/对象可以离开自己的生命,即直接客户端请求,它可以做一些并行的事情.就像一些具有可变状态的单例对象一样.
事情是我不知道我可以在哪里申请演员,我正在调查它.但我已经有很多同步块在这里和那里.
而且,我相信,已经有迹象表明演员可能会被应用.(因为我不确定,也许我忘了把一些同步,当然也没有集成测试)
关于配置,我只是不确定我是否应该配置一些application.conf让Actrors/Akka在那里生活(因为文档本身描述了它).
我所看到的:
@Component("someManager")
public class SomeManager {
List<Some> something; // mutable state, that why I use locks here.
// methods: add(), delete(), update()
}
Run Code Online (Sandbox Code Playgroud)
我能成功 SomeManagerActor
SomeManager用于controller.因此,拥有控制器Actor会很好吗?我希望收到(onReceive()方法的反馈).
这有点争议......这是我需要一些例子的另一个原因.
我相信我可以通过摆脱所有synchronized/whait/notify东西,将责任转移到演员,使用消息作为与他们之间的沟通方式来改进应用程序.
或者像这样,它可能是写入属性文件的actor:
编辑:
例如,现在我发现:为了使Actor1向Actor2发送消息,我使用了一个技巧:
// somewhere in existing code
public void …Run Code Online (Sandbox Code Playgroud) 我正在编写一个必须生成数千个网络请求的实用程序.每个请求只接收一个响应的小数据包(类似于ping),但可能需要几秒钟才能完成.处理每个响应在一个(简单)代码行中完成.
这样做的最终结果是计算机不受IO限制,受文件系统限制或受CPU限制,它仅受响应延迟的约束.
这类似于,但不一样有一种方法可以确定理想的线程数?和Java最好的方法来确定最佳线程数[重复] ...主要的区别是我只受延迟的约束.
我正在使用一个ExecutorService对象来运行线程和一个Queue<Future<Integer>>跟踪需要检索结果的线程:
ExecutorService executorService = Executors.newFixedThreadPool(threadPoolSize);
Queue<Future<Integer>> futures = new LinkedList<Future<Integer>>();
for (int quad3 = 0 ; quad3 < 256 ; ++quad3) {
for (int quad4 = 0 ; quad4 < 256 ; ++quad4) {
byte[] quads = { quad1, quad2, (byte)quad3, (byte)quad4 };
futures.add(executorService.submit(new RetrieverCallable(quads)));
}
}
Run Code Online (Sandbox Code Playgroud)
...然后我将队列中的所有元素出列,并将结果放入所需的数据结构中:
int[] result = int[65536]
while(!futures.isEmpty()) {
try {
results[i] = futures.remove().get();
} catch (Exception e) {
addresses[i] = -1; …Run Code Online (Sandbox Code Playgroud) 我刚刚使用Akka编写了一个JDBC连接池.
它使用一个actor来保存真实数据库连接的"maxPoolSize"集合.调用者向池actor询问连接并接收a Future[Connection]并且连接的状态变为"忙",直到调用者将其返回到池中connection.close.如果所有连接都忙,则新的传入连接请求将被置于等待队列(也由池actor保持).稍后当返回连接时,将满足等待请求.
这个逻辑的实现在akka中非常容易,只需要几十行代码.但是,当使用BoneCP 多线程测试来测试性能时(即调用者close在完成Future[Connection]返回时立即连接getConnection.基准测试traversed所有close请求和Await结果Future),我发现Akka版本比许多其他连接池实现慢例如tomcat-jdbc,BoneCP甚至是公共DBCP.
我试过调试的内容:
但没有看到明显的改善.
我的问题是:
根据akki.io上的文档,我没有看到MicroKernel解决了哪些常见用例?有没有人有一些简单的现实世界用例?
谢谢
akka ×5
java ×3
scala ×3
3-tier ×1
actor ×1
apache-spark ×1
bigdata ×1
integration ×1
java-ee ×1
networking ×1
performance ×1
spring ×1