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

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

最佳答案

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

例如,假设我有一个实现为GenServer的UserService模块,它具有5个操作:createshowindexupdatedelete。让我们进一步假设我将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子句。主要结论是,即使仅定义了几个“函数”,您也可以根据需要定义该函数的子句,并且模式匹配将分派到正确的子句。

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

10-10 17:19