我的想法是将ETs用作我的Genserver状态的临时缓存。
例如,当我重新启动申请时,Genserver状态应运输到ETS,当应用程序再次启动时,Genserver应该能够从那里获得状态。
我想保持简单,因此,Genserver的所有状态(地图(应进行一次条目。入口尺寸有限制吗?
另一种方法是,只需创建一个文件,并在需要时再次加载。也许这甚至更好/更简单,但我不确定:(
在ETS表的情况下,该应用程序可以从完全其他主机开始,然后连接到缓存节点(ETS(。
这肯定可以通过多种方式完成。您可以拥有一个单独的商店,例如Mnesia(Hood下的ETS(,Redis或一个普通数据库。在后两种情况下,您需要将Genserver状态施加到字符串中并分别进行::erlang.term_to_binary
和:erlang.binary_to_term
。
如果您正在处理需要以这种方式缓存的多个Genserver流程,例如每个Genserver都代表一个唯一的客户推车,然后可以将唯一标识符用作存储状态的关键,然后可以在以后检索该状态。当您在负载均衡器后面的多个节点上运行购物应用程序时,这一点特别有用,而客户的每个新请求都可以将" round Robin" ned围绕到任何随机节点。
当请求进来时:
- 以一种或另一种方式获取属于该客户的唯一标识符,
- 从任何地方获取存储的内容(Mnesia/redis/...(,
- 产生一个新的Genserver过程,该过程用该存储的内容初始化,
- 执行该请求所需的各种操作,
- 将最新的修改后的Genserver购物车存储到Redis/Mnesia/Why Wery
- 拆除Genserver和
- 使用所需数据的任何数据响应该请求。
基于我在本地的ETS
与Redis
的基准测试,ETS
是更具性能的方法,但是如果您不想打扰旋转一个,则弹性epply是一种很棒的选择专用的Mnesia商店。
如果它与需要运行的特定Genserver有关的情况,那么您最有可能查看故障转移而不是管理单个用户请求。
在这种情况下,您可以考虑使用以下内容:https://hexdocs.pm/elixir/genserver.html#c: terminate/2以使状态首先持续到某个商店,并在您的初始化中使Genserver成为GenServer首先在该商店中查看并相应地重复使用缓存。
复杂的事情是在您运行多个应用程序的情况下,您将使用哪个键来使崩溃的应用程序以正确的状态重新定位Genserver?
这里有几个开放性的问题围绕着您的确切用例展开,但是到目前为止所介绍的内容应该使您有一个公平的想法,即何时使用此缓存解决方案以及如何开始实施它。