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

+2 392новые вакансии за сутки·90 689вакансий открыто сейчас·Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

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

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

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

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

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

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

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

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

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

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

Все подборки
  • Python16 411
  • Облачные технологии13 173
  • QA вакансии3 433
  • Backend вакансии2 032
  • Инженер данных1 659
  • Продакт-менеджер1 151

Разработка

  • Android1 816
  • iOS1 666
  • AI вакансии938
  • Fullstack вакансии890
  • Frontend вакансии715
  • Mobile вакансии38

По стеку

  • Go8 558
  • Java6 087
  • Node.js1 888
  • Kotlin1 554
  • .NET1 545
  • Rust1 432
  • PHP640
  • C#562
  • C++498

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

  • Kubernetes7 302
  • DevOps вакансии5 581
  • Linux-инфраструктура5 291
  • Terraform / IaC4 013
  • CI/CD2 555
  • Мониторинг и Observability1 734
  • SRE546
  • Кибербезопасность392

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

  • Data Scientist1 030
  • Бизнес-аналитик867
  • Аналитик данных829
  • Системный аналитик134

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

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

По регионам

  • Вакансии в США44 612
  • Вакансии в Европе21 275
  • Вакансии в Канаде4 434
  • Работа в России3 877

По формату

  • Удалённые вакансии73 589
  • Релокация в США44 639
  • Гибридная работа11 412
  • Офисная работа6 956

По уровню

  • Senior вакансии41 074
  • Middle вакансии20 296
  • Junior вакансии6 611

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

Все компании
  • Wise194 вакансии
  • Rakuten189 вакансий
  • ASML164 вакансии
  • Grab136 вакансий
  • Celonis45 вакансий
  • Spotify36 вакансий
  • Adyen29 вакансий
  • Infobip28 вакансий
  • Monzo19 вакансий
  • Darktrace17 вакансий

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

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

Каковы распространённые паттерны организации большого приложения Axum по модулям?

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

Большие Axum-приложения организуют по принципу feature-модулей: каждый модуль содержит роутер, обработчики, модели и ошибки. Роутеры объединяются через Router::merge() или Router::nest() в корневом main.rs.

Структура проекта

src/
├── main.rs           // точка входа, сборка приложения
├── state.rs          // AppState — общее состояние
├── error.rs          // общий тип ошибки AppError
├── routes.rs         // сборка всех роутеров
├── middleware/
│   ├── mod.rs
│   ├── auth.rs       // JWT/session middleware
│   └── logging.rs
├── users/
│   ├── mod.rs
│   ├── router.rs     // users_router() -> Router
│   ├── handlers.rs   // async fn get_user, create_user...
│   ├── models.rs     // User, CreateUserRequest
│   └── service.rs    // бизнес-логика
├── products/
│   ├── mod.rs
│   ├── router.rs
│   ├── handlers.rs
│   └── models.rs
└── db/
    ├── mod.rs
    └── migrations.rs

Организация большого приложения Axum по модулям

Нет единственно верной структуры, но есть устоявшиеся паттерны. Самый распространённый — организация по доменным модулям (feature-based), где каждая функциональная область (users, products, orders) живёт в своём модуле.

Пример модуля users

// users/router.rs
use axum::{Router, routing::{get, post}};
use crate::state::AppState;
use super::handlers;

pub fn users_router() -> Router<AppState> {
    Router::new()
        .route("/users", get(handlers::list_users).post(handlers::create_user))
        .route("/users/:id", get(handlers::get_user).delete(handlers::delete_user))
}
// users/handlers.rs
use axum::{extract::{Path, State}, Json};
use crate::{state::AppState, error::AppError};
use super::models::{User, CreateUserRequest};

pub async fn get_user(
    State(state): State<AppState>,
    Path(id): Path<i64>,
) -> Result<Json<User>, AppError> {
    let user = sqlx::query_as::<_, User>("SELECT * FROM users WHERE id = $1")
        .bind(id)
        .fetch_one(&state.db)
        .await?;
    Ok(Json(user))
}

Сборка роутеров в routes.rs

// routes.rs
use axum::Router;
use crate::state::AppState;
use crate::{users, products};
use tower_http::trace::TraceLayer;

pub fn create_router(state: AppState) -> Router {
    Router::new()
        .nest("/api/v1", api_router())
        .with_state(state)
        .layer(TraceLayer::new_for_http())
}

fn api_router() -> Router<AppState> {
    Router::new()
        .merge(users::router::users_router())
        .merge(products::router::products_router())
}

Общий тип ошибки

// error.rs
use axum::{response::{IntoResponse, Response}, http::StatusCode, Json};
use serde_json::json;

pub enum AppError {
    NotFound(String),
    Database(sqlx::Error),
    Unauthorized,
}

impl IntoResponse for AppError {
    fn into_response(self) -> Response {
        let (status, message) = match self {
            AppError::NotFound(msg) => (StatusCode::NOT_FOUND, msg),
            AppError::Database(e) => (StatusCode::INTERNAL_SERVER_ERROR, e.to_string()),
            AppError::Unauthorized => (StatusCode::UNAUTHORIZED, "Unauthorized".into()),
        };
        (status, Json(json!({ "error": message }))).into_response()
    }
}

impl From<sqlx::Error> for AppError {
    fn from(e: sqlx::Error) -> Self { AppError::Database(e) }
}

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

  • Router::merge() не работает с маршрутами с конфликтующими путями — Axum паникует при старте, а не возвращает ошибку компиляции.
  • Типовой параметр роутера Router<AppState> должен совпадать — если забыть указать его в одном из sub-роутеров, компилятор выдаст трудночитаемую ошибку.
  • Вызов .with_state() должен быть последним перед axum::serve() — добавление слоёв после может изменить тип роутера.
  • Круговые зависимости между модулями (users зависит от orders, orders от users) требуют выноса общих типов в отдельный domain крейт.
  • Слишком мелкие модули создают boilerplate без выгоды — разумный минимум для отдельного модуля: 3+ маршрута или нетривиальная логика.
  • Тесты для обработчиков удобнее писать через axum::test::TestClient (или tower::ServiceExt::oneshot) — не забывайте про тестовые фикстуры состояния.

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

  • В каких backend-проектах Axum (Rust) является сильным выбором, а где лучше выбрать более простой или другой стек?
  • Какие production-риски есть у Axum (Rust): blocking code, connection pooling, config, auth, observability, deploy или graceful shutdown?
  • Как понять, что проблема в сервисе связана с Axum (Rust), а не с базой, сетью, инфраструктурой или бизнес-логикой?
  • Проект на Axum (Rust) вырос из MVP в большой production-сервис. Какие проблемы архитектуры и сопровождения вы ожидаете увидеть?

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

  • Отвечать определением без production-сценария.
  • Не называть runtime boundary, security boundary или failure mode.
  • Игнорировать версию API, observability и тестовую проверку.

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

  • Объясняет механизм своими словами и без выдуманных API.
  • Называет реальные риски, диагностику и критерий корректности.
  • Связывает ответ с текущей документацией и миграционными ограничениями.

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

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

Источники

  • https://docs.rs/axum/latest/axum/

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

Axumaxum-productionAxum (Rust)risk-analysistechnical-depth