Packages
reckon_db
2.2.0
5.11.0
5.10.4
5.10.3
5.10.1
5.10.0
5.9.1
5.9.0
5.8.3
5.8.2
5.8.1
5.8.0
5.7.0
5.6.1
5.6.0
5.5.5
5.5.4
5.5.3
5.5.2
5.5.1
5.5.0
5.4.0
5.2.2
5.2.1
5.2.0
5.1.0
5.0.0
4.0.0
3.1.2
3.1.1
3.0.0
2.3.7
2.3.6
2.3.5
2.3.4
2.3.3
2.3.2
2.3.1
2.3.0
2.2.2
2.2.0
2.1.4
2.1.3
2.1.2
2.1.1
2.1.0
2.0.0
1.7.7
1.7.6
1.7.5
1.7.4
1.7.3
1.7.2
1.7.1
1.7.0
1.6.3
1.6.2
1.6.1
1.6.0
1.5.1
1.5.0
1.4.5
1.4.4
1.4.3
1.4.2
1.4.1
1.4.0
1.3.3
1.3.2
1.3.1
1.3.0
1.2.7
1.2.6
1.2.5
1.2.4
1.2.3
1.2.2
1.2.1
1.2.0
1.1.1
1.1.0
1.0.3
1.0.2
1.0.1
1.0.0
BEAM-native Event Store built on Khepri/Ra with Raft consensus. Event sourcing, persistent subscriptions, snapshots, and automatic cluster formation via UDP multicast discovery. Ships embedded Rust NIFs for 3-15x acceleration of crypto, hashing, compression, aggregation, filter matching, and grap...
Current section
Files
Jump to
Current section
Files
src/reckon_db_gateway_sup.erl
%% @doc Gateway supervisor for reckon-db
%%
%% Manages a pool of gateway workers that provide the external interface for the
%% event store. Starts last in the supervision hierarchy to ensure the
%% system is fully operational before accepting external requests.
%%
%% == Gateway Worker Pool ==
%%
%% The supervisor starts gateway_pool_size workers (default 1) for load
%% distribution. Each worker registers with reckon-gater independently,
%% allowing round-robin load balancing across all workers.
%%
%% == Gateway Integration ==
%%
%% Gateway workers register themselves with reckon-gater (when available)
%% to enable load-balanced, distributed access to the event store.
%%
%% When reckon-gater is not available, the gateway workers still run
%% locally but are not registered for external load balancing.
%%
%% @author rgfaber
-module(reckon_db_gateway_sup).
-behaviour(supervisor).
-include("reckon_db.hrl").
%% API
-export([start_link/1]).
%% Supervisor callbacks
-export([init/1]).
%%====================================================================
%% API
%%====================================================================
%% @doc Start the gateway supervisor
-spec start_link(store_config()) -> {ok, pid()} | {error, term()}.
start_link(#store_config{store_id = StoreId} = Config) ->
Name = reckon_db_naming:gateway_sup_name(StoreId),
supervisor:start_link({local, Name}, ?MODULE, Config).
%%====================================================================
%% Supervisor callbacks
%%====================================================================
%% @private
-spec init(store_config()) -> {ok, {supervisor:sup_flags(), [supervisor:child_spec()]}}.
init(#store_config{store_id = StoreId, gateway_pool_size = PoolSize} = Config) ->
SupFlags = #{
strategy => one_for_one,
intensity => 15, %% max 15 restarts
period => 60 %% in 60 seconds
},
%% Start gateway worker pool
Children = [gateway_worker_spec(Config, N) || N <- lists:seq(1, PoolSize)],
logger:info("Starting gateway supervisor for store ~p with ~p workers",
[StoreId, PoolSize]),
{ok, {SupFlags, Children}}.
%%====================================================================
%% Internal functions
%%====================================================================
%% @private
-spec gateway_worker_spec(store_config(), pos_integer()) -> supervisor:child_spec().
gateway_worker_spec(#store_config{store_id = StoreId} = Config, WorkerNum) ->
WorkerId = list_to_atom(
atom_to_list(reckon_db_naming:gateway_worker_name(StoreId)) ++
"_" ++ integer_to_list(WorkerNum)
),
#{
id => WorkerId,
start => {reckon_db_gateway_worker, start_link, [Config]},
restart => permanent,
shutdown => 5000,
type => worker,
modules => [reckon_db_gateway_worker]
}.