使用 genservers 将内存状态添加到 Web API

Adding in-memory state to a web API with genservers

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

为此,我发现最好的方法是创建一个 GenServer,将状态存储在那里,然后通过 PID 进行进一步的 API 调用。

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

PIDs aren't guaranteed to be unique as they get recycled.

所以我的问题是:这种情况的最佳方法是什么?通常如何解决?

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

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

iex(2)> 

(您有什么理由不想使用 System.unique_integer/1 吗?)

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

回复评论

以下是在 Elixir 中将引用转换为字符串*的方法:

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

*在找到 Kernel.make_ref().

的评论中归功于 Hauleth

would that work?

根据 Kernel docs:

The returned reference will re-occur after approximately 2^82 calls; therefore it is unique enough for practical purposes.