了解长生不老药

时间:2018-12-30 18:25:39

标签: spring-boot playframework elixir elixir-framework

像SpringBoot和Play这样的Java框架可以通过利用机器上的所有内核来同时处理多个请求吗?如果他们能够做到这一点,那么Elixir在并发方面要解决什么独特的问题?只是一种不同的语言吗?还是计算范式本身存在任何差异,从而使我们使用Elixir降低了服务器成本?

以下是报告: https://www.techworld.com/apps-wearables/how-elixir-helped-bleacher-report-handle-8x-more-traffic-3653957/

3 个答案:

答案 0 :(得分:4)

有三个主要区别。

轻量级进程

  

Elixir的进程不应与操作系统进程混淆。就内存和CPU而言,Elixir中的进程非常轻巧(即使与许多其他编程语言中使用的线程相比也是如此)。因此,同时运行成千上万的进程并不罕见。 — https://elixir-lang.org/getting-started/processes.html

容错

Erlang ,因此 Elixir 使用监督树的概念,确保单个进程的崩溃不会对进程造成任何损害整个应用程序;更甚者,Erlang哲学明确指出“让它崩溃”是其座右铭。基本上,这意味着您不应该在某种程度上关心错误处理。

  

主管具有内置机制,可以限制在给定时间间隔内可能发生的重新启动次数。这由两个参数MaxR和MaxT的值确定。如果在最近的MaxT秒内发生的重启次数超过MaxR次,那么主管将关闭其监管并死亡的所有子代。 — http://erlang.org/documentation/doc-4.9.1/doc/design_principles/sup_princ.html

消息传递

Erlang进程是完全隔离的,而不是数据共享,它们之间唯一的交换机制是传递消息。从而使内存管理极为有效和高效。

  

每个进程都有自己的输入队列来接收消息。收到的新消息将放入队列的末尾。当进程执行接收时,队列中的第一条消息将与接收中的第一条模式进行匹配。如果匹配,则从队列中除去该消息,并执行与该模式对应的操作。 — http://erlang.org/doc/getting_started/conc_prog.html#message-passing

答案 1 :(得分:3)

处理多个内核上的多个请求的困难之一是,现在您的程序的多个部分同时运行并修改状态。因此,互斥锁来了,您现在必须担心一个函数是否是线程安全的,并管理锁和互斥锁的阻塞/等待/恢复。这意味着您现在有很多潜在的瓶颈,并且可以提高成本并减少(甚至消除)您期望从并发中获得的收益。

Erlang和Elixir具有基于'Actor Model'的并发性。参与者接收消息,并且从这些消息中可以创建新消息,确定如何处理下一条消息,修改其内部状态或创建更多参与者。归结为每个Actor都有自己的状态,因此您不再需要担心锁或互斥锁。这有助于减轻编写并发代码的精神负担,并且作为一种抽象可以更轻松地推断并发性。结果是更有效的并发代码,更易于维护。 actor模型可以用任何语言来实现,但是已经融入到Elixir和Erlang中。

此外,Elixir和Erlang是功能语言。在功能语言中,通常可以避免副作用,即先前方法调用产生的残留状态。这意味着只要您不违反功能纯度,就可以说方法每次都会返回相同的内容。这意味着f(x)+ f(x)== f(x)* 2。这意味着您可以更大程度地并行化事物而无需担心。如果f(x)在功能上是纯函数,则在一个线程上运行f(x)并在另一个线程上运行g(x)不会导致竞争。因为它们都不影响状态。

答案 2 :(得分:1)

我将尝试给出一个简短的答案: Erlang / Elixir 强制使用actor编写异步,非阻塞代码。

您可以将参与者视为“微”微服务。角色具有自己的状态,它们不共享数据(实际上所有变量都是不可变的),因此需要在彼此之间传递异步消息。

Erlang / Elixir拥有自己的虚拟机,可以处理数十万个线程和其他优化(线程不是操作系统线程,但是虚拟/轻量级线程,即使所有变量都是不可变的,虚拟机也可以避免复制内存中的数据,仅在确实需要时才复制数据)

我与其他Actor系统不是最新的,因此我无法确定是否JVM上的Akka将获得类似的性能。 Virtual Actor Systems也许也能够处理很多工作,奥尔良就是这样一个框架。 (可以将虚拟Actor系统与对Actor进行依赖注入进行比较,在需要它们时将其创建,而在不使用它们时将其从内存中删除)https://github.com/dotnet/orleans