精华帖 (15) :: 良好帖 (1) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2009-05-27
最后修改:2009-11-24
并发和顺序是一个令人纠结的问题。 引用
caller 1 (scheduler_id 3) -\ /------|- process_1 |\ \/ \ caller 2 (scheduler_id 1) --/ \ /--|- process_2 |-- \ / process supervisor(simple_one_for_one) caller 3 (scheduler_id 4) -\ / \----|- process_3 |-- \/ / caller 4 (scheduler_id 2) _/ \____|- process_4 |/ (直接映射)
就是下面这个module完整代码 -module(gen_server_cter). -behaviour(supervisor). -export([start_link/3]). -export([cast/2, call/2]). %% for supervisor -export([init/1]). -export([behaviour_info/1]). -spec behaviour_info(atom()) -> 'undefined' | [{atom(), byte()}]. behaviour_info(callbacks) -> [{get_name,1}]; behaviour_info(_Other) -> undefined. %% @doc start the server start_link(CterName, CbMod, Args) -> Ret = {ok, _Pid} = supervisor:start_link({local, CterName}, ?MODULE, [{callback, CbMod}, {args, Args}]), %io:format("pid:~p~n", [_Pid]), N = erlang:system_info(schedulers), [{ok, _} = supervisor:start_child(CterName, [{index, I}]) || I <- lists:seq(1, N)], Ret. cast(CbMod, Req) -> Handler = select_handler(CbMod), %io:format("handler is:~p~n", [Handler]), gen_server:cast(Handler, Req). call(CbMod, Req) -> Handler = select_handler(CbMod), gen_server:call(Handler, Req). %% %% supervisor callbacks %% init([{callback, CbMod}, {args, Args} | _]) -> Strategy = {simple_one_for_one, 10, 10}, Mod = {undefined, {CbMod, start_link, Args}, permanent, 3000, worker, [CbMod]}, {ok, {Strategy, [Mod]}}. %% internal API select_handler(CbMod) -> I = erlang:system_info(scheduler_id), CbMod:get_name(I).
update(2009.11.24): 在callback模块中,需要做一些小改动,需要添加一个export函数: get_name(N :: integer()) -> atom(). 返回此server对应的name
还需要修改start_link为: start_link({index, I}) -> .... 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2009-05-27
用法应该是
gen_server_cter:start_link(my_module_group, my_module, Args) gen_server_cter:cast(my_module, Req) gen_server_cter:call(my_module, Req) 而不是 gen_server_cter:start_link(my_module_group, my_module, Args) gen_server_cter:cast(my_module_group, Req) gen_server_cter:call(my_module_group, Req) |
|
返回顶楼 | |
发表时间:2009-05-27
chaoslawful 写道 用法应该是Java代码 gen_server_cter:start_link(my_module_group, my_module, Args) gen_server_cter:cast(my_module, Req) gen_server_cter:call(my_module, Req) gen_server_cter:start_link(my_module_group, my_module, Args) gen_server_cter:cast(my_module, Req) gen_server_cter:call(my_module, Req) 而不是Java代码 gen_server_cter:start_link(my_module_group, my_module, Args) gen_server_cter:cast(my_module_group, Req) gen_server_cter:call(my_module_group, Req) gen_server_cter:start_link(my_module_group, my_module, Args) gen_server_cter:cast(my_module_group, Req) gen_server_cter:call(my_module_group, Req) 谢谢呵呵。疏忽哈。 |
|
返回顶楼 | |
发表时间:2009-05-28
性能提升了,有个问题还是没解决:处理能力问题应该有适当的流量(请求)控制,否则一个短时的高峰就可能把它挂掉,高峰过后服务也没办法快速恢复。
|
|
返回顶楼 | |
发表时间:2009-05-28
qiezi 写道 性能提升了,有个问题还是没解决:处理能力问题应该有适当的流量(请求)控制,否则一个短时的高峰就可能把它挂掉,高峰过后服务也没办法快速恢复。 恩,现在没有有效的流量控制,如果突然出现异常,系统还是会不堪重负 现在只是各部分比较协调. |
|
返回顶楼 | |
发表时间:2009-06-03
我的建议是,分布到多台服务器,减轻压力
或者在同一服务器上拷贝多个服务 这样的代码改动最小 |
|
返回顶楼 | |
发表时间:2009-06-05
美洲豹 写道 我的建议是,分布到多台服务器,减轻压力
或者在同一服务器上拷贝多个服务 这样的代码改动最小 你的建议没明白问题在哪里 |
|
返回顶楼 | |
浏览 3580 次