Concurrency 基础知识|线程与反应式并发模型

Concurrency 基础知识|线程与反应式并发模型,concurrency,akka,threadpool,reactive-programming,Concurrency,Akka,Threadpool,Reactive Programming,我是反应式编程的新手。我正在寻找阿克卡演员作为开始的一步 我对基于线程的并发模型的理解是(例如普通的基于Servlet的模型): 对于来自客户端的每个请求,都会产生一个新线程 这意味着所有底层代码的执行都附加到此线程并以串行方式进行。显然,即使代码的一部分有瓶颈(远程Web服务调用等),线程也会被阻塞并等待并保持空闲 服务器(容器)有一个固定的线程池来容纳最大数量的并发线程,显然,由于瓶颈,它们将快速运行线程 我对反应式并发模型的理解是(例如基于Akka的模型): 所有逻辑不再附加到单个线程,而

我是反应式编程的新手。我正在寻找阿克卡演员作为开始的一步

我对基于线程的并发模型的理解是(例如普通的基于Servlet的模型):

  • 对于来自客户端的每个请求,都会产生一个新线程
  • 这意味着所有底层代码的执行都附加到此线程并以串行方式进行。显然,即使代码的一部分有瓶颈(远程Web服务调用等),线程也会被阻塞并等待并保持空闲
  • 服务器(容器)有一个固定的线程池来容纳最大数量的并发线程,显然,由于瓶颈,它们将快速运行线程
  • 我对反应式并发模型的理解是(例如基于Akka的模型):

  • 所有逻辑不再附加到单个线程,而是串行执行
  • 执行流是反应式的(即在消息上触发参与者)
  • 现在我的问题是:

    假设两个模型中都存在远程webservice调用的瓶颈。 actor模型如何帮助提高CPU/核心利用率?我们会不会遇到同样的问题:参与者内的执行线程被阻塞? 例如:如果有200名参与者同时被此webservice调用阻止?这不意味着目前有200个线程被阻塞吗? 我理解,仍将有其他行动者对其他上游事件作出反应。这就是我们所说的更好地利用CPU吗

    在线程模型中,只有较小的线程池是问题的原因吗

    Actor子系统是否有一个线程池来生成一个新的Actor并对特定事件作出反应?如果是,那么我们不是有同样的问题吗

    如果这个问题非常愚蠢,请原谅。

    假设瓶颈…--在反应式模型中,您永远不会使用这样的服务,而是异步调用Web服务的请求,并为最终的响应/错误配置处理程序。 如果调用同步服务,则只会引入所有批处理模式问题,从而加剧您的问题。如果您不能直接使用一个代理,那么您可以创建一个类似代理的服务作为一个代理(*)

    当响应到达时,处理程序可以展开继续操作所需的任何上下文。如果所说的上下文相当于一个“堆栈+寄存器”,那么您的框架就不是很好,但是比有数百个内核线程上下文来解析消息要好

    必须构建响应上下文的形式主义应该引导解决方案远离对资源的争夺,这在线程模型中很常见。这是一个抽签,因为好的线程和差的反应解决方案都是可能的,如果违反直觉的话

    概述:应用程序空间中的一个小数据结构保存了继续操作所需的信息,这比内核线程+用户线程+堆栈要好得多。不仅仅是因为它使用更少的资源;但是因为它更好地表达了您的解决方案,并且允许底层框架/os/kernel/。。。根据比“返回地址”更多的信息对事件调度进行排序

    自然反应性问题应该有自然反应性解决方案,就像自然批处理的问题应该有自然批处理的解决方案一样


    (*)=几乎所有反应式框架都是基于传统的同步内核构建的,比如linux;反应式内核正在发展,大型多处理器的出现将有助于这些概念的主流化。

    Actor是否能帮助解决问题,关键在于Actor是如何实现的。如果它们确实是独立的线程,那么Web服务上未被阻止的参与者将继续执行。因此,即使Web服务阻碍了其中的一些工作,仍然会继续进行有用的工作

    如果增加线程池的大小,情况也是如此。他们中的一些人将做其他有用的工作

    拥有200个线程意味着您现在给底层操作系统增加了更多负担。很多人会做出恐怖的反应。然而,值得研究的是“操作系统的负担”到底是什么。这是一点记忆,仅此而已。对于Web服务上被阻塞的线程,它们被阻塞,没有被调度,因此它们不会增加系统的上下文切换负担(上下文切换是性能杀手;在大量线程之间切换会消耗大量时间)。因此,它们对系统性能的危害相对较小(前提是您不是动态生成参与者)

    因此,在这两种方法中,您都需要足够的线程(参与者或线程池线程),以便有合理的数量保持Web服务100%的利用率,并有足够的时间执行其他任务以使本地机器保持忙碌。您可能希望两台机器都饱和,但不会达到本地机器同时处理太多就绪线程的程度

    现在,每一个网络、web服务、主机都是不同的,性能也是不断变化的。最后,您将编写代码来动态控制线程池的大小或准备启动的参与者的数量。这可能是很微妙的