我正在使用Erlang开发一个Web服务。低延迟是一个目标。该服务提供了一组文件的多个视图。构建这些视图需要时间,因为我必须读入文件,将它们解析为CSV,将它们的字段存储在记录中等。
天真的方法是重新读取这些文件并对每个请求进行必要的转换,因此Web应用程序完全是无状态的。但我担心延迟。
另一种方法是创建一个服务器(实现gen_server
行为),在启动时准备这些视图并将它们作为LoopData
存储在内存中,然后根据需要将视图返回给Web工作者。但这会降低并发性,因为此服务器一次处理一个请求。
Erlang中是否有一个设计模式支持在启动时进行一些昂贵的初始化,但是允许并发访问初始化数据? (关键是这些数据是不可变的,所以我不关心互斥。)
答案 0 :(得分:3)
您可以使用一个或多个ETS表来保存数据。
在初始化阶段填充表,然后从中读取每个进程。
您可以将初始化和从表中读取抽象为模块,以确保您可以稍后切换实现(例如稍后使用mnesia或其他内容)。
请注意,ETS表位于内存中(默认情况下),如果您需要更复杂的查询,则有mnesia。
答案 1 :(得分:2)
1.生成xx.csv到xx.erl
2.complie xx.erl to xx.beam
3.run erl
4。
request(From, SomeKey) ->
spawn(fun() ->
Reply = xx:get(SomeKey),
to_reply(From, Reply)
end).