将Erlang应用程序模块用于全局变量

balp4ylt  于 2022-12-08  发布在  Erlang
关注(0)|答案(1)|浏览(200)

使用application:get_env / application:set_env动态地保持全局状态有什么缺点吗?
示例:
我有一个处理http请求的模块。我有一个http请求处理程序的集合。我想通过应用程序环境注册/获取http请求处理程序。

start() ->
  % Init default handlers
  application:set_env(?REQUEST_HANDLER_MODULES, [foo_handler, bar_handler]).

add_http_request_handler(Module) ->
  % Register handler at runtime
  Modules = application:get_env(?REQUEST_HANDLER_MODULES),
  application:set_env(?REQUEST_HANDLER_MODULES, [Module|Modules]).

handle_request(Req) ->
  Modules = application:get_env(?REQUEST_HANDLER_MODULES),
  handle_request(Req, Modules, {}).

handle_request(Req, [], Agg) ->
  Agg;
handle_request(Req, [M|L], Agg) ->
  handle_request(Req, L, M:handle(Req, Agg)).

这有什么缺点?
这是否需要在每次提取application:get_env时往返于应用程序进程?
这是函数反模式吗?

13z8s7eq

13z8s7eq1#

如果你需要持久存储,也就是说,在Erlang VM重新启动后保持数据的准确性,我认为你应该使用Mnesia的disc_copies表。根据我的经验,这个表可以很好地处理负载和并发性。

相关问题