实现事件驱动的轻量级线程

时间:2017-02-04 09:56:31

标签: java jvm akka quasar

受到像Akka和Quasar这样的图书馆的启发,我开始想知道这些实际上是如何起作用的#34;引擎盖下#34;我意识到它很可能非常复杂,并且它们彼此之间的工作方式完全不同。

我仍然想学习如何实现(最多)我自己的基本版本"事件驱动的轻量级线程"使用Java 8。

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

有人能指出我的一些文献,或试着描述所涉及的概念吗?

3 个答案:

答案 0 :(得分:2)

在Akka,它的工作原理如下:

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

因此,基本上有两个工作队列:

  1. 演员的邮箱。需要按顺序处理这些消息以确保参与者的合同。
  2. 调度员的队列。这里的所有任务都可以同时处理。
  3. 有效写这篇文章最困难的部分是线程池。在线程池中,一堆工作线程需要以有效的方式访问其任务队列。默认情况下,Akka使用JDK的ForkJoinPool,这是一个非常复杂的工作窃取线程池实现。

答案 1 :(得分:1)

  

有人能指出我的一些文献,

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

  

尝试描述所涉及的概念?

你有;

  • 最重要的是,通过减少工作量,使你的线程更快,重量更轻。
  • 尽可能快地处理每个事件,以保持低延迟。
  • 必要时批量生产,但要尽量减少。批处理会增加延迟,但可以帮助提高最大吞吐量。
  • 确定关键路径。保持这个尽可能短,将任何阻塞或长时间运行的东西移动到异步线程/进程。
  • 在线程,进程或计算机之间将hops保持在最低限度。
  • 降低分配率以提高GC之间的吞吐量,并降低GC的影响。

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

答案 2 :(得分:1)

在Akka,

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