gpt4 book ai didi

elixir - 在 Phoenix 应用程序中提取微服务 : Genserver

转载 作者:行者123 更新时间:2023-12-02 08:50:13 30 4
gpt4 key购买 nike

我正在阅读this关于如何从现有的phoenix应用程序中提取微服务的文章。作者重构了 phoenix 应用程序 Controller 之一,并将其​​方法之一移至 Genserver,之后将该 Genserver 移至单独的应用程序,并将其添加为主项目中的依赖项。

但是我在这里有点困惑,因为 GenServer 只允许您有两个服务器回调(分别是句柄调用和句柄转换)。但是,如果我希望将某个功能作为微服务移出,我们最终会创建与该服务涉及的端点一样多的 Genserver,因为单个 genserver 将允许一/两个方法调用。genserver 是提取服务的理想方法吗?

最佳答案

GenServer 有 3 个主要回调:handle_casthandle_callhandle_info。每个函数都可以有多个子句,每个子句实现一个特定的功能。

例如,假设我有一个作为 GenServer 实现的 UserService 模块,有 5 个操作:createshow索引更新删除。我们进一步假设我将 delete 实现为异步操作(因此使用 handle_cast),并将其余操作实现为同步操作(使用 handle_call) .

def handle_call({:create, user_data}, _from, state) do
new_user = User.create(user_data) // (However you create a user)
{:reply, new_user, state}
end

def handle_call(:index, _from, state) do
users = User.all
{:reply, users, state}
end

def handle_call({:update, user_changes}, _from, state) do
updated_user = User.update(user_changes)
{:reply, updated_user, state}
end

def handle_call({:show, user_id}, _from, state) do
user = User.get(user_id)
{:reply, user, state}
end

def handle_cast({:delete, user_id}, state) do
User.delete(user_id)
{:no_reply, state)
end

客户端模块可以调用user = GenServer.call(pid, {:show, user_id})来使用show子句。主要要点是,即使只定义了几个“函数”,您也可以根据需要定义该函数的任意多个子句,并且模式匹配将分派(dispatch)到正确的子句。

关于elixir - 在 Phoenix 应用程序中提取微服务 : Genserver,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35726303/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com