Новое:Talanto осенью: фильтры с числами, отклик по шагам и каталог компаний

+1 199новых вакансий за сутки·93 838вакансий открыто сейчас·Новое:Talanto осенью: фильтры с числами, отклик по шагам и каталог компаний

Новые вакансии в TelegramРаботодателям
Talanto
Вакансии
Компании7 273
РезюмеAIПодготовкаСтатьи
BoostТарифыBoost
Войти

Не нашли подходящее?

Пусть нужная вакансия найдёт вас сама.

  1. Подборка в TelegramНовые вакансии по вашему фильтру — сразу в бота.Подключить
  2. Мэтчи по резюмеЗагрузите резюме — покажем, где вы подходите лучше всего.Загрузить
  3. Сохранить фильтрНастройте поиск один раз и возвращайтесь к новым вакансиям.Настроить
Что нового на TalantoTalanto осенью: фильтры с числами, отклик по шагам и каталог компаний

Для работодателей

Опубликуйте вакансию — отклики придут в ваш кабинет.

  1. Вакансиябесплатно
  2. Откликиконтакты бесплатно
  3. Наймэтапы и интервью

40 компаний публикуют вакансии напрямую · 4 409 кандидатов открыты к предложениям

Разместить вакансию

Популярные направления

Все подборки
  • Python17 222
  • Облачные технологии14 171
  • QA вакансии3 456
  • Backend вакансии2 114
  • Инженер данных1 801
  • Продакт-менеджер1 247

Разработка

  • Android1 858
  • iOS1 698
  • Fullstack вакансии997
  • AI вакансии955
  • Frontend вакансии755
  • Mobile вакансии44

По стеку

  • Go8 752
  • Java6 593
  • Node.js2 036
  • .NET1 739
  • Kotlin1 618
  • Rust1 472
  • C#717
  • PHP690
  • C++579

DevOps и инфраструктура

  • Kubernetes7 787
  • DevOps вакансии6 095
  • Linux-инфраструктура5 508
  • Terraform / IaC4 287
  • CI/CD3 272
  • Мониторинг и Observability1 792
  • SRE566
  • Кибербезопасность454

Аналитика и данные

  • Data Scientist1 138
  • Бизнес-аналитик921
  • Аналитик данных858
  • Системный аналитик154

Другие направления

  • Проджект-менеджер624
  • UI/UX дизайн149
  • Ручное тестирование14

По регионам

  • Вакансии в США44 166
  • Вакансии в Европе24 014
  • Вакансии в Канаде4 535
  • Работа в России3 867

По формату

  • Удалённые вакансии75 005
  • Релокация в США44 166
  • Гибридная работа12 485
  • Офисная работа7 090

По уровню

  • Senior вакансии42 643
  • Middle вакансии20 960
  • Junior вакансии6 708

Сейчас нанимают

Все компании
  • Wise190 вакансий
  • Rakuten189 вакансий
  • ASML166 вакансий
  • Grab137 вакансий
  • Celonis38 вакансий
  • Spotify37 вакансий
  • Adyen29 вакансий
  • Infobip28 вакансий
  • Monzo20 вакансий
  • Darktrace17 вакансий

Вакансии из 344 источников: карьерные страницы компаний и джоб-борды.

КомпанииО насНовостиПубличная офертаУсловия использованияПолитика конфиденциальностиПоддержка
←К теме ElixirВсе вопросы
ElixirSeniorПроектирование систем

Как Elixir обрабатывает распределённые системы на нескольких узлах (nodes)?

В закладки
Сначала попробуйте ответить сами30 секунд
Сравнить с ответом ↓

Elixir использует встроенный механизм Erlang/OTP для объединения узлов в кластер через :net_kernel и :rpc; процессы обмениваются сообщениями прозрачно по имени узла, а :pg и :global позволяют регистрировать процессы глобально.

Запуск узлов и подключение

# Запуск узла с именем
iex --sname node1 --cookie secret

# В другом терминале:
iex --sname node2 --cookie secret

# Подключиться к node1 из node2:
Node.connect(:node1@hostname)
Node.list()  # [:node1@hostname]

Распределённые системы в Elixir: узлы и кластеры

Elixir наследует распределённость от Erlang VM (BEAM). Каждый запущенный экземпляр BEAM — это node с уникальным именем вида name@hostname. Узлы соединяются в кластер через TCP, используя общий cookie для аутентификации.

Отправка сообщений между узлами

Синтаксис send/2 принимает {process_name, node} или PID, полученный с удалённого узла. Это полностью прозрачно для процессов — они не знают, локальный адресат или удалённый.

# Вызвать функцию на удалённом узле
:rpc.call(:node1@hostname, String, :upcase, ["hello"])
# => "HELLO"

# Spawn процесс на удалённом узле
Node.spawn(:node1@hostname, fn ->
  IO.puts("Running on #{Node.self()}")
end)

Глобальная регистрация процессов

Модуль :global регистрирует имена глобально по всему кластеру (с распределённым локом). Библиотека :pg (с OTP 23) управляет группами процессов без единой точки отказа.

# Регистрация глобально
:global.register_name(:my_server, self())

# Поиск
:global.whereis_name(:my_server)

# pg — группы процессов
:pg.join(:my_group, self())
:pg.get_members(:my_group)

Horde и libcluster

На практике используют libcluster для автоматического обнаружения узлов (через DNS, Kubernetes API, Gossip) и Horde для распределённого Registry и Supervisor.

# mix.exs
{:libcluster, "~> 3.3"},
{:horde, "~> 0.9"}

# config/config.exs
config :libcluster,
  topologies: [
    k8s: [
      strategy: Cluster.Strategy.Kubernetes.DNS,
      config: [
        service: "myapp-headless",
        application_name: "myapp"
      ]
    ]
  ]

Модель отказоустойчивости

При разрыве сети между узлами возникает network partition. BEAM обнаруживает это через heartbeat и nodedown-уведомления. Системы на основе Horde используют CRDT для согласования состояния после воссоединения. Phoenix.PubSub с адаптером Phoenix.PubSub.PG2 автоматически рассылает сообщения всем узлам кластера.

Подводные камни

  • Cookie должен быть одинаковым на всех узлах; разные cookies молча не соединяют узлы без ошибки в логе.
  • :global использует глобальный лок при регистрации — при большом кластере это узкое место; предпочтительнее :pg или Horde.Registry.
  • Вызов :rpc.call/4 блокирует вызывающий процесс; при зависании удалённого узла вызов зависнет тоже — используйте :rpc.async_call/4 с таймаутом.
  • Node.spawn/2 не привязан к supervision tree — процесс-сирота; краши не отслеживаются.
  • При network partition Horde может задублировать процессы; нужно явно реализовывать идемпотентность.
  • Передача больших бинарных данных между узлами копирует их полностью — это производительная ловушка при больших payload.
  • Атомы передаются по сети как строки и создаются на принимающем узле; динамическое создание атомов из внешних данных приводит к исчерпанию пула атомов (лимит ~1 млн).
  • Имена узлов с --sname работают только в одной подсети; в облаке нужен --name с FQDN.

Частые вопросы на собеседовании

  • В чём разница между spawn, Task и GenServer для выполнения конкурентного кода?
  • Что такое pattern matching в Elixir и как он используется в ветвях функций (function clauses)?
  • В чём разница между модулем и структурой (struct) в Elixir?
  • Что такое иммутабельность в Elixir и почему она важна для параллелизма?

Типичные ошибки

  • Сводить distributed nodes к названию метода без lifecycle и failure path.
  • Игнорировать модель runtime: Elixir компилируется в BEAM bytecode и наследует процессы, message passing, supervision и hot-code friendly модель Erlang VM.
  • Не отделять validation, authorization, transaction boundary и business logic.
  • Не обсуждать idempotency, retries, shutdown и observability.

Что проверяет интервьюер

  • Объясняет distributed nodes через конкретную точку lifecycle в Elixir.
  • Приводит корректный минимальный пример без вымышленных методов или callbacks.
  • Называет edge cases: пустые значения, ошибки, транзакции, безопасность или concurrency.
  • Связывает решение с метриками, backpressure, retry policy и graceful shutdown.

Как вы знаете этот вопрос?

Проверить себя по теме Elixir →

Источники

  • https://hexdocs.pm/elixir/Node.html
  • https://hexdocs.pm/elixir/

Связанные темы

ElixirBackend-Engineeringelixir-ecosystemproduction-readinesssystem-design