【发布时间】:2014-07-25 15:26:01
【问题描述】:
我很难找到正确的方法来调用由具有simple_one_for_one 子策略的主管动态创建的 gen_server 实例。我正在尝试将数据访问控制创建为 gen_servers。每个实体都有自己的主管,该主管将根据需要创建 gen_server 实例,以便在数据库上实际执行 CRUD 操作。我了解定义子进程的过程,以及根据需要创建它们的过程。
最初,我的计划是将子创建过程抽象为 gen_server 模块中创建子的自定义函数,使用 gen_server:call() 在该子上触发请求的操作(例如查找、存储、删除),然后返回操作结果返回调用进程。但是,除非我弄错了,否则这将阻止任何其他尝试使用这些函数的进程,直到调用返回。这绝对不是我的想法。
我可能陷入了 OO 模式(我的背景是 Java),但似乎应该有一种干净的方法允许一个模块中的函数获取对子进程的引用,然后在没有泄露那个孩子的内脏。换句话说,我不想在实体主管上调用create_child() 方法,然后让我的应用程序代码针对该子PID(即gen_sever:call(Pid, {find_by_id, Id}))进行gen_server:calls。相反,我希望能够调用更像Child:find_by_id(Id) 的函数。
【问题讨论】:
-
我不清楚为什么要有一个专门的中间进程来访问数据库。如果你只是在客户端进程中执行接口函数(例如
Child:find_by_id(Id))有什么问题?当然在这种情况下 Child 不是适当的模块名称... -
基本思想是为任何可能需要一些时间的操作(例如数据库调用)分离一个进程。 AFAIK,让客户端代码同步调用 user_info:find_by_id(User),其中 user_info 是一个命名模块,会为应用程序造成瓶颈,特别是如果数据库调用在任何时间段内阻塞。在 gen_server 进程中封装数据库访问操作似乎是管理并发访问的合理方法。话虽如此,我是 Erlang 的新手,所以我可能完全脱离了基地。
标签: erlang erlang-otp gen-server