Sobes.tech
Назад к вопросам
Senior
3

Как обеспечить эксклюзивное выполнение одного из трёх процессов-воркеров на одном хосте (leader election)?

Компании, где спрашивали
SelectelSelectel

Ответ от нейросети

sobes.tech AI

Для обеспечения эксклюзивного выполнения одного из трёх процессов-воркеров на одном хосте (leader election) можно использовать несколько подходов:

  1. Файловая блокировка (file lock): Один из процессов пытается захватить блокировку на определённом файле. Только процесс с блокировкой становится лидером.

  2. Мьютексы в операционной системе: Использование системных мьютексов или семафоров для синхронизации.

  3. Использование распределённых систем хранения: Например, Redis с командой SETNX, ZooKeeper или Consul для координации лидера.

  4. Встроенные библиотеки: В Go есть библиотеки для leader election, например, используя etcd или Kubernetes leader election API.

Пример с использованием файла для блокировки в Go:

package main

import (
	"fmt"
	"os"
	"syscall"
)

func main() {
	file, err := os.OpenFile("/tmp/leader.lock", os.O_CREATE|os.O_RDWR, 0666)
	if err != nil {
		panic(err)
	}
	defer file.Close()

	// Попытка захватить эксклюзивную блокировку
	err = syscall.Flock(int(file.Fd()), syscall.LOCK_EX|syscall.LOCK_NB)
	if err != nil {
		fmt.Println("Не удалось стать лидером, другой процесс уже лидер")
		return
	}

	fmt.Println("Этот процесс стал лидером")
	// Лидер выполняет свои задачи
	select {} // блокируем процесс
}

Этот код пытается получить эксклюзивную блокировку на файл. Если блокировка получена, процесс становится лидером. Если нет — другой процесс уже лидер.