erlang - 为什么 Elixir 需要 `Flow` ?这不是默认由 BEAM 处理的吗?

标签 erlang elixir

在看到 José Valim 上次关于 Flow 和 GenStage 的主题演讲后,我感到很困惑,因为:
1) 如果 Flow 和 GenStage 被添加到 Elixir 中,是因为它对于提高并发性确实有意义;
2) 另一方面,我认为 Erlang/BEAM 的一个关键优势是它默认是并发/使用所有内核的,开发人员不应该担心这一点。
因此,如果 Flow 和 GenStage 还不能帮助在不同机器上运行分布式系统,有人可以解释一下 Flow 和原生 Erlang/BEAM 并发之间的区别吗?

最佳答案

FlowGenStage 解决的不仅仅是并发问题。

分布式系统中经常发生的情况是,一旦您轻松实现并发,您最终会遇到“惊群”问题,其中单个进程或一小组进程成为系统中所有其他进程的瓶颈。这个视频很清楚地说明了这个问题。

https://youtu.be/8NPzLBSBzPI

FlowGenStage 的关键概念是系统中的背压,以防止传入请求溢出到工作线程。这种背压概念允许您添加更多 worker 或放慢装配线速度。

这些模块试图概括每个足够大的 BEAM 应用程序都会遇到的自调度问题。其中的想法已经有许多一次性实现,允许 BEAM 应用程序在面对大负载时优雅地失败。

关于erlang - 为什么 Elixir 需要 `Flow` ?这不是默认由 BEAM 处理的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39898157/

相关文章:

file - 如何在 Erlang 中使用通配符 * 检查文件是否存在?

erlang - 在 digraph_utils :is_acyclic/1 returns false 之后查找循环或循环

erlang - 钢筋: "Release mynode uses non existing application mynode"

elixir - 编译错误 - User.__struct__/1 未定义,无法扩展 struct User

erlang - Erlang 中的精度

erlang - 在try catch block 中没有尾部递归代码?

elixir - 如何使用 REPLACE_OS_VARS 设置动态自定义 vm.args 与酒厂?

error-handling - 管道和错误处理

elixir - 使用带有子查询的 Ecto 进行预加载并使用主查询中的联接

elixir - 如何仅确保 Elixir 模块中的某些功能经过身份验证