使用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时往返于应用程序进程?
这是函数反模式吗?
1条答案
按热度按时间13z8s7eq1#
如果你需要持久存储,也就是说,在Erlang VM重新启动后保持数据的准确性,我认为你应该使用Mnesia的
disc_copies
表。根据我的经验,这个表可以很好地处理负载和并发性。