Новое: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 источников: карьерные страницы компаний и джоб-борды.

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

Что такое Phoenix Channels и как они обеспечивают коммуникацию в реальном времени?

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

Phoenix Channels — это абстракция реального времени: каждое подключение клиента — отдельный BEAM-процесс, маршрутизируемый по теме (topic) через Socket, с двусторонней передачей событий через PubSub.

Пример: чат-канал

defmodule MyAppWeb.RoomChannel do
  use Phoenix.Channel

  def join("room:" <> _room_id, _params, socket) do
    {:ok, socket}
  end

  def handle_in("new_msg", %{"body" => body}, socket) do
    broadcast!(socket, "new_msg", %{body: body})
    {:noreply, socket}
  end
end

Регистрация в сокете:

defmodule MyAppWeb.UserSocket do
  use Phoenix.Socket

  channel "room:*", MyAppWeb.RoomChannel

  def connect(%{"token" => token}, socket, _connect_info) do
    case Phoenix.Token.verify(socket, "user", token, max_age: 86400) do
      {:ok, user_id} -> {:ok, assign(socket, :user_id, user_id)}
      {:error, _}    -> :error
    end
  end

  def id(socket), do: "user_socket:#{socket.assigns.user_id}"
end

JavaScript-клиент:

import { Socket } from "phoenix";

const socket = new Socket("/socket", { params: { token: userToken } });
socket.connect();

const channel = socket.channel("room:42", {});
channel.on("new_msg", ({ body }) => console.log(body));
channel.push("new_msg", { body: "Hello" });
channel.join()
  .receive("ok", () => console.log("joined"))
  .receive("error", (e) => console.error(e));

Что такое Phoenix Channels

Phoenix Channels — это абстракция для двусторонней коммуникации в реальном времени поверх транспортного протокола (WebSocket, Long Poll). Каждый канал — это отдельный Elixir-процесс (GenServer), изолированный на уровне BEAM. Клиент подключается к Socket, а затем вступает в конкретный Channel по строке темы, например "room:42" или "user:#{id}".

Ключевые сущности

  • Socket — точка входа. Определяет аутентификацию и маршрутизацию на каналы.
  • Channel — модуль, реализующий use Phoenix.Channel. Содержит колбэки join/3, handle_in/3, handle_out/3, handle_info/2.
  • Topic — строка вида "entity:id"; первая часть сопоставляется в channel/2 сокета.
  • PubSub — шина событий, по которой серверные процессы рассылают сообщения всем подписчикам темы.

Жизненный цикл сообщения

  • Клиент отправляет событие — оно десериализуется в процессе сокета и диспетчеризуется в нужный канал.
  • handle_in обрабатывает событие и может ответить через reply/2, push/3 или broadcast!/3.
  • broadcast! публикует в Phoenix.PubSub; все процессы-каналы, подписанные на тему, получают событие и пушат его своим клиентам.
  • Каждый процесс канала изолирован: краш одного клиента не затрагивает других.

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

  • Блокирующий код в handle_in. Вызов тяжёлой DB-операции синхронно блокирует процесс канала. Делегируйте в Task или отдельный GenServer.
  • Неограниченный topic-namespace. Паттерн "room:*" разрешает любую строку; без проверки в join/3 клиент может подписаться на чужую комнату.
  • broadcast! vs broadcast. broadcast! бросает исключение при сбое PubSub. В критичном коде используйте broadcast/3 и обрабатывайте {:error, reason}.
  • Нет персистентности сообщений. Channels — ephemeral. Клиент, отключившийся на секунду, пропускает все события; нужен отдельный механизм (read cursor, replay endpoint).
  • Большой payload в assigns. Socket assigns хранятся в памяти процесса на весь сеанс. Не кладите туда большие структуры данных.
  • handle_out перехватывает broadcast глобально. Если переопределить handle_out без явного push/3, сообщение не дойдёт до клиента — легко пропустить при рефакторинге.
  • Неправильное id/1 в сокете. id/1 используется для принудительного отключения всех сессий пользователя через MyAppWeb.Endpoint.broadcast("user_socket:#{id}", "disconnect", %{}). Если вернуть nil, функция отключения не сработает.

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

  • Как планировать zero-downtime deploy Phoenix-приложения с Ecto migrations и rolling releases?
  • Что такое Plugs в Phoenix и как работает plug-конвейер?
  • Чем Phoenix отличается от Rails или Django по архитектуре?
  • В чём разница между Phoenix templates (.heex) и традиционными EEx-шаблонами?

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

  • Сводить channels к названию метода без lifecycle и failure path.
  • Игнорировать модель runtime: Phoenix 1.8 работает поверх Plug, Endpoint, Router, Controllers/LiveViews, PubSub и OTP supervision.
  • Не отделять validation, authorization, transaction boundary и business logic.
  • Не обсуждать idempotency, retries, shutdown и observability.

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

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

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

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

Источники

  • https://hexdocs.pm/phoenix/channels.html
  • https://hexdocs.pm/phoenix/
←Предыдущий вопросКак проектировать PubSub/Presence для горизонтального масштабирования?

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

Phoenix (Elixir)Backend-Engineeringconcurrencyphoenix-ecosystemproduction-readinessreliabilitysystem-design

Вакансии с этим навыком

  • Automation QA Engineer (Payments)