【发布时间】:2017-02-04 09:56:30
【问题描述】:
受 Akka 和 Quasar 等库的启发,我开始想知道这些库实际上是如何“在幕后”工作的。我知道这很可能非常复杂,并且它们的工作方式彼此完全不同。
我仍然想了解如何使用 Java 8 实现我自己的“事件驱动轻量级线程”的(最多)一个非常基本的版本。
我对 Akka 作为一个库非常熟悉,并且对 JVM 上的并发性有一个中等的了解。
谁能指点我一些涵盖这方面的文献,或尝试描述所涉及的概念?
【问题讨论】:
受 Akka 和 Quasar 等库的启发,我开始想知道这些库实际上是如何“在幕后”工作的。我知道这很可能非常复杂,并且它们的工作方式彼此完全不同。
我仍然想了解如何使用 Java 8 实现我自己的“事件驱动轻量级线程”的(最多)一个非常基本的版本。
我对 Akka 作为一个库非常熟悉,并且对 JVM 上的并发性有一个中等的了解。
谁能指点我一些涵盖这方面的文献,或尝试描述所涉及的概念?
【问题讨论】:
在 Akka 中是这样工作的:
ActorRef.tell(msg) 时,msg 被放入被引用actor 的邮箱中(不过,这还不足以运行任何东西)akka.actor.throughput 中指定的计数将由这一任务一次性处理。如果邮箱之后仍有消息,则调度程序会安排另一个任务来处理剩余的消息。之后任务退出。这确保了公平性,即运行此邮箱的线程不会被一个参与者无限期地阻止。所以,基本上有两个工作队列:
高效编写此代码最难的部分是线程池。在线程池中,一堆工作线程需要以一种有效的方式访问它们的任务队列。默认情况下,Akka 在底层使用 JDK 的 ForkJoinPool,这是一个非常复杂的工作窃取线程池实现。
【讨论】:
谁能给我指点这方面的文献,
我是 Chronicle Queue 的架构师,您可以在我的博客 https://vanilla-java.github.io/tag/Microservices/ 上阅读它的使用和工作方式
尝试描述所涉及的概念?
你有;
对于我工作的某些系统,您可以在 Java 中实现 30 微秒的延迟(网络数据包输入到网络数据包输出)
【讨论】:
在阿卡,
1.Actor系统将线程池中的线程分配给有消息要处理的actor。
2.当actor没有消息要处理时,线程被释放并分配给其他有消息要处理的actor
这样异步actor系统可以处理很多 具有相同资源量的更多并发请求,因为 有限数量的线程(线程池)在等待 I/O 时永远不会闲置 要完成的操作。
欲了解更多信息,您可以下载并查看此电子书https://info.lightbend.com/COLL-20XX-Designing-Reactive-Systems_RES-LP.html?lst=BL&_ga=1.214533079.1169348714.1482593952
【讨论】: