我正在阅读this有关如何从现有的phoenix应用程序中提取微服务的文章。作者重构了一个phoenix应用程序控制器,并将其方法之一移至Genserver,之后将其移至单独的应用程序,并在主项目中添加了依赖项。
但是我在这里有点困惑,因为GenServer只允许您有两个服务器回调(分别是handle call和handle cast)。但是,如果我想让某个功能作为微服务而存在,我们最终将创建与该服务所涉及的端点一样多的Genserver,因为单个genserver将允许一/两个方法调用。
genserver是提取服务的理想方法吗?
最佳答案
GenServer具有3个主要的回调:handle_cast
,handle_call
和handle_info
。这些功能中的每一个都可以具有多个子句,每个子句都实现特定的功能。
例如,假设我有一个实现为GenServer的UserService
模块,它具有5个操作:create
,show
,index
,update
和delete
。让我们进一步假设我将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/