Packages
ex_esdb
0.1.7
0.11.0
0.10.0
0.9.0
0.8.0
0.7.8
0.7.7
0.7.6
0.7.5
0.7.4
0.7.3
0.7.2
0.7.1
0.7.0
0.6.1
0.6.0
0.5.1
0.5.0
0.4.8
0.4.7
0.4.6
0.4.5
0.4.4
0.4.3
0.4.2
0.4.1
0.4.0
0.3.3
0.3.2
0.3.1
0.3.0
0.2.5
0.2.4
0.2.3
0.2.2
0.2.1
0.2.0
0.1.7
0.1.6
0.1.5
0.1.4
0.1.3
0.1.2
0.1.1
0.1.0
0.0.20
0.0.19
0.0.18
0.0.17
0.0.16
0.0.15
0.0.14-alpha
0.0.13-alpha
0.0.12-alpha
0.0.11-alpha
0.0.10-alpha
0.0.9-alpha
0.0.8-alpha
0.0.6-alpha
0.0.5-alpha
0.0.4-alpha
0.0.3-alpha
0.0.2-alfa
0.0.1-alfa
ExESDB is a reincarnation of rabbitmq/khepri, specialized for use as a BEAM-native event store.
Current section
Files
Jump to
Current section
Files
lib/ex_esdb/gateway_system.ex
defmodule ExESDB.GatewaySystem do
@moduledoc """
Supervisor for gateway components providing external interface.
This supervisor manages a pool of gateway workers for high availability
and load distribution.
Components:
- GatewayWorkers: Pool of GatewayWorkers via PartitionSupervisor
- PubSub: External communication (conditional)
"""
use Supervisor
alias ExESDB.Themes, as: Themes
@impl true
def init(opts) do
gateway_pool_size = Keyword.get(opts, :gateway_pool_size, 1)
children =
[
{PartitionSupervisor,
child_spec: {ExESDB.GatewayWorker, opts},
name: ExESDB.GatewayWorkers,
partitions: gateway_pool_size},
add_pub_sub(opts)
]
# Remove nil entries
|> Enum.filter(& &1)
IO.puts(
"#{Themes.gateway_supervisor(self(), "GatewaySystem is UP with #{gateway_pool_size} workers")}"
)
# Use :one_for_one because components are independent
Supervisor.init(children,
strategy: :one_for_one,
max_restarts: 15,
max_seconds: 60
)
end
defp add_pub_sub(opts) do
pub_sub = Keyword.get(opts, :pub_sub)
case pub_sub do
nil ->
add_pub_sub([pub_sub: :native] ++ opts)
:native ->
{ExESDB.PubSub, opts}
pub_sub ->
# Use PubSubManager to conditionally start Phoenix.PubSub
case BCUtils.PubSubManager.maybe_child_spec(pub_sub) do
nil ->
# PubSub already running, create a dummy child
%{
id: :dummy_pubsub,
start: {Task, :start_link, [fn -> :ok end]},
restart: :temporary
}
child_spec ->
child_spec
end
end
end
def start_link(opts) do
Supervisor.start_link(__MODULE__, opts, name: __MODULE__)
end
def child_spec(opts) do
%{
id: __MODULE__,
start: {__MODULE__, :start_link, [opts]},
restart: :permanent,
shutdown: :infinity,
type: :supervisor
}
end
end