erlcloud 两种使用模式深度解析:进程字典 vs 配置对象,如何选择?
2026/8/20 17:24:36 网站建设 项目流程

erlcloud 两种使用模式深度解析:进程字典 vs 配置对象,如何选择?

【免费下载链接】erlcloudAWS APIs library for Erlang (Amazon EC2, S3, SQS, DDB, ELB and etc)项目地址: https://gitcode.com/gh_mirrors/er/erlcloud

erlcloud 是 Erlang 生态中最流行的 AWS API 客户端库(AWS APIs library for Erlang),覆盖 Amazon EC2、S3、SQS、DynamoDB、ELB 等数十个 AWS 服务。对于刚接触 erlcloud 的开发者来说,最容易困惑的问题就是:配置到底应该用configure/2,3还是new/2,3?这两种模式底层有什么区别?生产环境中又该如何选择?本文就带你一次搞清楚 erlcloud 的两种使用模式,并给出可直接套用的选型建议。

一、为什么 erlcloud 会有"两种使用模式"?

翻开 erlcloud 的源码会发现,几乎所有服务模块(如erlcloud_ec2erlcloud_s3erlcloud_sns)都同时导出了两组函数:

  • configure(...)—— 把凭证"存起来",之后调用 API 不用再传配置;
  • new(...)—— 生成一个配置对象,调用 API 时显式传进去。

这个设计源自函数式语言的一个经典取舍:隐式全局状态 vs 显式参数传递。理解这一点,你就掌握了 erlcloud 的命脉。

二、模式一:进程字典模式(configure 一键配置)

这是 erlcloud 最"传统"的用法。以 EC2 为例,只需一行:

erlcloud_ec2:configure("AKIA...", "SecretKey...").

之后所有 API 调用都不需要再带配置:

erlcloud_ec2:describe_images(). erlcloud_s3:list_buckets(). % 同样生效

它的实现原理非常巧妙:configure/2内部只是执行了一次put(aws_config, new(AccessKeyId, SecretAccessKey))(见erlcloud_ec2.erl第 285-293 行),把配置写进了当前 Erlang 进程的进程字典。当你不传配置调用 API 时,底层会通过default_config()get(aws_config)从进程字典里取出来(见erlcloud_aws.erl第 380-385 行)。

优点:代码最简洁,不需要到处传参;适合单账号、单进程的脚本和演示场景。 ⚠️缺点:配置藏在进程字典里,调用时"看不见",容易踩坑;不同进程之间互相隔离,多账号切换时必须反复configure

三、模式二:配置对象模式(new 显式传参)

第二种模式是"把配置当普通数据"来处理:

Config = erlcloud_ec2:new("AKIA...", "SecretKey..."). erlcloud_ec2:describe_images(Config).

这里的Config是一个#aws_config{}record(字段定义在include/erlcloud_aws.hrl),里面不仅包含 AccessKey/SecretKey,还包含各服务的主机地址、端口、协议、区域等默认值。你可以随意修改其中的字段,比如把ec2_host指向自建的 VPC Endpoint,然后传给任意 erlcloud 函数。

优点:显式、可控、无副作用;天然支持多账号、多区域并行;配置对象可复用、可测试,符合函数式编程风格。 ⚠️缺点:每次调用都要多传一个参数,代码稍显啰嗦。

四、一张表看懂两种模式的本质区别

对比维度模式一:进程字典模式二:配置对象
入口函数configure/2,3new/2,3
配置存放位置进程字典(put/get(aws_config)调用栈(函数参数)
调用方式describe_images()describe_images(Config)
多账号支持差,需反复切换好,可同时持有多个
并发安全仅限单进程内无共享状态,天然安全
代码可读性隐式,调用处看不到凭证来源显式,一目了然

核心洞察:两种模式底层是同一套#aws_config{}对象,configure本质上只是"把 new 出来的对象放进了进程字典"。区别只在于配置的传递方式

五、实战选型:什么场景该用哪种模式?

  • 快速试验 / 写脚本 / REPL 调试:用模式一,两行代码跑通 EC2、S3 操作,体验最丝滑。
  • 生产环境单账号:推荐模式二,显式传参让代码可读、可测试,避免进程字典带来的隐式依赖。
  • 多租户、多账号、多区域服务:必须用模式二,为每个账号创建独立 Config 对象并发调用,互不干扰。
  • 混合使用:完全可以。先用configure设默认账号,特殊请求再单独传 Config 覆盖。

另外提醒一点:erlcloud 也支持从环境变量(AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEY)和app.configerlcloud -> aws_config段读取默认配置(见erlcloud_aws.erl第 424-433 行),优先级为:显式传参 > 进程字典 > 应用环境变量 > 系统环境变量。

六、快速上手与常见问题

想亲自体验?克隆仓库即可:

git clone https://gitcode.com/gh_mirrors/er/erlcloud

Q1:configure 之后能用 new 覆盖吗?可以。再次调用configure会重新put覆盖进程字典中的配置。

Q2:进程字典模式在多个进程里共享吗?不共享。Erlang 进程字典是进程私有的,每个进程都要各自configure一次。

Q3:想修改 Config 里的某个字段怎么办?用 record 语法更新即可:Config#aws_config{s3_host = "s3.example.com"}

总结一句话:简单场景用 configure,复杂场景用 new 配置对象。理解了两者"进程字典 vs 显式传参"的本质区别,你就能在 erlcloud 项目中写出既简洁又稳健的 AWS 调用代码。

【免费下载链接】erlcloudAWS APIs library for Erlang (Amazon EC2, S3, SQS, DDB, ELB and etc)项目地址: https://gitcode.com/gh_mirrors/er/erlcloud

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询