Documentation
¶
Index ¶
- type FilterFunc
- func AvailableRoleFilter(role domain.Role) FilterFunc
- func HostFilter(host string) FilterFunc
- func IdFilter(id uuid.UUID) FilterFunc
- func NameFilter(name string) FilterFunc
- func NotRoleFilter(role domain.Role) FilterFunc
- func RoleFilter(role domain.Role) FilterFunc
- func StatusFilter(status domain.Status) FilterFunc
- type Manager
- type Me
- type Peer
- type Replica
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
This section is empty.
Types ¶
type FilterFunc ¶
FilterFunc — функция-предикат для фильтрации реплик.
Принимает Replica и возвращает true, если реплика удовлетворяет условию. Используется в Manager.Filter() для выборки реплик по различным критериям.
func AvailableRoleFilter ¶
func AvailableRoleFilter(role domain.Role) FilterFunc
AvailableRoleFilter возвращает фильтр по доступной роли реплики.
Возвращает true, если реплика МОЖЕТ выполнять указанную роль (из конфига). Используется для поиска кандидатов на роль мастера.
Отличие от RoleFilter: RoleFilter проверяет текущую роль, а AvailableRoleFilter — потенциальную возможность.
func HostFilter ¶
func HostFilter(host string) FilterFunc
HostFilter возвращает фильтр по хосту реплики.
func NameFilter ¶
func NameFilter(name string) FilterFunc
NameFilter возвращает фильтр по имени реплики.
func NotRoleFilter ¶
func NotRoleFilter(role domain.Role) FilterFunc
NotRoleFilter возвращает фильтр по отсутствию роли у реплики.
Возвращает true, если реплика НЕ имеет указанную роль. Используется для поиска реплик без определённой роли (например, все слейвы).
func RoleFilter ¶
func RoleFilter(role domain.Role) FilterFunc
RoleFilter возвращает фильтр по текущей роли реплики.
Возвращает true, если реплика имеет указанную роль в текущий момент. Используется для поиска реплик с определённой ролью (например, все мастера).
func StatusFilter ¶
func StatusFilter(status domain.Status) FilterFunc
StatusFilter возвращает фильтр по статусу реплики.
Особенности:
- Для Peer проверяет реальный статус (GetStatus())
- Для Me всегда возвращает true, если статус Ready или Connection
- Для других статусов возвращает false
Это позволяет учитывать текущую реплику как всегда готовую, даже если она ещё не до конца синхронизировалась.
type Manager ¶
type Manager interface {
// OnChangeMaster возвращает emitter для событий смены мастера.
//
// Событие генерируется при:
// - Выборе нового мастера
// - Потере мастера (если он отключился)
OnChangeMaster() emitter.Emitter[Replica]
// OnMasterCandidateConnect возвращает emitter для событий появления
// нового кандидата на роль мастера.
//
// Событие генерируется, когда реплика с ролью Master в AvailableRoles
// переходит в статус Ready.
OnMasterCandidateConnect() emitter.Emitter[Peer]
// OnMasterDisconnection возвращает emitter для событий отключения мастера.
//
// Событие генерируется, когда реплика с ролью Master переходит
// в статус Disconnection.
OnMasterDisconnection() emitter.Emitter[Peer]
// OnAddPeer возвращает emitter для событий добавления новой реплики.
OnAddPeer() emitter.Emitter[Peer]
// OnDeletingPeer возвращает emitter для событий удаления реплики.
OnDeletingPeer() emitter.Emitter[Peer]
// OnClusterReady возвращает emitter для событий готовности кластера.
//
// Событие генерируется, когда все реплики кластера находятся в статусе Ready.
// Это сигнал, что кластер полностью работоспособен.
OnClusterReady() emitter.Emitter[set.Set[Replica]]
// OnClusterSick возвращает emitter для событий "болезни" кластера.
//
// Событие генерируется, когда не все реплики кластера находятся в статусе Ready.
// Это сигнал, что кластер не полностью работоспособен.
OnClusterSick() emitter.Emitter[set.Set[Replica]]
// Me возвращает текущую (локальную) реплику.
Me() Me
// Master возвращает текущего мастера кластера.
//
// Если мастер не выбран, возвращает nil.
Master() Replica
// Slaves возвращает все реплики, не являющиеся мастером.
Slaves() set.Set[Replica]
// AddPeer добавляет новую реплику в кластер.
//
// Возвращает ошибку, если реплика с таким Host уже существует.
AddPeer(Peer) error
// RemovePeer удаляет реплику из кластера.
RemovePeer(Peer) error
// AllReplicas возвращает все реплики кластера (включая Me).
AllReplicas() set.Set[Replica]
// AllPeers возвращает все удалённые реплики (без Me).
AllPeers() set.Set[Peer]
// Filter возвращает реплики, удовлетворяющие условию фильтра.
//
// Пример:
// readyReplicas := manager.Filter(StatusFilter(domain.Ready))
Filter(FilterFunc) set.Set[Replica]
// GetPeerHosts возвращает множество хостов всех реплик (включая Me).
GetPeerHosts() set.Set[string]
}
Manager — основной интерфейс для управления кластером.
Manager является центральным компонентом, который:
- Хранит информацию обо всех репликах кластера
- Управляет добавлением и удалением реплик
- Отслеживает состояние мастера
- Генерирует события при изменениях в кластере
Используется во всех компонентах кластера для получения информации о состоянии кластера и для управления им.
Пример использования:
manager.OnChangeMaster().Subscribe(func(ctx context.Context, replica Replica) {
log.Printf("New master: %s", replica.GetHost())
})
type Me ¶
type Me interface {
Replica
// OnChangeScore возвращает emitter, который генерирует события при изменении Score.
//
// Используется для уведомления других компонентов (например, Manager)
// об изменении веса реплики.
OnChangeScore() emitter.Emitter[Me]
// GetTimeStart возвращает время запуска реплики.
// Используется для вычисления uptime (время жизни).
GetTimeStart() time.Time
// SetScore устанавливает новый вес реплики.
//
// Score влияет на выборы лидера: чем выше Score, тем больше шансов стать мастером.
// Может меняться динамически в зависимости от нагрузки.
SetScore(float32)
// GetMeta возвращает метаданные реплики.
//
// Включает: ID, Name, Host, TimeStart, AvailableRoles, Roles.
// Используется для обмена информацией между репликами.
GetMeta() *domain.Meta
// GetState возвращает текущее состояние реплики.
//
// Включает: Score, Resource, Roles.
// Используется для синхронизации состояния между репликами.
GetState() *domain.State
// AddRoles добавляет несколько ролей текущей реплике.
//
// При изменении ролей генерируется событие OnChangeRole().
AddRoles(roles set.Set[domain.Role])
// AddRole добавляет одну роль текущей реплике.
AddRole(role domain.Role)
// RemoveRoles удаляет несколько ролей у текущей реплики.
RemoveRoles(roles set.Set[domain.Role])
// RemoveRole удаляет одну роль у текущей реплики.
RemoveRole(role domain.Role)
}
Me — интерфейс для представления текущей (локальной) реплики.
Me расширяет интерфейс Replica, добавляя методы для управления состоянием текущего узла кластера.
Основные возможности:
- Изменение ролей (AddRole, RemoveRole)
- Изменение веса (SetScore)
- Получение метаданных и состояния (GetMeta, GetState)
- Подписка на изменение веса (OnChangeScore)
Используется в:
- Manager — для получения информации о текущей реплике
- Election — для изменения ролей при выборах
- Discovery — для определения, является ли реплика мастером
type Peer ¶
type Peer interface {
Replica
// OnChangeStatus возвращает emitter для событий изменения статуса соединения.
//
// Событие генерируется при переходе между статусами:
// Disconnection -> Connection -> Ready
OnChangeStatus() emitter.Emitter[Peer]
// OnChangeAvailableRoles возвращает emitter для событий изменения
// доступных ролей реплики.
//
// Событие генерируется, когда обновляются метаданные реплики
// (например, при получении нового Meta через gRPC).
OnChangeAvailableRoles() emitter.Emitter[Peer]
// GetStatus возвращает текущий статус соединения с репликой.
//
// Возможные значения: Disconnection, Connection, Ready.
GetStatus() domain.Status
// GetGrpcConnection возвращает gRPC-соединение к реплике.
//
// Соединение создаётся лениво (при первом вызове) и кэшируется.
// Возвращает ошибку, если соединение не может быть установлено.
GetGrpcConnection() (grpc.ClientConnInterface, error)
}
Peer — интерфейс для удалённой реплики.
Peer расширяет интерфейс Replica, добавляя функциональность для работы с удалёнными репликами.
Основные отличия от Me:
- Имеет статус соединения (GetStatus)
- Предоставляет gRPC-соединение (GetGrpcConnection)
- Генерирует события при изменении статуса (OnChangeStatus)
- Генерирует события при изменении доступных ролей (OnChangeAvailableRoles)
type Replica ¶
type Replica interface {
// OnChangeRole возвращает emitter для событий изменения ролей реплики.
//
// Событие генерируется, когда меняется набор ролей реплики
// (например, при выборах или при добавлении/удалении ролей вручную).
OnChangeRole() emitter.Emitter[Replica]
// GetId возвращает уникальный идентификатор реплики (UUID).
GetId() uuid.UUID
// GetHost возвращает сетевой адрес реплики (host:port).
GetHost() string
// GetName возвращает человекочитаемое имя реплики.
GetName() string
// GetUptime возвращает время работы реплики с момента запуска.
GetUptime() time.Duration
// GetScore возвращает вес реплики для выборов.
//
// Чем выше Score, тем больше шансов стать мастером.
// Score может меняться динамически через Me.SetScore().
GetScore() float32
// GetResource возвращает информацию об использовании ресурсов (CPU, Memory).
//
// Используется для учёта нагрузки при выборах лидера.
GetResource() *linker.Linker[resource.Type, *resource.Resource]
// GetAvailableRoles возвращает роли, которые реплика МОЖЕТ выполнять.
//
// Это статическая информация из конфигурации.
GetAvailableRoles() set.Set[domain.Role]
// GetRoles возвращает роли, которые реплика ВЫПОЛНЯЕТ в данный момент.
//
// Это динамическая информация, которая меняется при выборах.
GetRoles() set.Set[domain.Role]
// IsMe возвращает true, если реплика является текущей (локальной).
IsMe() bool
}
Replica — базовый интерфейс для любой реплики кластера.
Это общий контракт, который реализуют как Me (локальная реплика), так и Peer (удалённая реплика).
Предоставляет доступ к основным характеристикам реплики:
- Идентификация (Id, Name, Host)
- Состояние (Roles, Score, Resource)
- Время жизни (Uptime)
- События (OnChangeRole)