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

+666новых вакансий за сутки·52 265вакансий открыто сейчас·Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

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

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

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

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

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

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

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

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

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

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

Все подборки
  • Python5 973
  • Облачные технологии4 523
  • QA вакансии1 689
  • Android1 143
  • Инженер данных788
  • Продакт-менеджер308

Разработка

  • iOS1 093
  • Backend вакансии1 020
  • Fullstack вакансии448
  • AI вакансии378
  • Frontend вакансии369
  • Mobile вакансии27

По стеку

  • Go3 345
  • Java2 037
  • Kotlin908
  • Node.js746
  • Rust492
  • .NET481
  • PHP278
  • C++213
  • C#199

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

  • Kubernetes2 562
  • Linux-инфраструктура2 030
  • DevOps вакансии1 855
  • Terraform / IaC1 548
  • CI/CD876
  • Мониторинг и Observability709
  • SRE229
  • Кибербезопасность40

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

  • Аналитик данных479
  • Data Scientist443
  • Бизнес-аналитик342
  • Системный аналитик50

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

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

По регионам

  • Вакансии в США24 039
  • Вакансии в Европе9 373
  • Работа в России2 968
  • Вакансии в Канаде2 114

По формату

  • Удалённые вакансии41 595
  • Релокация в США24 039
  • Гибридная работа3 695
  • Офисная работа2 766

По уровню

  • Senior вакансии20 330
  • Middle вакансии11 778
  • Junior вакансии3 695

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

Все компании
  • Rakuten189 вакансий
  • ASML163 вакансии
  • Grab134 вакансии
  • Wise81 вакансия
  • Infobip28 вакансий
  • Darktrace17 вакансий
  • Spotify17 вакансий
  • Celonis14 вакансий
  • UiPath13 вакансий
  • Adyen9 вакансий

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

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

Как Actix-web интегрируется с асинхронными драйверами баз данных, такими как sqlx?

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

Создайте PgPool через PgPoolOptions::new().connect() и передайте его в App как web::Data. В хендлерах принимайте pool: web::Data<sqlx::PgPool> и используйте sqlx::query_as! или query! для асинхронных запросов.

Зависимости (Cargo.toml)

// Cargo.toml
[dependencies]
actix-web = "4"
sqlx = { version = "0.8", features = ["postgres", "runtime-tokio-native-tls", "uuid", "chrono", "macros"] }
tokio = { version = "1", features = ["full"] }
serde = { version = "1", features = ["derive"] }
uuid = { version = "1", features = ["serde", "v4"] }

Интеграция Actix-web с sqlx

Actix-web не имеет встроенной ORM — для работы с PostgreSQL, MySQL или SQLite используется sqlx, асинхронная библиотека с проверкой запросов на этапе компиляции. Пул соединений передаётся через механизм web::Data.

Создание пула и передача в приложение

use actix_web::{web, App, HttpServer, HttpResponse, Error};
use sqlx::postgres::PgPoolOptions;
use serde::Serialize;

#[derive(Serialize, sqlx::FromRow)]
struct User {
    id: i32,
    name: String,
    email: String,
}

async fn list_users(pool: web::Data<sqlx::PgPool>) -> Result<HttpResponse, Error> {
    let users = sqlx::query_as::<_, User>(
        "SELECT id, name, email FROM users ORDER BY id"
    )
    .fetch_all(pool.get_ref())
    .await
    .map_err(actix_web::error::ErrorInternalServerError)?;

    Ok(HttpResponse::Ok().json(users))
}

#[actix_web::main]
async fn main() -> std::io::Result<> {
    let database_url = std::env::var("DATABASE_URL")
        .expect("DATABASE_URL must be set");

    let pool = PgPoolOptions::new()
        .max_connections(10)
        .connect(&database_url)
        .await
        .expect("Failed to create pool");

    // Применяем миграции из папки ./migrations
    sqlx::migrate!("./migrations")
        .run(&pool)
        .await
        .expect("Migration failed");

    let pool_data = web::Data::new(pool);

    HttpServer::new(move || {
        App::new()
            .app_data(pool_data.clone())
            .route("/users", web::get().to(list_users))
    })
    .bind("0.0.0.0:8080")?
    .run()
    .await
}

Использование compile-time query! макроса

Макрос sqlx::query! проверяет SQL на этапе компиляции, если установлена переменная окружения DATABASE_URL или используется sqlx prepare:

async fn get_user(
    pool: web::Data<sqlx::PgPool>,
    path: web::Path<i32>,
) -> Result<HttpResponse, Error> {
    let user_id = path.into_inner();
    let rec = sqlx::query!(
        "SELECT id, name, email FROM users WHERE id = $1",
        user_id
    )
    .fetch_optional(pool.get_ref())
    .await
    .map_err(actix_web::error::ErrorInternalServerError)?;

    match rec {
        Some(row) => Ok(HttpResponse::Ok().json(serde_json::json!({
            "id": row.id,
            "name": row.name,
            "email": row.email,
        }))),
        None => Ok(HttpResponse::NotFound().finish()),
    }
}

Транзакции

async fn transfer_funds(
    pool: web::Data<sqlx::PgPool>,
    body: web::Json<Transfer>,
) -> Result<HttpResponse, Error> {
    let mut tx = pool.begin().await
        .map_err(actix_web::error::ErrorInternalServerError)?;

    sqlx::query!("UPDATE accounts SET balance = balance - $1 WHERE id = $2",
        body.amount, body.from_id)
        .execute(&mut *tx).await
        .map_err(actix_web::error::ErrorInternalServerError)?;

    sqlx::query!("UPDATE accounts SET balance = balance + $1 WHERE id = $2",
        body.amount, body.to_id)
        .execute(&mut *tx).await
        .map_err(actix_web::error::ErrorInternalServerError)?;

    tx.commit().await
        .map_err(actix_web::error::ErrorInternalServerError)?;

    Ok(HttpResponse::Ok().finish())
}

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

  • Неправильный размер пула — по умолчанию PgPool создаёт до 10 соединений; под нагрузкой запросы будут ждать свободного слота. Устанавливайте max_connections в соответствии с лимитом БД.
  • pool.get_ref() vs &**pool — оба варианта корректны, но смешение может запутать читателей; придерживайтесь одного стиля в проекте.
  • DATABASE_URL на этапе компиляции — sqlx::query! требует живую БД или кэш sqlx-data.json (создаётся через cargo sqlx prepare) в CI.
  • Незакрытые транзакции — если обработчик вернул ошибку до tx.commit(), транзакция откатывается при drop, но только если не игнорируются ошибки между запросами.
  • N+1 запросы — sqlx не предоставляет lazy loading; при вложенных данных легко написать цикл запросов. Используйте JOIN или fetch_all с ручной сборкой.
  • Хаотичная обработка ошибок — sqlx::Error содержит много вариантов; оборачивая через ErrorInternalServerError, вы теряете детали. Лучше использовать кастомный тип ошибки с ResponseError.
  • Миграции в production — sqlx::migrate!() в main() удобен для разработки, но в production может вызвать проблемы при горизонтальном масштабировании — запускайте миграции отдельным шагом деплоя.

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

  • В каких backend-проектах Actix (Rust) является сильным выбором, а где лучше выбрать более простой или другой стек?
  • Представьте, endpoint на Actix (Rust) иногда отвечает за секунды вместо миллисекунд. Как вы будете искать причину?
  • Проект на Actix (Rust) вырос из MVP в большой production-сервис. Какие проблемы архитектуры и сопровождения вы ожидаете увидеть?
  • Как реализовать graceful shutdown в Actix-web?

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

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

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

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

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

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

Источники

  • https://actix.rs/docs/
←Предыдущий вопросКак писать интеграционные тесты для Actix-web с помощью `actix-web::test`?Следующий вопрос→Какова роль `web::block()` в Actix-web для выполнения блокирующих операций?

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

Actixactix-productionActix (Rust)risk-analysistechnical-depth