Elixir 并发编程与数据持久化:从理论到实践
1. 并行编程需谨慎
Elixir 在运行并行进程方面能力强大,能轻松发起数千个并发请求。但事物皆有两面性,这种强大能力也可能带来问题。程序并非孤立存在,它们会与数据库、外部 API 等其他程序交互。当并行请求过多时,程序可能不堪重负,比如耗尽数据库连接池或使下游 API 服务崩溃。
为避免此类问题,需控制系统中的并行度。像 Ecto 和 Oban 等库,都对并行进程数量做了限制,以防止系统过载。若系统性能足够,可提高限制;若资源有限,则降低限制。
内置库(如 Task)和函数(如 spawn/1)能创建一次性并行进程,但如果不加控制,很容易意外创建过多并发进程,导致不良后果。建议使用普通 GenServers 或借助 Oban 构建数据管道,以更好地控制应用的并行度。
2. 构建城市而非摩天大楼
传统应用开发模式,尤其是 Web 应用,多为单栈式。应用从入口点(如 Web 请求、CLI 命令、后台任务等)开始,在单个栈或进程中执行代码以实现目标。这种模式在 Ruby 社区颇为常见,虽有优点,但也存在不足。例如,为优化成本而将 Web 服务和后台任务部署在一起较为困难,且几乎无法创建能在整个应用中共享的内存数据结构。
BEAM 进程的特性为应用开发带来了全新模式。应用入口点不变,但不再局限于单栈。我们可以构建由多个子系统组成的应用,每个子系统都有自己的 API,供应用其他部分调用。每个子系统有独立的栈、垃圾回收机制和错误处理方式,且都作为大应用的一部分部署,从而降低了整体复杂度。
可以将传统单栈式编程模式比作摩天大楼,从底部入口进入,到达顶部后再从
超级会员免费看
订阅专栏 解锁全文
45

被折叠的 条评论
为什么被折叠?



