election

package
v1.0.0-rc1 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jun 23, 2026 License: MIT Imports: 15 Imported by: 0

Documentation

Overview

Package election реализует алгоритм выборов лидера.

Алгоритм состоит из двух фаз:

  1. AgeSync — синхронизация "возраста" (term) между репликами
  2. Vote — голосование за кандидата

Это упрощённая версия Raft, оптимизированная для 10-20 реплик.

Index

Constants

This section is empty.

Variables

View Source
var Component = compogo.Component{
	Name: "cluster.election",
	Dependencies: compogo.Components{
		&runner.Component,
		&election.Component,
	},
	Init: compogo.StepFunc(func(container compogo.Container) error {
		return container.Provide(NewElection)
	}),
	PreExecute: compogo.StepFunc(func(container compogo.Container) error {
		return container.Invoke(func(m cluster.Manager, e *Election) {

			m.OnAddPeer().Subscribe(e.onAddPeer)
			m.OnDeletingPeer().Subscribe(e.onDeletingPeer)
			m.OnMasterDisconnection().Subscribe(e.onMasterDisconnection)
			m.OnMasterCandidateConnect().Subscribe(e.onMasterCandidateConnect)
			m.OnChangeMaster().Subscribe(e.onChangeMaster)
		})
	}),
}

Component — компонент Compogo для выборов.

Жизненный цикл компонента:

  1. Init — регистрирует конструктор NewElection в DI-контейнере.
  2. PreExecute — подписывается на события Manager.

Подписки:

  • OnAddPeer — создаёт gRPC-клиент для новой реплики.
  • OnDeletingPeer — удаляет gRPC-клиент при удалении реплики.
  • OnMasterDisconnection — запускает выборы при отключении мастера.
  • OnMasterCandidateConnect — запускает выборы при появлении нового кандидата.
  • OnChangeMaster — запускает выборы, если мастер не выбран.

Election — это одна из самых важных частей кластера. Без него нельзя гарантировать, что в кластере всегда есть мастер.

Functions

This section is empty.

Types

type Election

type Election struct {
	// contains filtered or unexported fields
}

Election — основной оркестратор выборов.

Координирует фазы AgeSync и Vote, используя Runner для выполнения как отдельной задачи.

Жизненный цикл выборов:

  1. Инициируется через RunVote().
  2. Запускается как задача в Runner (Process).
  3. Выполняется фаза AgeSync.
  4. Выполняется фаза Vote.
  5. Победитель становится мастером.

func NewElection

func NewElection(
	config *election.Config,
	m cluster.Manager,
	runner runner.Runner,
	logger compogo.Logger,
) *Election

NewElection создаёт новый объект выборов.

func (*Election) AddBulletin

func (e *Election) AddBulletin(peerHost string, b *domain.Bulletin) *domain.Bulletin

AddBulletin — добавляет голос от другой реплики.

func (*Election) AgeSync

func (e *Election) AgeSync(peerHost string, term uint64) uint64

AgeSync — вызывается через gRPC для синхронизации term.

При получении term от другой реплики запускает новые выборы. Это позволяет оперативно реагировать на изменения в кластере.

func (*Election) Close

func (e *Election) Close() error

Close — отменяет текущий процесс выборов при завершении приложения.

func (*Election) Name

func (e *Election) Name() string

Name — идентификатор для Runner.

func (*Election) Process

func (e *Election) Process(ctx context.Context) error

Process — основной цикл выборов (запускается как задача Runner).

Алгоритм:

  1. Сброс состояния (снимаем роль Master, сбрасываем age и vote).
  2. Фаза AgeSync — синхронизация term.
  3. Фаза Vote — голосование.
  4. Победитель становится мастером.

func (*Election) RunVote

func (e *Election) RunVote()

RunVote — запускает процесс выборов, если он ещё не активен.

Проверяет:

  • Есть ли кандидаты с ролью Master в AvailableRoles.
  • Не запущены ли уже выборы (через runner.HasProcess).
  • Не возникла ли ошибка при запуске.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL