perf(broker): Optimization for handling bursty traffic
intro. new lock type: 'spawn' of broker.perf.route_lock_type mnesia get lock calls are not optimized for selective receive. hence taking locks would be very expensive while there are tones of messages in the brokers message queue. This optimization run the transaction in a separate process to utilize the selective receive optimization of the compiler.
This commit is contained in:
parent
e9c14df7a3
commit
a4d8ef4f93
|
@ -2110,9 +2110,11 @@ end}.
|
|||
%% key: mnesia translational updates with per-key locks. recommended for single node setup.
|
||||
%% tab: mnesia translational updates with table lock. recommended for multi-nodes setup.
|
||||
%% global: global lock protected updates. recommended for larger cluster.
|
||||
%% spawn: same as `key', but transaction is done in another proc, ideal for handling bursty traffic.
|
||||
%%
|
||||
{mapping, "broker.perf.route_lock_type", "emqx.route_lock_type", [
|
||||
{default, key},
|
||||
{datatype, {enum, [key, tab, global]}}
|
||||
{datatype, {enum, [key, tab, global, spawn]}}
|
||||
]}.
|
||||
|
||||
%%--------------------------------------------------------------------
|
||||
|
|
|
@ -264,7 +264,25 @@ maybe_trans(Fun, Args) ->
|
|||
trans(fun() ->
|
||||
emqx_trie:lock_tables(),
|
||||
apply(Fun, Args)
|
||||
end, [])
|
||||
end, []);
|
||||
spawn ->
|
||||
%% trigger selective receive optimization of compiler,
|
||||
%% ideal for handling busty traffic.
|
||||
Ref = erlang:make_ref(),
|
||||
Owner = self(),
|
||||
{WPid, RefMon} = spawn_monitor(fun() ->
|
||||
Res = trans(Fun, Args),
|
||||
Owner ! {Ref, Res}
|
||||
end),
|
||||
receive
|
||||
{Ref, TransRes} ->
|
||||
receive
|
||||
{'DOWN', RefMon, process, WPid, normal} -> ok
|
||||
end,
|
||||
TransRes;
|
||||
{'DOWN', RefMon, process, WPid, _Info} ->
|
||||
{error, trans_crash}
|
||||
end
|
||||
end.
|
||||
|
||||
-spec(trans(function(), list(any())) -> ok | {error, term()}).
|
||||
|
|
Loading…
Reference in New Issue