据某erlang大牛说,erlang project里90%的module都是gen_server
RabbitMQ重新实现了gen_server -> gen_server2。 很多Module都是用了这个behavior。
我们首先来看下OTP里gen_server 的实现:
gen_server的启动入口是gen_server:start_link,一个以gen_server为behavior的Module,例如frontend call gen_server:start_link( node_manager)来启动node_manager这个gen_server.
gen_server:start_link启动一个进程,执行gen_server:init_it。
gen_server:init_it做了三件事:
1. 调用node_manager:init
2. send ack to frontend
3. start loop
loop
先比较gen_server和gen_server2的loop
gen_server loop是receive一个message,处理这个message,再去receive下一个message,没有message时就block在那里。
message一般是三种来源:
1. frontend 的gen_server:call 由 node_manager: handle_call来处理, 会有r