SlideShare a Scribd company logo
1 of 92
Download to read offline
Практика разработки веб-серверов на Rust
Панков Михаил
17 мая 2016
Обо мне
Кто я
• Системный программист
• Работал над компилятором, операционными системами
• В данный момент отвечаю за инфраструктуру
обеспечения качества в проекте Kaspersky OS
• В свободное время занимаюсь веб-разработкой
• Один из основных переводчиков «The Rust
Programming Language» на русский язык
• Основатель русскоязычного сообщества Rust
http://rustycrate.ru
1
Задача
Задача
• Нужен «всегда зелёный master»
• Много разработчиков, большой поток Merge Request’ов
• Простой проверки Merge Request’а на момент его
создания недостаточно
• Нужно упорядочивать изменения и проверять
«кандидата на новый master» именно в том виде, в
котором он будет влит
2
Стек
• GitLab Community Edition 8.x
• Jenkins 1.x
3
Решение
Нужен сторож!
Commit Gatekeeper под нашу инфраструктуру
4
Познакомьтесь с Шуриком
• Смотрит в GitLab, получает по Webhook
API оповещения о Merge Request’ах
(MR) и комментариях
• Получает команды от автора и
рецензента через комментарии к MR
• Сливает MR с актуальным master,
делает прогон Jenkins на нём, если
успешно — обновляет master
• Уведомляет автора, если очередной
MR невозможно слить автоматически
5
Как это выглядит
6
Как это работает
Рецензент одобрил, но прогон не успешен
7
Плохой код…
8
не пройдёт!
9
Что ещё есть
Что ещё есть
• Сохранение состояния, восстановление при сбое через
перезапуск приложения
• Изоляция проектов: сбой в обработке одного проекта
не влияет на другие
• Логи
• Конфигурация в TOML-файле
10
Почему Rust?
Почему Rust?
• Хорошая поддержка многопоточности стандартной
библиотекой: мьютексы, каналы, RwLock, CondVar…
• Надёжные многопоточность и обработка ошибок, при
этом нулевые накладные расходы
• Хорошая изоляция сбоев: по умолчанию, паника
останавливается на границе потока
11
Почему Rust? (продолжение)
• Редко ломается
• Когда ломается — это происходит в изолированных
местах
• Вся наша большая команда разработчиков не будет
останавливаться и ждать, пока починят
инфраструктуру
12
Рабочее окружение
Используем стабильный Rust
• Любой stable проходит 12-недельный цикл
использования людьми, которые сидят на beta
• Все изменения, которые попадают в beta после её
отрезания - исправления багов
• Т.е. stable содержит меньше неизвестных багов
• nightly опасен тем, что нестабильные возможности
могут изменить или удалить
13
multirust
• Берём multirust и ставим все нужные версии
компилятора через него
• Новая версия multirust называется rustup.rs и
работает на Windows
• https://www.rustup.rs/
14
IDE
IDE
• Их есть у нас
• Построены на базе всех мыслимых и немыслимых
редакторов и IDE
• Почти все используют для навигациии и
автодополнения racer
• http://is.gd/rust_ide
https://www.rust-lang.org/ides.html
https://areweideyet.com/
15
racer
• Он не всегда хорошо работает
16
IDE RFC
• Принят
https://github.com/rust-lang/rfcs/pull/1317
• Был заблокирован рефакторингом компилятора — MIR
• Демон-«оракул» будет отвечать на вопросы IDE о
программе
https://github.com/rust-lang/rust/issues/31548
• У нас скоро будут первоклассные IDE!
17
Экосистема веб-приложений
На Rust уже можно писать веб-приложения?
• Можно
• http://www.arewewebyet.org/
18
Состояние экосистемы
• Веб-сервер
• hyper
• Веб-фреймворки
• iron
• nickel
• conduit
• sappers
• Драйверы к БД
• MySQL
• PostgreSQL
• Redis
• ORM
• rustorm
• diesel
19
Как найти библиотеки?
crates.io
Центральное хранилище с поиском
20
Как найти хорошие библиотеки?
Хорошие библиотеки
• Работают
• Имеют удобное API
• Хорошо документированы
21
Косвенные признаки
• Имеют много пользователей
• Есть на crates.io
• Обновляются чаще, чем раз в тысячелетие
• Есть на crates.io
• Есть документация и примеры
• Ссылка на документацию на crates.io
• Люди хорошо отзываются
• За этим мы тут и собрались
22
Нужной библиотеки нет, что
делать?
Foreign Function Interface
У Rust первоклассный FFI, и он хорошо встраивается во
многие языки
Легко позвать существующую библиотеку на другом языке
http://jakegoulding.com/rust-ffi-omnibus/
23
Веб-фреймворк
Iron
Почему?
• Самый матёрый
• Простой
• Модульный
24
GitLab API
GitLab API/1
Написана своя минималистичная обёртка
25
GitLab API/2: Типы отражают состояния
pub struct Api {
root: Url,
}
pub struct Session {
root: Url,
private_token: String,
}
26
GitLab API/3: Конструирование API проверяет URL
impl Api {
pub fn new<T: IntoUrl>(maybe_url: T)
-> Result<Self, ::url::ParseError> {
let url = try!(maybe_url.into_url());
Ok(
Api {
root: url,
})
}
27
GitLab API/4: Обработка ошибок
impl Api {
pub fn login(
&self, username: &str, password: &str)
-> Result<Session, LoginError> {
let client = Client::new();
let mut res =
try!(
client.post(
&*format!("{}/session", self.root))
.body(
&*format!(
"login={}&password={}",
username, password))
.send()); 28
GitLab API/5: Как эта функция вызывается
let gitlab_session =
gitlab_api.login(gitlab_user, gitlab_password).unwrap();
29
GitLab API/6: Вспомогательный макрос
quick_error! {
#[derive(Debug)]
pub enum LoginError {
Http(err: ::hyper::error::Error) { from() }
Read(err: ::std::io::Error) { from() }
Json(err: JsonError) { from() }
JsonObject(err: JsonObjectError) { from() }
JsonObjectString(err: JsonObjectStringError) {
from()
}
}
}
30
Общая архитектура
Разделяемое состояние
let gitlab_login_config =
get_gitlab_login_config(&*config).unwrap();
let gitlab_session =
login_to_gitlab(gitlab_login_config).unwrap();
let gitlab_session = Arc::new(gitlab_session);
31
Разделяемое состояние (продолжение)
let gitlab_session = Arc::new(gitlab_session);
for (psid, project_set) in project_sets {
init_project_set(
gitlab_session.clone(), psid, project_set,
state_save_dir, &mut router, &mut builders,
config.clone());
}
Iron::new(router).http(
(&*gitlab_address, gitlab_port))
.expect("Couldn't start the web server");
32
Многопоточность
{
let mr_storage = mr_storage.clone();
let queue = queue.clone();
let project_set = project_set.clone();
let state_save_dir = state_save_dir.clone();
let builder = thread::spawn(move || {
handle_build_request(...);
});
builders.push(builder);
}
33
Многопоточность (продолжение)
let builder = thread::spawn(move || {
handle_build_request(...);
});
router.post(format!("/api/v1/{}/mr", psid),
move |req: &mut Request|
handle_mr(...));
router.post(format!("/api/v1/{}/comment", psid),
move |req: &mut Request|
handle_comment(...));
34
Сериализация в JSON
#[derive(RustcDecodable, RustcEncodable)]
#[derive(Debug, Clone)]
struct MergeRequest {
id: MrUid,
human_number: u64,
checkout_sha: String,
status: Status,
approval_status: ApprovalStatus,
merge_status: MergeStatus,
}
35
Рефакторинг
Рефакторинг
• Очень легко делать*
• Просто чинишь все места, где возникают ошибки
компиляции
• *С поправкой на сами сообщения об ошибках
компиляции
36
Отладка
Отладка
• println!
• rust-gdb
• backtrace
• следующая версия gdb будет поддерживать Rust
нативно
37
Профилирование
Профилирование
• Производительность
• valgrind
https://llogiq.github.io/2015/07/15/profiling.html
• oprofile
• perf
• Instruments
http://carol-nichols.com/2015/12/09/
rust-profiling-on-osx-cpu-time/
• Покрытие
• kcov
https://is.gd/rust_kcov
• coveralls.io
https://is.gd/rust_coveralls
38
Развёртывание компилятора и
приложений
Развёртывание компилятора и приложений
• Ставим компилятор rustup’ом с флагом --save
• Внимание: зависимости на системные библиотеки!
39
Особенно классное
Ни одного segmentation fault’а
• Я не вру
• Никаких звёздочек
40
Все падения только по assert или unwrap
• Внимание: .unwrap() — это assert!() в овечьей шкуре
41
Ошибки и проблемы
Deadlock
• Deadlock очень легко сделать из-за lock guards
• Возникает детерминированно
• Отлаживается элементарно
42
Медленная компиляция
• Сборка всего проекта, с зависимостями, в релизе
2 минуты
• Сборка только изменённых файлов проекта, без
зависимостей, в дебаге
8 секунд
• Инкрементальная компиляция скоро будет
• Ждали окончания рефакторинга компилятора (MIR)
https://github.com/rust-lang/rust/issues/2369
43
Нет рекомендаций по архитектуре
Всевозможные шаблоны только зарождаются
https://github.com/nrc/patterns
44
Иногда приходится обновлять библиотеки
• Не проблема, когда это библиотеки на Rust
• Если это обёртки к системным библиотекам (.so, .dll,
.dylib), начинается веселье
• Приходится сводить все зависимости к совместимым
версиям обёртки
45
Сообщения об ошибках
Сообщения об ошибках
Compiling shurik v0.1.0 (file:...)
src/main.rs:1253:19: 1253:32 error: the type
`[closure@src/main.rs:1253:33: 1257:6
mr_storage:alloc::arc::Arc<
std::sync::mutex::Mutex<
std::collections::hash::map::HashMap<
MrUid, MergeRequest>>>,
queue:alloc::arc::Arc<(
std::sync::mutex::Mutex<
collections::linked_list::LinkedList<
WorkerTask>>,
std::sync::condvar::Condvar)>,
config:&alloc::arc::Arc<toml::Value>,
46
…
project_set:alloc::arc::Arc<ProjectSet>,
state_save_dir:
alloc::arc::Arc<collections::string::String>,
gitlab_session:alloc::arc::Arc<gitlab::Session>]`
does not fulfill the required lifetime [E0477]
src/main.rs:1253
let builder = thread::spawn(move || {
^~~~~~~~~~~~~
note: type must outlive the static lifetime
error: aborting due to previous error
Could not compile `shurik`.
47
Глубоко вдохните и прогуляйтесь
48
Если серьёзно
Приходите в чат — помогут разобраться
https://gitter.im/ruRust/general
49
Почему я люблю компиляторы, которые умнее меня
• Компилятор всегда прав*
• В отличие от людей
• В отличие от тестов
• *Кроме багов
50
Сообщество
Сообщество
• http://rustycrate.ru
51
Шурик на GitHub
Шурик на GitHub
https://github.com/mkpankov/shurik
52
Ссылки
Ссылки
• «Язык программирования Rust»
http://rurust.github.io/rust_book_ru/
• «Растономикон»
https://github.com/ruRust/rustonomicon
• «Маленькая книжка о макросах Rust»
https://github.com/ruRust/tlborm
• Чат
https://gitter.im/ruRust/general
• Reddit
http://reddit.com/r/rust/
• http://rustycrate.ru
53
Где найти этот доклад
http://mkpankov.github.io/rust-web-dev-2016/talk.pdf
54
Спасибо!
Backup
Рецензент не одобрил
55
Прогон не успешен, а затем merge conflict
56
Связанные изменения
• Изменения в нескольких репозиториях
• Если применить эти изменения не ко всем нужным
репозиториям, это приведёт к поломке сборки или
тестов
• Если не учитывать связанность изменений, сторож
никогда их не пропустит, т.к. тестирование каждого
отдельного MR завершится ошибкой
• Большой пласт функциональности
• Пока не реализовано, будущая работа
57
Макрос try!
// try(f);
match f {
Ok(o) => o,
Err(e) => return From::from(e),
}
58
Deadlock
let mr_storage_locked_1 =
&*mr_storage.lock().unwrap();
mr_storage_locked_1[...] = ... ;
...
let mr_storage_locked_2 =
&*mr_storage.lock().unwrap();
mr_storage_locked_2[...] = ... ;
59
Сериализация в JSON (вручную) /1
impl Encodable for MrUid {
fn encode<S: Encoder>(&self, s: &mut S)
-> Result<(), S::Error> {
format!(
"{},{}", self.id, self.target_project_id)
.encode(s)
}
}
60
Сериализация в JSON (вручную) /2
impl Decodable for MrUid {
fn decode<D: Decoder>(d: &mut D)
-> Result<Self, D::Error> {
let s = try!(d.read_str());
let s_v: Vec<_> = s.split(",").collect();
let mut v: Vec<u64> =
s_v.iter().map(|x| x.parse().unwrap())
.collect();
let mr_uid = MrUid {
target_project_id: v.pop().unwrap(),
id: v.pop().unwrap(),
};
Ok(mr_uid)
} 61
GitLab API/5: Сложная обработка ошибок
... let mut text = String::new();
try!(res.read_to_string(&mut text));
let json: ::serde_json::value::Value =
::serde_json::from_str(&text).unwrap();
let obj =
try!(json.as_object().ok_or(JsonError));
let private_token_value =
try!(obj
.get("private_token")
.ok_or(JsonObjectError));
let private_token =
try!(private_token_value
.as_string()
.ok_or(JsonObjectStringError)); 62
GitLab API/6: Успех
Ok(
Session {
root: self.root.clone(),
private_token: private_token
.to_owned(),
})
}
}
63

More Related Content

What's hot

CodeFest 2012. Аксёнов А. — Как мы разрабатываем Sphinx
CodeFest 2012. Аксёнов А. — Как мы разрабатываем SphinxCodeFest 2012. Аксёнов А. — Как мы разрабатываем Sphinx
CodeFest 2012. Аксёнов А. — Как мы разрабатываем SphinxCodeFest
 
Кит на службе у человека microPaaS Deis / Алексей Медведчиков (2ГИС)
Кит на службе у человека microPaaS Deis / Алексей Медведчиков (2ГИС)Кит на службе у человека microPaaS Deis / Алексей Медведчиков (2ГИС)
Кит на службе у человека microPaaS Deis / Алексей Медведчиков (2ГИС)Ontico
 
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...Ontico
 
«​Масштабируемый DevOps​» Александр Колесень
«​Масштабируемый DevOps​» Александр Колесень«​Масштабируемый DevOps​» Александр Колесень
«​Масштабируемый DevOps​» Александр КолесеньIT Share
 
DevOps-40 meetup #7, Project FiFo
DevOps-40 meetup #7, Project FiFoDevOps-40 meetup #7, Project FiFo
DevOps-40 meetup #7, Project FiFoAlex Chistyakov
 
Проникновение в Docker с примерами
Проникновение в Docker с примерамиПроникновение в Docker с примерами
Проникновение в Docker с примерамиДмитрий Столяров
 
2020.10.13 HA Redis is simple. FWDays Highload
2020.10.13 HA Redis is simple. FWDays Highload2020.10.13 HA Redis is simple. FWDays Highload
2020.10.13 HA Redis is simple. FWDays HighloadYehor Herasymchuk
 
Puppet development kit and best practices
Puppet development kit and best practicesPuppet development kit and best practices
Puppet development kit and best practicesIgor Kurochkin
 
Денис Паясь
Денис ПаясьДенис Паясь
Денис ПаясьCodeFest
 
Java худеет. Спроси меня как. Уменьшение размера дистрибутива Java приложения...
Java худеет. Спроси меня как. Уменьшение размера дистрибутива Java приложения...Java худеет. Спроси меня как. Уменьшение размера дистрибутива Java приложения...
Java худеет. Спроси меня как. Уменьшение размера дистрибутива Java приложения...Nikita Lipsky
 
Лучшие практики CI/CD с Kubernetes и GitLab / Дмитрий Столяров (Флант)
Лучшие практики CI/CD с Kubernetes и GitLab / Дмитрий Столяров (Флант)Лучшие практики CI/CD с Kubernetes и GitLab / Дмитрий Столяров (Флант)
Лучшие практики CI/CD с Kubernetes и GitLab / Дмитрий Столяров (Флант)Ontico
 
Инструменты тестирования ядра Linux
Инструменты тестирования ядра LinuxИнструменты тестирования ядра Linux
Инструменты тестирования ядра LinuxDenis Efremov
 
Formal verification of operating system kernels
Formal verification of operating system kernelsFormal verification of operating system kernels
Formal verification of operating system kernelsDenis Efremov
 
Мой Python всегда со мной!
Мой Python всегда со мной!Мой Python всегда со мной!
Мой Python всегда со мной!PyNSK
 
SDN & DEVOPS ?= ❤: Практики использования SDN / Александр Шалимов (ЦПИКС, МГУ)
SDN & DEVOPS ?= ❤: Практики использования SDN / Александр Шалимов (ЦПИКС, МГУ)SDN & DEVOPS ?= ❤: Практики использования SDN / Александр Шалимов (ЦПИКС, МГУ)
SDN & DEVOPS ?= ❤: Практики использования SDN / Александр Шалимов (ЦПИКС, МГУ)Ontico
 
Быстрый старт iOS приложения на примере iOS Почты Mail.Ru / Николай Морев (Ma...
Быстрый старт iOS приложения на примере iOS Почты Mail.Ru / Николай Морев (Ma...Быстрый старт iOS приложения на примере iOS Почты Mail.Ru / Николай Морев (Ma...
Быстрый старт iOS приложения на примере iOS Почты Mail.Ru / Николай Морев (Ma...Ontico
 
Переезжаем с Zabbix на Prometheus / Василий Озеров (fevlake)
Переезжаем с Zabbix на Prometheus / Василий Озеров (fevlake)Переезжаем с Zabbix на Prometheus / Василий Озеров (fevlake)
Переезжаем с Zabbix на Prometheus / Василий Озеров (fevlake)Ontico
 
Что нового в NOVA Microhypervisor
Что нового в NOVA MicrohypervisorЧто нового в NOVA Microhypervisor
Что нового в NOVA MicrohypervisorYandex
 

What's hot (20)

CodeFest 2012. Аксёнов А. — Как мы разрабатываем Sphinx
CodeFest 2012. Аксёнов А. — Как мы разрабатываем SphinxCodeFest 2012. Аксёнов А. — Как мы разрабатываем Sphinx
CodeFest 2012. Аксёнов А. — Как мы разрабатываем Sphinx
 
Continuousdelivery
ContinuousdeliveryContinuousdelivery
Continuousdelivery
 
Кит на службе у человека microPaaS Deis / Алексей Медведчиков (2ГИС)
Кит на службе у человека microPaaS Deis / Алексей Медведчиков (2ГИС)Кит на службе у человека microPaaS Deis / Алексей Медведчиков (2ГИС)
Кит на службе у человека microPaaS Deis / Алексей Медведчиков (2ГИС)
 
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
 
«​Масштабируемый DevOps​» Александр Колесень
«​Масштабируемый DevOps​» Александр Колесень«​Масштабируемый DevOps​» Александр Колесень
«​Масштабируемый DevOps​» Александр Колесень
 
DevOps-40 meetup #7, Project FiFo
DevOps-40 meetup #7, Project FiFoDevOps-40 meetup #7, Project FiFo
DevOps-40 meetup #7, Project FiFo
 
Проникновение в Docker с примерами
Проникновение в Docker с примерамиПроникновение в Docker с примерами
Проникновение в Docker с примерами
 
2020.10.13 HA Redis is simple. FWDays Highload
2020.10.13 HA Redis is simple. FWDays Highload2020.10.13 HA Redis is simple. FWDays Highload
2020.10.13 HA Redis is simple. FWDays Highload
 
Puppet development kit and best practices
Puppet development kit and best practicesPuppet development kit and best practices
Puppet development kit and best practices
 
Денис Паясь
Денис ПаясьДенис Паясь
Денис Паясь
 
Java худеет. Спроси меня как. Уменьшение размера дистрибутива Java приложения...
Java худеет. Спроси меня как. Уменьшение размера дистрибутива Java приложения...Java худеет. Спроси меня как. Уменьшение размера дистрибутива Java приложения...
Java худеет. Спроси меня как. Уменьшение размера дистрибутива Java приложения...
 
Лучшие практики CI/CD с Kubernetes и GitLab / Дмитрий Столяров (Флант)
Лучшие практики CI/CD с Kubernetes и GitLab / Дмитрий Столяров (Флант)Лучшие практики CI/CD с Kubernetes и GitLab / Дмитрий Столяров (Флант)
Лучшие практики CI/CD с Kubernetes и GitLab / Дмитрий Столяров (Флант)
 
Инструменты тестирования ядра Linux
Инструменты тестирования ядра LinuxИнструменты тестирования ядра Linux
Инструменты тестирования ядра Linux
 
Formal verification of operating system kernels
Formal verification of operating system kernelsFormal verification of operating system kernels
Formal verification of operating system kernels
 
Мой Python всегда со мной!
Мой Python всегда со мной!Мой Python всегда со мной!
Мой Python всегда со мной!
 
SDN & DEVOPS ?= ❤: Практики использования SDN / Александр Шалимов (ЦПИКС, МГУ)
SDN & DEVOPS ?= ❤: Практики использования SDN / Александр Шалимов (ЦПИКС, МГУ)SDN & DEVOPS ?= ❤: Практики использования SDN / Александр Шалимов (ЦПИКС, МГУ)
SDN & DEVOPS ?= ❤: Практики использования SDN / Александр Шалимов (ЦПИКС, МГУ)
 
Быстрый старт iOS приложения на примере iOS Почты Mail.Ru / Николай Морев (Ma...
Быстрый старт iOS приложения на примере iOS Почты Mail.Ru / Николай Морев (Ma...Быстрый старт iOS приложения на примере iOS Почты Mail.Ru / Николай Морев (Ma...
Быстрый старт iOS приложения на примере iOS Почты Mail.Ru / Николай Морев (Ma...
 
Переезжаем с Zabbix на Prometheus / Василий Озеров (fevlake)
Переезжаем с Zabbix на Prometheus / Василий Озеров (fevlake)Переезжаем с Zabbix на Prometheus / Василий Озеров (fevlake)
Переезжаем с Zabbix на Prometheus / Василий Озеров (fevlake)
 
Что нового в NOVA Microhypervisor
Что нового в NOVA MicrohypervisorЧто нового в NOVA Microhypervisor
Что нового в NOVA Microhypervisor
 
Docker networking
Docker networkingDocker networking
Docker networking
 

Similar to Практика разработки веб-серверов на Rust

Релиз инжиниринг Mail.ru, взгляд изнутри / Максим Глеков (Mail.Ru Group)
Релиз инжиниринг Mail.ru, взгляд изнутри / Максим Глеков (Mail.Ru Group)Релиз инжиниринг Mail.ru, взгляд изнутри / Максим Глеков (Mail.Ru Group)
Релиз инжиниринг Mail.ru, взгляд изнутри / Максим Глеков (Mail.Ru Group)Ontico
 
Мобильность на Колёсах: об инструментах и полезных вещах
Мобильность на Колёсах: об инструментах и полезных вещахМобильность на Колёсах: об инструментах и полезных вещах
Мобильность на Колёсах: об инструментах и полезных вещахITCrowd Almaty
 
Net core and linux in production
Net core and linux in productionNet core and linux in production
Net core and linux in productionAnatoly Popov
 
Как мы собираем проекты в выделенном окружении в Windows Docker
Как мы собираем проекты в выделенном окружении в Windows DockerКак мы собираем проекты в выделенном окружении в Windows Docker
Как мы собираем проекты в выделенном окружении в Windows DockerPositive Hack Days
 
Масштабируемая архитектура фронтенда
Масштабируемая архитектура фронтендаМасштабируемая архитектура фронтенда
Масштабируемая архитектура фронтендаRoman Dvornov
 
развертывание среды Rails (антон веснин, Locum Ru)
развертывание среды Rails (антон веснин, Locum Ru)развертывание среды Rails (антон веснин, Locum Ru)
развертывание среды Rails (антон веснин, Locum Ru)guest40e031
 
антон веснин Rails Application Servers
антон веснин Rails Application Serversантон веснин Rails Application Servers
антон веснин Rails Application Serversrit2010
 
Кирилл Комлев. О реализации continuous integration для web проектов
Кирилл Комлев. О реализации continuous integration для web проектовКирилл Комлев. О реализации continuous integration для web проектов
Кирилл Комлев. О реализации continuous integration для web проектовOlesya_V
 
Подходы и технологии, используемые в разработке iOS-клиента Viber, Кирилл Лаш...
Подходы и технологии, используемые в разработке iOS-клиента Viber, Кирилл Лаш...Подходы и технологии, используемые в разработке iOS-клиента Viber, Кирилл Лаш...
Подходы и технологии, используемые в разработке iOS-клиента Viber, Кирилл Лаш...Yandex
 
Советы для начинающих разработчиков PostgreSQL
Советы для начинающих разработчиков PostgreSQL Советы для начинающих разработчиков PostgreSQL
Советы для начинающих разработчиков PostgreSQL Anastasia Lubennikova
 
Облако в Badoo год спустя - работа над ошибками, Юрий Насретдинов (Badoo)
Облако в Badoo год спустя - работа над ошибками, Юрий Насретдинов (Badoo)Облако в Badoo год спустя - работа над ошибками, Юрий Насретдинов (Badoo)
Облако в Badoo год спустя - работа над ошибками, Юрий Насретдинов (Badoo)Badoo Development
 
Облако в Badoo год спустя
Облако в Badoo год спустяОблако в Badoo год спустя
Облако в Badoo год спустяYuriy Nasretdinov
 
Облако в Badoo год спустя - работа над ошибками, Юрий Насретдинов (Badoo)
Облако в Badoo год спустя - работа над ошибками, Юрий Насретдинов (Badoo)Облако в Badoo год спустя - работа над ошибками, Юрий Насретдинов (Badoo)
Облако в Badoo год спустя - работа над ошибками, Юрий Насретдинов (Badoo)Ontico
 
Daemons In Web on #devrus
Daemons In Web on #devrusDaemons In Web on #devrus
Daemons In Web on #devrusAlex Chistyakov
 
Юрий Василевский "Автоматизация в XCode"
Юрий Василевский "Автоматизация в XCode"Юрий Василевский "Автоматизация в XCode"
Юрий Василевский "Автоматизация в XCode"Yandex
 
Юрий Василевский «Автоматизация в XCode»
Юрий Василевский «Автоматизация в XCode»Юрий Василевский «Автоматизация в XCode»
Юрий Василевский «Автоматизация в XCode»Yandex
 
Процессы разработки в Яндексе
Процессы разработки в ЯндексеПроцессы разработки в Яндексе
Процессы разработки в ЯндексеAndrey Kazarinov
 
Python Development process in Yandex
Python Development process in YandexPython Development process in Yandex
Python Development process in Yandexaviatakz
 
Опыт эксплуатации большого проекта на Ruby
Опыт эксплуатации большого проекта на RubyОпыт эксплуатации большого проекта на Ruby
Опыт эксплуатации большого проекта на RubyAlex Chistyakov
 

Similar to Практика разработки веб-серверов на Rust (20)

Релиз инжиниринг Mail.ru, взгляд изнутри / Максим Глеков (Mail.Ru Group)
Релиз инжиниринг Mail.ru, взгляд изнутри / Максим Глеков (Mail.Ru Group)Релиз инжиниринг Mail.ru, взгляд изнутри / Максим Глеков (Mail.Ru Group)
Релиз инжиниринг Mail.ru, взгляд изнутри / Максим Глеков (Mail.Ru Group)
 
Мобильность на Колёсах: об инструментах и полезных вещах
Мобильность на Колёсах: об инструментах и полезных вещахМобильность на Колёсах: об инструментах и полезных вещах
Мобильность на Колёсах: об инструментах и полезных вещах
 
Net core and linux in production
Net core and linux in productionNet core and linux in production
Net core and linux in production
 
Как мы собираем проекты в выделенном окружении в Windows Docker
Как мы собираем проекты в выделенном окружении в Windows DockerКак мы собираем проекты в выделенном окружении в Windows Docker
Как мы собираем проекты в выделенном окружении в Windows Docker
 
Масштабируемая архитектура фронтенда
Масштабируемая архитектура фронтендаМасштабируемая архитектура фронтенда
Масштабируемая архитектура фронтенда
 
развертывание среды Rails (антон веснин, Locum Ru)
развертывание среды Rails (антон веснин, Locum Ru)развертывание среды Rails (антон веснин, Locum Ru)
развертывание среды Rails (антон веснин, Locum Ru)
 
антон веснин Rails Application Servers
антон веснин Rails Application Serversантон веснин Rails Application Servers
антон веснин Rails Application Servers
 
Кирилл Комлев. О реализации continuous integration для web проектов
Кирилл Комлев. О реализации continuous integration для web проектовКирилл Комлев. О реализации continuous integration для web проектов
Кирилл Комлев. О реализации continuous integration для web проектов
 
Подходы и технологии, используемые в разработке iOS-клиента Viber, Кирилл Лаш...
Подходы и технологии, используемые в разработке iOS-клиента Viber, Кирилл Лаш...Подходы и технологии, используемые в разработке iOS-клиента Viber, Кирилл Лаш...
Подходы и технологии, используемые в разработке iOS-клиента Viber, Кирилл Лаш...
 
Gitlab devconf
Gitlab devconfGitlab devconf
Gitlab devconf
 
Советы для начинающих разработчиков PostgreSQL
Советы для начинающих разработчиков PostgreSQL Советы для начинающих разработчиков PostgreSQL
Советы для начинающих разработчиков PostgreSQL
 
Облако в Badoo год спустя - работа над ошибками, Юрий Насретдинов (Badoo)
Облако в Badoo год спустя - работа над ошибками, Юрий Насретдинов (Badoo)Облако в Badoo год спустя - работа над ошибками, Юрий Насретдинов (Badoo)
Облако в Badoo год спустя - работа над ошибками, Юрий Насретдинов (Badoo)
 
Облако в Badoo год спустя
Облако в Badoo год спустяОблако в Badoo год спустя
Облако в Badoo год спустя
 
Облако в Badoo год спустя - работа над ошибками, Юрий Насретдинов (Badoo)
Облако в Badoo год спустя - работа над ошибками, Юрий Насретдинов (Badoo)Облако в Badoo год спустя - работа над ошибками, Юрий Насретдинов (Badoo)
Облако в Badoo год спустя - работа над ошибками, Юрий Насретдинов (Badoo)
 
Daemons In Web on #devrus
Daemons In Web on #devrusDaemons In Web on #devrus
Daemons In Web on #devrus
 
Юрий Василевский "Автоматизация в XCode"
Юрий Василевский "Автоматизация в XCode"Юрий Василевский "Автоматизация в XCode"
Юрий Василевский "Автоматизация в XCode"
 
Юрий Василевский «Автоматизация в XCode»
Юрий Василевский «Автоматизация в XCode»Юрий Василевский «Автоматизация в XCode»
Юрий Василевский «Автоматизация в XCode»
 
Процессы разработки в Яндексе
Процессы разработки в ЯндексеПроцессы разработки в Яндексе
Процессы разработки в Яндексе
 
Python Development process in Yandex
Python Development process in YandexPython Development process in Yandex
Python Development process in Yandex
 
Опыт эксплуатации большого проекта на Ruby
Опыт эксплуатации большого проекта на RubyОпыт эксплуатации большого проекта на Ruby
Опыт эксплуатации большого проекта на Ruby
 

Практика разработки веб-серверов на Rust