【问题标题】:Implementing event-driven lightweight threads实现事件驱动的轻量级线程
【发布时间】:2017-02-04 09:56:30
【问题描述】:

受 Akka 和 Quasar 等库的启发,我开始想知道这些库实际上是如何“在幕后”工作的。我知道这很可能非常复杂,并且它们的工作方式彼此完全不同。

我仍然想了解如何使用 Java 8 实现我自己的“事件驱动轻量级线程”的(最多)一个非常基本的版本。

我对 Akka 作为一个库非常熟悉,并且对 JVM 上的并发性有一个中等的了解。

谁能指点我一些涵盖这方面的文献,或尝试描述所涉及的概念?

【问题讨论】:

    标签: java jvm akka quasar


    【解决方案1】:

    在 Akka 中是这样工作的:

    • actor 是将邮箱与处理消息的行为捆绑在一起的类
    • 当一些代码调用ActorRef.tell(msg) 时,msg 被放入被引用actor 的邮箱中(不过,这还不足以运行任何东西)
    • 任务在调度程序(基本上是一个线程池)上排队以处理邮箱中的消息
    • 当有另一条消息进来并且邮箱已经排队时,不需要再次调度
    • 当调度程序执行处理邮箱的任务时,会调用actor来处理一条又一条的消息
    • 此邮箱中的邮件达到akka.actor.throughput 中指定的计数将由这一任务一次性处理。如果邮箱之后仍有消息,则调度程序会安排另一个任务来处理剩余的消息。之后任务退出。这确保了公平性,即运行此邮箱的线程不会被一个参与者无限期地阻止。

    所以,基本上有两个工作队列:

    1. 演员的邮箱。这些消息需要按顺序处理,以确保参与者的合同。
    2. 调度程序的队列。这里的所有任务都可以同时处理。

    高效编写此代码最难的部分是线程池。在线程池中,一堆工作线程需要以一种有效的方式访问它们的任务队列。默认情况下,Akka 在底层使用 JDK 的 ForkJoinPool,这是一个非常复杂的工作窃取线程池实现。

    【讨论】:

      【解决方案2】:

      谁能给我指点这方面的文献,

      我是 Chronicle Queue 的架构师,您可以在我的博客 https://vanilla-java.github.io/tag/Microservices/ 上阅读它的使用和工作方式

      尝试描述所涉及的概念?

      你有;

      • 最重要的是,通过减少工作量来使您的线程更快、更轻。
      • 尝试尽快处理每个事件以保持低延迟。
      • 必要时进行批处理,但应保持在最低限度。批处理会增加延迟,但有助于提高最大吞吐量。
      • 确定关键路径。尽可能缩短这段时间,将任何阻塞或长时间运行的内容移至异步线程/进程。
      • 尽量减少线程、进程或机器之间的跳数。
      • 降低分配率以提高 GC 之间的吞吐量,并减少 GC 的影响。

      对于我工作的某些系统,您可以在 Java 中实现 30 微秒的延迟(网络数据包输入到网络数据包输出)

      【讨论】:

      • 基本上我想知道的是它如何改变上下文?我的意思是,像 Akka 一样,假设我们在同一个线程上有 2 个演员,打印 5 次“hello #nr”。运行会产生不同的结果,但作为一个例子:它如何在一个线程上打印可能来自 actor #1 的 3,然后来自 actor #2 的 2,然后来自 actor #1 的 2,最后来自 actor #2 的 3。
      • @Franz 你有一个线程可以读取消息并确定要调用哪个参与者。一旦使用消息调用actor,它就可以打印一些东西。一旦actor返回,线程就可以读取下一条消息等。
      • 演员在等待 HTTP 请求时是否有可能说“嘿,我在这里等,阅读下一条消息,稍后再回来找我”同一个线程?如果是,它怎么能做到这一点?我是关于异步库,例如playframework.com/documentation/2.5.x/JavaWS
      • @Franz 你可以通过延续来做到这一点,但 Java 对它们没有很好的支持。通常使用回调。
      【解决方案3】:

      在阿卡,

      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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-11-02
        • 2017-05-06
        • 1970-01-01
        • 2023-03-27
        • 2011-05-02
        • 2019-05-10
        • 2011-01-19
        • 1970-01-01
        相关资源
        最近更新 更多