Packages
ex_esdb
0.2.5
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/core_system.ex
defmodule ExESDB.CoreSystem do
@moduledoc """
Critical infrastructure supervisor that manages core ExESDB components.
This supervisor uses :one_for_all strategy because these components are
tightly coupled and must restart together to maintain consistency.
Startup order:
1. PersistenceSystem: Manages streams, snapshots, and subscriptions (foundation)
2. NotificationSystem: Manages leadership and event emission (depends on persistence)
3. StoreSystem: Manages store lifecycle and clustering (depends on persistence & notification)
The NotificationSystem includes:
- LeaderSystem: Leadership responsibilities and subscription management
- EmitterSystem: Event emission and distribution
This ensures that leadership and event distribution are core capabilities
available in both single-node and cluster modes.
"""
use Supervisor
alias ExESDB.Themes, as: Themes
alias ExESDB.StoreNaming
@impl true
def init(opts) do
children = [
{ExESDB.PersistenceSystem, opts},
{ExESDB.NotificationSystem, opts},
{ExESDB.StoreSystem, opts}
]
IO.puts(Themes.core_system(self(), "is UP"))
# Use :one_for_all because these components are interdependent
Supervisor.init(children,
strategy: :one_for_all,
max_restarts: 3,
max_seconds: 60
)
end
def start_link(opts) do
store_id = StoreNaming.extract_store_id(opts)
name = StoreNaming.genserver_name(__MODULE__, store_id)
Supervisor.start_link(__MODULE__, opts, name: name)
end
def child_spec(opts) do
store_id = StoreNaming.extract_store_id(opts)
%{
id: StoreNaming.child_spec_id(__MODULE__, store_id),
start: {__MODULE__, :start_link, [opts]},
restart: :permanent,
shutdown: :infinity,
type: :supervisor
}
end
end