【问题标题】:Adding in-memory state to a web API with genservers使用 genservers 将内存状态添加到 Web API
【发布时间】:2019-07-24 14:06:17
【问题描述】:

我目前正在尝试在 Elixir 中构建一个小型 Web API,它需要一些内存状态。简而言之,用户第一次使用 API 时,他启动了某个业务流程,之后他可以继续进行进一步的 API 调用。

为此,我发现最好的方法是创建一个 GenServer,在其中存储状态,然后通过 PID 让进一步的 API 调用对其进行处理。

在尝试搜索如何 ​​stringify PID 以便在每个 API 调用中返回它时,我发现 this thread 说:

不能保证 PID 在被回收时是唯一的。

所以我的问题是:这种情况下最好的方法是什么?一般是怎么解决的?

【问题讨论】:

  • 不是一个完整的答案,但您可以使用Registry 注册并使用密钥查找进程。

标签: elixir pid gen-server


【解决方案1】:

:erlang.make_ref() 可用于创建唯一标识符:

iex(1)> :erlang.make_ref()
#Reference<0.3918424786.2664955905.32640>

iex(2)> 

(您有不想使用System.unique_integer/1 的原因吗?)

Elixir 文档 mention ReferencePidPort 数据类型,但我在 Elixir 中找不到有关 Reference 类型的任何信息,例如Elixir 是否具有创建引用的本机函数。

对评论的回应

以下是如何在 Elixir 中将引用转换为字符串*:

iex(4)> make_ref() |> inspect()  
"#Reference<0.784388646.1821114370.207624>"

*感谢 Hauleth 在 cmets 中找到 Kernel.make_ref()

这行得通吗?

根据Kernel docs

返回的引用将在大约 2^82 次调用后重新出现; 因此它对于实际用途来说是独一无二的。

【讨论】:

  • 我是 Elixir/OTP 的新手,仅此而已。由于我需要将这些标识符作为字符串在 API 中来回传递,这行得通吗?阅读后,我认为注册System.unique_integer/1 作为 genserver 的名称可能正是我正在寻找的。​​span>
  • 我认为将 System.unique_integer/1 注册为 genserver 的名称 -- 嗯?不要那样做。为什么首先需要将 Ref 转换为字符串?
  • @7stud 也许我没有正确理解如何使用 Genservers。我的意图是为每个 API 连接启动一个不同的连接,这样每个 API 用户都可以通过其唯一的引用访问数据。我不能给他们起名字,因为最终会有冲突——这就是为什么引用的东西。
  • @JavierGarcíaManzano,好的,所以您将使用System.unique_integer返回值 作为服务器名称。没关系。
猜你喜欢
  • 1970-01-01
  • 2015-07-04
  • 2021-03-16
  • 2020-06-27
  • 1970-01-01
  • 1970-01-01
  • 2017-09-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多