SlideShare a Scribd company logo
1 of 65
Язык Rust для высоконагруженного
сетевого сервиса - быстрый старт и
стремительный полет
Александр Сербул
Head of Data Science, ООО «1С-Битрикс»
О чем поговорим
Делимся опытом. Никакой рекламы и философских выводов:
• Что происходит в IT и языках программирования «на самом деле»
• История проекта отправки push-уведомлений Битрикс24
• Как мы развивали архитектуру проекта: от bash-forks до
Rust/Tokio
• Одновременно поговорим о высоконагруженной работой с сетью
в php, java, python, nodejs, golang и почему мы взяли Rust
• Как быстро понять Rust и его сравнение с другими ЯП
• Как начать решать задачи на Rust как можно быстрее, Cargo
• Подводные камни в Rust и способы их преодоления
• Выводы, рекомендации для будущих проектов и нагруженных
сетевых архитектур
Что происходит
в IT и языках
программирования
«на самом деле» -
и что подарил миру Rust?
Как все начиналось…
• Архитектура фон Неймана и машина
Тьюринга
• Процедурные языки программирования
• Объектно-ориентированные языки
программирования
• Функциональные языки
программирования
• Гибридные языки программирования
Все не заладилось с самого начала…
Архитектура фон Неймана
Машина Тьюринга
Универсальный вычислитель…
Машина Тьюринга
Теорема Гёделя о неполноте…
Современный код
cовременный Код
Управление сложностью
- инкапсуляция (все лишнее – скрыто
поглубже)
- абстракция (сложное становится простым,
фасады)
- иерархии абстракций
- большое количество автотестов
Haskell: “Quicksort”
А могло же быть так: просто и сексуально
Эдсгер Дейкстра
Чем все закончилось…
• Человечество – просиживает в соцсетях, в онлайн-играх и на
сайтах для взрослых
• Настоящее программирование – требует сильного
напряжения ума и, желательно, знания математики
• Взрослые люди – не хотят учиться, а это нужно для успеха в IT
• Языки программирования – создаются методом копирования
идей, борьба за разработчиков
• Думать и учить логически строгие ЯП типа Haskell - никто не
хочет
Войны технологий – усугубляют сложность
• Вместо сотрудничества – конкуренция на рынке
• Вместо «развития» языков (Scala, Rust), отмечается
«межвидовая мутация» (Node.js) и параллельное
изобретение велосипедов
• Масштабные религиозные войны: Java vs C#, PHP vs Python vs
Ruby
• Войны фреймворков: Angular vs React JS
• “Зачем делать просто, если можно сложно?”
«Шовинизм» в программировании
•Вы писали 5 лет на PHP… Но почему, за деньги
чтоль? – на работу не беру
•Вы только байтики умеете на C гонять? – в нашу
компанию вы не подходите
•Только Java/Spring, только своих… - и пофиг на
скорость, качество, результат
•С#/Windows forever
•Гошечка, милая гошечка…
Докладчик сошел с ума 
Все свободны.
Спасибо за внимание!
Выразительность языков программирования
С – переносимый
ассемблер
С++ - много мелких тонкостей и
«дыр», большое и противоречивое
наследство
Ассемблер
Java
Erlang
C#Scala Kotlin
Haskell
Akka/JVM
F#
Go
PHP
Groovy
Python
Ruby
Java ScriptLua
PHP
Выразительность языков программирования
С – переносимый
ассемблер
С++ - много мелких тонкостей и
«дыр», большое и противоречивое
наследство
Ассемблер
Java C#Scala Kotlin
Groovy
Python
Ruby
Java ScriptLua
Go
Rust Erlang
Haskell
Akka/JVM
F#
Выразительность в Rust
• Zero-cost (!) абстракции: итераторы, фильтры, мап-редьюсы …
• Автовывод типов
• Нет NULL, даже как концепции
• Алгебраические типы данных (ADT)
• Надежный pattern-matching по ADT
• Защита от «опасных» операций с массивами, числами (переполнения …);
“panic!”
• Компилятор дает надежные гарантии безопасности при работе с памятью
и автоматически освобождает ее – нет сборщика мусора
• Очень мощный и строгий макро-язык
• Нельзя напороться на «Undefined Behavior» (кроме как в unsafe
режиме, но это нужно прямо постараться)
Управление памятью
С
С++
Ассемблер
Java
Erlang
PHP
C#Scala
Kotlin
Groovy
Haskell
Python Ruby
Java ScriptLua
Akka/JVM
F#
Go
Управление памятью
С
С++
Ассемблер
Java
Erlang
PHP
C#Scala
Kotlin
Groovy
Haskell
Python Ruby
Java ScriptLua
Akka/JVM
F#
Go Rust
Управление памятью в Rust
•Владение объектами (ownership)
•Передача объектов между функциями (move) и
автоматический вызов «деструкторов» когда «пора»
•Заимствование объектов (borrowing) при передаче
по ссылке, в функции, ссылочная целостность
•Slices, lifetimes
•No dangling references
Как быстро понять Rust
и его сравнение
с другими ЯП
Философии
• Python
• JavaScript/Node.js
• TypeScript
• PHP
• Java/C#
• Scala/Kotlin
• C/C++
• Haskell/ML
• Rust
Как набить руку в Rust
• “Rust by example”: https://doc.rust-lang.org/stable/rust-by-example/
• “The Book”: https://doc.rust-lang.org/book/
• “The Rustonomicon”: https://doc.rust-lang.org/nomicon/
Первые 2 ссылки лучше пройти с руками в консоли 2-3 раза и
потом все открывается и дальше легко.
Самое непривычное для понимания: аффинные типы данных,
алгебраические типы данных. Полезен опыт изучения FP.
Последняя ссылка самая сложная и тяжелая, но ее можно … не
читать 
Владение – копирование запрещено
Владение – копирование разрешено
Заимствование
Аффинные типы данных - проникли гораздо
глубже
• Концепции: ownership, move, borrowing – активно
применяются в многопоточном программировании и в
других местах (итераторы и др.)
• Забыть освободить Mutex – невозможно, не скомпилируется

• Поработать с инвалидированным итератором – невозможно,
не скомпилируется 
• Появилось больше времени на решение бизнес-задач
Начало работы с Rust
• «Непробиваемый» компилятор
• Rust-plugin IntelliJ IDEA
Сборка бинарника
Менеджмент проекта, toolchain
• Cargo.toml
• Cargo.lock
• “cargo build --release”
• “rustup update”
Автотестирование
• Unit tests
• Integration tests
• “cargo test”
Unsafe Rust
И да, сторонние пакеты из Cargo могут содержать блоки «unsafe» и вызывать неопределенное поведение, но это случается на
порядки реже, чем в связках python/c++ и т.п.
Итоги «плюшек» в Rust
• Пишешь быстро, как на python/php – автовывод типов
• Очень строгая типизация без NULLs с ADT/PM* – а не как
структурная в Golang/TypeScript или слабая динамическая в
PHP/JS или «строгая»-динамическая в Python
• Мощные гарантии компилятора: безопасная работа с
памятью, авто-очистка памяти
• Нет неопределенного поведения и прочих сюрпризов –
«безопасный» язык, как Python/PHP**
• Скорость как у C/C++!
* - алгебраические типы данных/сопоставление по шаблону
** - сюрпризы возможны в unsafe-режиме языка, но их на порядки меньше
Как мы развивали
архитектуру проекта:
от bash-forks до rust/tokio
Пуши - технологии
• Apple Push Notification service (APNs) - June 17, 2009; >=
iOS 3.0, >= OS X v10.7 (Lion); max message - 256 B
https://developer.apple.com/notifications/
• Google Cloud Messaging for Android (GCM) –
June 27, 2012; >= Android 2.2; max message - 4 KB
http://developer.android.com/google/gcm/
ранее - Android Cloud to Device Messaging (C2DM)
APNS
Идеи в основе архитектуры
1. Провайдер регистрируется в APNs, GCM и получает
клиентский SSL/TLS-сертификат (ключ и т.п.)
2. Провайдер обслуживает запросы многих мобильных
приложений и идентифицирует себя в APNs, GCM с
помощью сертификата
• Нам нужно поддерживать 10к – 100к и больше мобильных
приложений
Провайдер 1,
Приложение
Провайдер N,
Приложение
«Супер» Провайдер
Клиентские SSL/TLS
сертификаты, ключи
APNS - протокол
• Бинарный протокол
• 2 формата: простой и расширенный
• Пишем/читаем SSL/TLS сокет
• Возвращает инфу о невалидных токенах устройств
GCM - протокол
• JSON/plain text
POST -> https://android.googleapis.com/gcm/send
Запрос:
Content-Type:application/json
Authorization:key=*aSyB-1uEai2WiUapxCs2Q0GZYzPu7Udno5aA
{
"registration_ids" : ["APA91bHun4MxP5egoKMwt2KZFBaFUH-1RYqx..."],
"data" : {
...
},
}
Ответ:
{ "multicast_id": 108,
"success": 1,
"failure": 0,
"canonical_ids": 0,
"results": [
{ "message_id": "1:08" }
]
}
Универсальный транспорт
Пакет BCM
Октеты в base64.
TWFuIGlzIGRpc3;2;NoZWQsIG5vdC;1;
ZXZlcmFuY2Ugb2YgZ…;3;…
[0-9]{1} – переключатель
формата: GCM, APNs …
Push-сообщение
Raw bytes, Json, txt, xml, …
SSL/TLS
клиентский
сертификат
APNS,
Ключ GCM
nginx
Идентификация и проксирование
сообщения в SQS
PHP-процесс
Long Pooling, получение и парсинг сообщения,
отправка Push на устройство
PHP-процесс
Long Pooling, получение и парсинг сообщения,
отправка Push на устройство
PHP-процесс
Long Pooling, получение и парсинг сообщения,
отправка Push на устройство
nginx
Идентификация и проксирование
сообщения в SQS
nginx
Идентификация и проксирование
сообщения в SQS
Итоговая архитектура (2013)
Недостатки архитектуры
• Синхронная работа с сокетами при отправке push-
уведомлений в GCM/APNs
• За счет скриптовых языков – высокая нагрузка на CPU
1) Итерация 1: PHP форкает системный процесс отправки push
2) Итерация 2: PHP начал работать с сокетами сам
Нагрузка:
до 1000 SQS-сообщений в секунду
до 1000-15 000 отправляемых пуш-уведомлений в секунду
Нагрузка, железо
Нагрузка:
до 1000 SQS-сообщений в секунду
до 1000-15 000 отправляемых пуш-уведомлений в секунду
• На PHP кластер жил за 6-8 серверах с 16-32 CPU и 16-32 ГБ ОЗУ и нагрузка
постоянно росла
• На Rust - нагрузку пушей Битрикс24 держит один сервер 4 CPU 8 ГБ ОЗУ
(процесс, он один, занимает 3.5 ГБ в ОЗУ)
TCP - не кешируются, ключи на диске - не кешируются. Это еще сильнее
снизит нагрузку.
Проект на Rust - обзор
• Стандартные зависимости в Cargo
• Сетевая асинхронная “монадическая” библиотека с корутинами – Tokio
• Немного танцев с бубнами с TLS, но исходники помогли быстро
• При росте нагрузки резко начались segfaults, но быстро полечились через
увеличение ulimit ОС, видимо, наступили на ограничение стека на
процесс и наступала нирвана
• Никаких проблем, падений, анализов coredump
• Никаких утечек памяти, Rust использует стандартные: malloc или jemalloc
или можно выбрать
• Никаких тюнингов GC и нагрузок от сборщика мусора 
Проект на Rust - обзор
Проект на Rust - тесты
• Сразу пишутся тесты
• За счет ADT/PM, отсутствия NULLs, Enums
– тесты больше занимаются делом
• В самом языке много вкусных
функциональных библиотек с Zero-cost
abstraction (итераторы, диапазоны,
фильтры, мап-редьюсы)
• В Tokio тоже монадически-
функциональный подход
Проект на Rust - ADT
Проект на Rust – Pattern Matching
Проект на Rust – присваивание из PM
Проект на Rust – “Option” monad
Проект на Rust – TCP monads
Проект на Rust – monadic network error handling
Zero-cost - функциональщина
ООП? Traits!
• Развитого ООП, как в
Java/C# - нет и не
планируется. А зачем?
• Структурки и методы,
навешанные на них
• Но за счет строгой
типизации, ADT/PM,
аффинных типов и
сильных гарантий
компилятора – этого
хватает
А что если взять …
•Node.js
•Python – корутины
•Golang - горутины
•Java/Netty
•Erlang
•Haskell
•С++
Итоги
• Rust только кажется сложным. За сложностью скрывается строгость,
простота и элегантность
• Язык привносит несколько очень мощных и непривычных концепций,
направленных на надежное программирование, в т.ч. системное
• Компилятор дает очень высокие гарантии по работе с памятью и многие
другие (переполнения, доступ за пределы массива …) и его нужно
«преодолевать»
• На языке легко писать, причем быстро и сразу без ошибок
• Алгебраические типы данных, строгий pattern-matching и отсутствие NULLs
хорошо структурируют код и сильно ускоряют разработку
• В Cargo «из коробки» много готовых модулей, бери и используй
• Скорость решения сравнима с C, потребление ОЗУ без сборщика мусора
минимально.
Спасибо за
внимание!
Вопросы?
Александр Сербул
@AlexSerbul
Alexandr Serbul
serbul@1c-bitrix.ru

More Related Content

What's hot

Пайплайн машинного обучения на Apache Spark / Павел Клеменков (Rambler&Co)
Пайплайн машинного обучения на Apache Spark / Павел Клеменков (Rambler&Co)Пайплайн машинного обучения на Apache Spark / Павел Клеменков (Rambler&Co)
Пайплайн машинного обучения на Apache Spark / Павел Клеменков (Rambler&Co)Ontico
 
NVMf: 5 млн IOPS по сети своими руками / Андрей Николаенко (IBS)
NVMf: 5 млн IOPS по сети своими руками / Андрей Николаенко (IBS)NVMf: 5 млн IOPS по сети своими руками / Андрей Николаенко (IBS)
NVMf: 5 млн IOPS по сети своими руками / Андрей Николаенко (IBS)Ontico
 
Веб-разработка без наркотиков с помощью PostgreSQL, Nginx и c2h5oh / Миша Кир...
Веб-разработка без наркотиков с помощью PostgreSQL, Nginx и c2h5oh / Миша Кир...Веб-разработка без наркотиков с помощью PostgreSQL, Nginx и c2h5oh / Миша Кир...
Веб-разработка без наркотиков с помощью PostgreSQL, Nginx и c2h5oh / Миша Кир...Ontico
 
Алексей Фомкин, Практическое применение Web Workers
Алексей Фомкин, Практическое применение Web WorkersАлексей Фомкин, Практическое применение Web Workers
Алексей Фомкин, Практическое применение Web WorkersAleksey Fomkin
 
Как собирать gps треки раз в секунду, экономя траффик
Как собирать gps треки раз в секунду, экономя траффикКак собирать gps треки раз в секунду, экономя траффик
Как собирать gps треки раз в секунду, экономя траффикAndrew Minkin
 
Мой маленький уютный PaaS / Илья Беда (bro.agency)
Мой маленький уютный PaaS / Илья Беда (bro.agency)Мой маленький уютный PaaS / Илья Беда (bro.agency)
Мой маленький уютный PaaS / Илья Беда (bro.agency)Ontico
 
Android Cloud... точнее Cloud из Android / Охрименко Алексей (Acronis)
Android Cloud... точнее Cloud из Android / Охрименко Алексей (Acronis)Android Cloud... точнее Cloud из Android / Охрименко Алексей (Acronis)
Android Cloud... точнее Cloud из Android / Охрименко Алексей (Acronis)Ontico
 
Где живут Ваши объявления / Тюрин Михаил (Avito)
Где живут Ваши объявления / Тюрин Михаил (Avito)Где живут Ваши объявления / Тюрин Михаил (Avito)
Где живут Ваши объявления / Тюрин Михаил (Avito)Ontico
 
Кит на службе у человека microPaaS Deis / Алексей Медведчиков (2ГИС)
Кит на службе у человека microPaaS Deis / Алексей Медведчиков (2ГИС)Кит на службе у человека microPaaS Deis / Алексей Медведчиков (2ГИС)
Кит на службе у человека microPaaS Deis / Алексей Медведчиков (2ГИС)Ontico
 
Консольные приложения на Go
Консольные приложения на GoКонсольные приложения на Go
Консольные приложения на GoAndrey Smirnov
 
LuaJIT как основа для сервера приложений - проблемы и решения / Игорь Эрлих (...
LuaJIT как основа для сервера приложений - проблемы и решения / Игорь Эрлих (...LuaJIT как основа для сервера приложений - проблемы и решения / Игорь Эрлих (...
LuaJIT как основа для сервера приложений - проблемы и решения / Игорь Эрлих (...Ontico
 
Антон Турецкий
Антон ТурецкийАнтон Турецкий
Антон ТурецкийCodeFest
 
AVITO. Решаем проблемы по мере их поступления. Стачка 2013
AVITO. Решаем проблемы по мере их поступления. Стачка 2013AVITO. Решаем проблемы по мере их поступления. Стачка 2013
AVITO. Решаем проблемы по мере их поступления. Стачка 2013Roman Pavlushko
 
Релиз инжиниринг Mail.ru, взгляд изнутри / Максим Глеков (Mail.Ru Group)
Релиз инжиниринг Mail.ru, взгляд изнутри / Максим Глеков (Mail.Ru Group)Релиз инжиниринг Mail.ru, взгляд изнутри / Максим Глеков (Mail.Ru Group)
Релиз инжиниринг Mail.ru, взгляд изнутри / Максим Глеков (Mail.Ru Group)Ontico
 
Нагруженный поиск на Sphinx
Нагруженный поиск на SphinxНагруженный поиск на Sphinx
Нагруженный поиск на SphinxRoman Pavlushko
 
OpenResty: превращаем NGINX в полноценный сервер приложений / Владимир Прота...
OpenResty: превращаем NGINX в полноценный сервер приложений  / Владимир Прота...OpenResty: превращаем NGINX в полноценный сервер приложений  / Владимир Прота...
OpenResty: превращаем NGINX в полноценный сервер приложений / Владимир Прота...Ontico
 
Эффективная отладка репликации MySQL / Света Смирнова (Percona)
Эффективная отладка репликации MySQL / Света Смирнова (Percona)Эффективная отладка репликации MySQL / Света Смирнова (Percona)
Эффективная отладка репликации MySQL / Света Смирнова (Percona)Ontico
 
Twisted Framework - фреймворк для написания сетевых приложений на Python (Анд...
Twisted Framework - фреймворк для написания сетевых приложений на Python (Анд...Twisted Framework - фреймворк для написания сетевых приложений на Python (Анд...
Twisted Framework - фреймворк для написания сетевых приложений на Python (Анд...Ontico
 
Flashcache в mamba.ru / Яковлев Александр Юрьевич (ЗАО Мамба)
Flashcache в mamba.ru / Яковлев Александр Юрьевич (ЗАО Мамба)Flashcache в mamba.ru / Яковлев Александр Юрьевич (ЗАО Мамба)
Flashcache в mamba.ru / Яковлев Александр Юрьевич (ЗАО Мамба)Ontico
 
Архитектура поиска в Booking.com / Иван Круглов (Booking.com)
Архитектура поиска в Booking.com / Иван Круглов (Booking.com)Архитектура поиска в Booking.com / Иван Круглов (Booking.com)
Архитектура поиска в Booking.com / Иван Круглов (Booking.com)Ontico
 

What's hot (20)

Пайплайн машинного обучения на Apache Spark / Павел Клеменков (Rambler&Co)
Пайплайн машинного обучения на Apache Spark / Павел Клеменков (Rambler&Co)Пайплайн машинного обучения на Apache Spark / Павел Клеменков (Rambler&Co)
Пайплайн машинного обучения на Apache Spark / Павел Клеменков (Rambler&Co)
 
NVMf: 5 млн IOPS по сети своими руками / Андрей Николаенко (IBS)
NVMf: 5 млн IOPS по сети своими руками / Андрей Николаенко (IBS)NVMf: 5 млн IOPS по сети своими руками / Андрей Николаенко (IBS)
NVMf: 5 млн IOPS по сети своими руками / Андрей Николаенко (IBS)
 
Веб-разработка без наркотиков с помощью PostgreSQL, Nginx и c2h5oh / Миша Кир...
Веб-разработка без наркотиков с помощью PostgreSQL, Nginx и c2h5oh / Миша Кир...Веб-разработка без наркотиков с помощью PostgreSQL, Nginx и c2h5oh / Миша Кир...
Веб-разработка без наркотиков с помощью PostgreSQL, Nginx и c2h5oh / Миша Кир...
 
Алексей Фомкин, Практическое применение Web Workers
Алексей Фомкин, Практическое применение Web WorkersАлексей Фомкин, Практическое применение Web Workers
Алексей Фомкин, Практическое применение Web Workers
 
Как собирать gps треки раз в секунду, экономя траффик
Как собирать gps треки раз в секунду, экономя траффикКак собирать gps треки раз в секунду, экономя траффик
Как собирать gps треки раз в секунду, экономя траффик
 
Мой маленький уютный PaaS / Илья Беда (bro.agency)
Мой маленький уютный PaaS / Илья Беда (bro.agency)Мой маленький уютный PaaS / Илья Беда (bro.agency)
Мой маленький уютный PaaS / Илья Беда (bro.agency)
 
Android Cloud... точнее Cloud из Android / Охрименко Алексей (Acronis)
Android Cloud... точнее Cloud из Android / Охрименко Алексей (Acronis)Android Cloud... точнее Cloud из Android / Охрименко Алексей (Acronis)
Android Cloud... точнее Cloud из Android / Охрименко Алексей (Acronis)
 
Где живут Ваши объявления / Тюрин Михаил (Avito)
Где живут Ваши объявления / Тюрин Михаил (Avito)Где живут Ваши объявления / Тюрин Михаил (Avito)
Где живут Ваши объявления / Тюрин Михаил (Avito)
 
Кит на службе у человека microPaaS Deis / Алексей Медведчиков (2ГИС)
Кит на службе у человека microPaaS Deis / Алексей Медведчиков (2ГИС)Кит на службе у человека microPaaS Deis / Алексей Медведчиков (2ГИС)
Кит на службе у человека microPaaS Deis / Алексей Медведчиков (2ГИС)
 
Консольные приложения на Go
Консольные приложения на GoКонсольные приложения на Go
Консольные приложения на Go
 
LuaJIT как основа для сервера приложений - проблемы и решения / Игорь Эрлих (...
LuaJIT как основа для сервера приложений - проблемы и решения / Игорь Эрлих (...LuaJIT как основа для сервера приложений - проблемы и решения / Игорь Эрлих (...
LuaJIT как основа для сервера приложений - проблемы и решения / Игорь Эрлих (...
 
Антон Турецкий
Антон ТурецкийАнтон Турецкий
Антон Турецкий
 
AVITO. Решаем проблемы по мере их поступления. Стачка 2013
AVITO. Решаем проблемы по мере их поступления. Стачка 2013AVITO. Решаем проблемы по мере их поступления. Стачка 2013
AVITO. Решаем проблемы по мере их поступления. Стачка 2013
 
Релиз инжиниринг Mail.ru, взгляд изнутри / Максим Глеков (Mail.Ru Group)
Релиз инжиниринг Mail.ru, взгляд изнутри / Максим Глеков (Mail.Ru Group)Релиз инжиниринг Mail.ru, взгляд изнутри / Максим Глеков (Mail.Ru Group)
Релиз инжиниринг Mail.ru, взгляд изнутри / Максим Глеков (Mail.Ru Group)
 
Нагруженный поиск на Sphinx
Нагруженный поиск на SphinxНагруженный поиск на Sphinx
Нагруженный поиск на Sphinx
 
OpenResty: превращаем NGINX в полноценный сервер приложений / Владимир Прота...
OpenResty: превращаем NGINX в полноценный сервер приложений  / Владимир Прота...OpenResty: превращаем NGINX в полноценный сервер приложений  / Владимир Прота...
OpenResty: превращаем NGINX в полноценный сервер приложений / Владимир Прота...
 
Эффективная отладка репликации MySQL / Света Смирнова (Percona)
Эффективная отладка репликации MySQL / Света Смирнова (Percona)Эффективная отладка репликации MySQL / Света Смирнова (Percona)
Эффективная отладка репликации MySQL / Света Смирнова (Percona)
 
Twisted Framework - фреймворк для написания сетевых приложений на Python (Анд...
Twisted Framework - фреймворк для написания сетевых приложений на Python (Анд...Twisted Framework - фреймворк для написания сетевых приложений на Python (Анд...
Twisted Framework - фреймворк для написания сетевых приложений на Python (Анд...
 
Flashcache в mamba.ru / Яковлев Александр Юрьевич (ЗАО Мамба)
Flashcache в mamba.ru / Яковлев Александр Юрьевич (ЗАО Мамба)Flashcache в mamba.ru / Яковлев Александр Юрьевич (ЗАО Мамба)
Flashcache в mamba.ru / Яковлев Александр Юрьевич (ЗАО Мамба)
 
Архитектура поиска в Booking.com / Иван Круглов (Booking.com)
Архитектура поиска в Booking.com / Иван Круглов (Booking.com)Архитектура поиска в Booking.com / Иван Круглов (Booking.com)
Архитектура поиска в Booking.com / Иван Круглов (Booking.com)
 

Similar to Alexandr Serbul "The Rust language for a high-load network service - a quick start and fast flight"

Rust - GDG DevFest Siberia 2016
Rust - GDG DevFest Siberia 2016Rust - GDG DevFest Siberia 2016
Rust - GDG DevFest Siberia 2016Nikita Baksalyar
 
CodeFest 2013. Лузин А. — Бэкенд-винегрет: как подружить разные ЯП на ваших с...
CodeFest 2013. Лузин А. — Бэкенд-винегрет: как подружить разные ЯП на ваших с...CodeFest 2013. Лузин А. — Бэкенд-винегрет: как подружить разные ЯП на ваших с...
CodeFest 2013. Лузин А. — Бэкенд-винегрет: как подружить разные ЯП на ваших с...CodeFest
 
Алексей Туля - А нужен ли вам erlang?
Алексей Туля - А нужен ли вам erlang?Алексей Туля - А нужен ли вам erlang?
Алексей Туля - А нужен ли вам erlang?Minsk Linux User Group
 
CodeFest 2014. Каплуновский Б. — Использование асинхронного I/O для снижения ...
CodeFest 2014. Каплуновский Б. — Использование асинхронного I/O для снижения ...CodeFest 2014. Каплуновский Б. — Использование асинхронного I/O для снижения ...
CodeFest 2014. Каплуновский Б. — Использование асинхронного I/O для снижения ...CodeFest
 
2017-03-26 01 Анна Тарасенко. Как устроен Web изнутри
2017-03-26 01 Анна Тарасенко. Как устроен Web изнутри2017-03-26 01 Анна Тарасенко. Как устроен Web изнутри
2017-03-26 01 Анна Тарасенко. Как устроен Web изнутриHappyDev-lite
 
Опыт работы с LuaJIT в нагруженных интернет-проектах / Александр Гладыш (Logi...
Опыт работы с LuaJIT в нагруженных интернет-проектах / Александр Гладыш (Logi...Опыт работы с LuaJIT в нагруженных интернет-проектах / Александр Гладыш (Logi...
Опыт работы с LuaJIT в нагруженных интернет-проектах / Александр Гладыш (Logi...Ontico
 
Основные понятия связанные с разработкой ПО: просто о сложном. Лаабе Дмитрий.
Основные понятия связанные с разработкой ПО: просто о сложном. Лаабе Дмитрий.Основные понятия связанные с разработкой ПО: просто о сложном. Лаабе Дмитрий.
Основные понятия связанные с разработкой ПО: просто о сложном. Лаабе Дмитрий.IT-Доминанта
 
игровая логика, проблемы и решения
игровая логика, проблемы и решенияигровая логика, проблемы и решения
игровая логика, проблемы и решенияВладимир Кожаев
 
GetDev.NET: Снова Эрланг
GetDev.NET: Снова ЭрлангGetDev.NET: Снова Эрланг
GetDev.NET: Снова ЭрлангMaxim Krentovskiy
 
Scripting languages
Scripting languagesScripting languages
Scripting languagesLev Panov
 
Введение в Python и Django
Введение в Python и DjangoВведение в Python и Django
Введение в Python и DjangoTaras Lyapun
 
Разработка API для большого, нагруженного сервиса
Разработка API для большого, нагруженного сервисаРазработка API для большого, нагруженного сервиса
Разработка API для большого, нагруженного сервисаITCrowd Almaty
 
Разработка API для большого, нагруженного сервиса
Разработка API для большого, нагруженного сервисаРазработка API для большого, нагруженного сервиса
Разработка API для большого, нагруженного сервисаendeveit
 
BlackBox testing
BlackBox testingBlackBox testing
BlackBox testingbeched
 
SECON'2016. Бартунов Олег, Карьера в Open Source
SECON'2016. Бартунов Олег, Карьера в Open SourceSECON'2016. Бартунов Олег, Карьера в Open Source
SECON'2016. Бартунов Олег, Карьера в Open SourceSECON
 
Никита Вельмаскин - Интерпретатор или думаем над скриптовым движком для Ваше...
Никита Вельмаскин -  Интерпретатор или думаем над скриптовым движком для Ваше...Никита Вельмаскин -  Интерпретатор или думаем над скриптовым движком для Ваше...
Никита Вельмаскин - Интерпретатор или думаем над скриптовым движком для Ваше...IT Share
 
C++ Core Guidelines
C++ Core Guidelines C++ Core Guidelines
C++ Core Guidelines Sergey Zubkov
 
«Сетевые протоколы для веб разработчика — выжимаем максимум»
«Сетевые протоколы для веб разработчика — выжимаем максимум» «Сетевые протоколы для веб разработчика — выжимаем максимум»
«Сетевые протоколы для веб разработчика — выжимаем максимум» Гузель Рахимова
 

Similar to Alexandr Serbul "The Rust language for a high-load network service - a quick start and fast flight" (20)

Rust - GDG DevFest Siberia 2016
Rust - GDG DevFest Siberia 2016Rust - GDG DevFest Siberia 2016
Rust - GDG DevFest Siberia 2016
 
CodeFest 2013. Лузин А. — Бэкенд-винегрет: как подружить разные ЯП на ваших с...
CodeFest 2013. Лузин А. — Бэкенд-винегрет: как подружить разные ЯП на ваших с...CodeFest 2013. Лузин А. — Бэкенд-винегрет: как подружить разные ЯП на ваших с...
CodeFest 2013. Лузин А. — Бэкенд-винегрет: как подружить разные ЯП на ваших с...
 
Алексей Туля - А нужен ли вам erlang?
Алексей Туля - А нужен ли вам erlang?Алексей Туля - А нужен ли вам erlang?
Алексей Туля - А нужен ли вам erlang?
 
CodeFest 2014. Каплуновский Б. — Использование асинхронного I/O для снижения ...
CodeFest 2014. Каплуновский Б. — Использование асинхронного I/O для снижения ...CodeFest 2014. Каплуновский Б. — Использование асинхронного I/O для снижения ...
CodeFest 2014. Каплуновский Б. — Использование асинхронного I/O для снижения ...
 
2017-03-26 01 Анна Тарасенко. Как устроен Web изнутри
2017-03-26 01 Анна Тарасенко. Как устроен Web изнутри2017-03-26 01 Анна Тарасенко. Как устроен Web изнутри
2017-03-26 01 Анна Тарасенко. Как устроен Web изнутри
 
Опыт работы с LuaJIT в нагруженных интернет-проектах / Александр Гладыш (Logi...
Опыт работы с LuaJIT в нагруженных интернет-проектах / Александр Гладыш (Logi...Опыт работы с LuaJIT в нагруженных интернет-проектах / Александр Гладыш (Logi...
Опыт работы с LuaJIT в нагруженных интернет-проектах / Александр Гладыш (Logi...
 
Основные понятия связанные с разработкой ПО: просто о сложном. Лаабе Дмитрий.
Основные понятия связанные с разработкой ПО: просто о сложном. Лаабе Дмитрий.Основные понятия связанные с разработкой ПО: просто о сложном. Лаабе Дмитрий.
Основные понятия связанные с разработкой ПО: просто о сложном. Лаабе Дмитрий.
 
игровая логика, проблемы и решения
игровая логика, проблемы и решенияигровая логика, проблемы и решения
игровая логика, проблемы и решения
 
Sivko
SivkoSivko
Sivko
 
GetDev.NET: Снова Эрланг
GetDev.NET: Снова ЭрлангGetDev.NET: Снова Эрланг
GetDev.NET: Снова Эрланг
 
Scripting languages
Scripting languagesScripting languages
Scripting languages
 
Введение в Python и Django
Введение в Python и DjangoВведение в Python и Django
Введение в Python и Django
 
Distributed systems
Distributed systemsDistributed systems
Distributed systems
 
Разработка API для большого, нагруженного сервиса
Разработка API для большого, нагруженного сервисаРазработка API для большого, нагруженного сервиса
Разработка API для большого, нагруженного сервиса
 
Разработка API для большого, нагруженного сервиса
Разработка API для большого, нагруженного сервисаРазработка API для большого, нагруженного сервиса
Разработка API для большого, нагруженного сервиса
 
BlackBox testing
BlackBox testingBlackBox testing
BlackBox testing
 
SECON'2016. Бартунов Олег, Карьера в Open Source
SECON'2016. Бартунов Олег, Карьера в Open SourceSECON'2016. Бартунов Олег, Карьера в Open Source
SECON'2016. Бартунов Олег, Карьера в Open Source
 
Никита Вельмаскин - Интерпретатор или думаем над скриптовым движком для Ваше...
Никита Вельмаскин -  Интерпретатор или думаем над скриптовым движком для Ваше...Никита Вельмаскин -  Интерпретатор или думаем над скриптовым движком для Ваше...
Никита Вельмаскин - Интерпретатор или думаем над скриптовым движком для Ваше...
 
C++ Core Guidelines
C++ Core Guidelines C++ Core Guidelines
C++ Core Guidelines
 
«Сетевые протоколы для веб разработчика — выжимаем максимум»
«Сетевые протоколы для веб разработчика — выжимаем максимум» «Сетевые протоколы для веб разработчика — выжимаем максимум»
«Сетевые протоколы для веб разработчика — выжимаем максимум»
 

More from Fwdays

"How Preply reduced ML model development time from 1 month to 1 day",Yevhen Y...
"How Preply reduced ML model development time from 1 month to 1 day",Yevhen Y..."How Preply reduced ML model development time from 1 month to 1 day",Yevhen Y...
"How Preply reduced ML model development time from 1 month to 1 day",Yevhen Y...Fwdays
 
"GenAI Apps: Our Journey from Ideas to Production Excellence",Danil Topchii
"GenAI Apps: Our Journey from Ideas to Production Excellence",Danil Topchii"GenAI Apps: Our Journey from Ideas to Production Excellence",Danil Topchii
"GenAI Apps: Our Journey from Ideas to Production Excellence",Danil TopchiiFwdays
 
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks..."LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...Fwdays
 
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr LapshynFwdays
 
"What is a RAG system and how to build it",Dmytro Spodarets
"What is a RAG system and how to build it",Dmytro Spodarets"What is a RAG system and how to build it",Dmytro Spodarets
"What is a RAG system and how to build it",Dmytro SpodaretsFwdays
 
"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii SoldatenkoFwdays
 
"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr BaganFwdays
 
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek SchlawackFwdays
 
"Distributed graphs and microservices in Prom.ua", Maksym Kindritskyi
"Distributed graphs and microservices in Prom.ua",  Maksym Kindritskyi"Distributed graphs and microservices in Prom.ua",  Maksym Kindritskyi
"Distributed graphs and microservices in Prom.ua", Maksym KindritskyiFwdays
 
"Rethinking the existing data loading and processing process as an ETL exampl...
"Rethinking the existing data loading and processing process as an ETL exampl..."Rethinking the existing data loading and processing process as an ETL exampl...
"Rethinking the existing data loading and processing process as an ETL exampl...Fwdays
 
"How Ukrainian IT specialist can go on vacation abroad without crossing the T...
"How Ukrainian IT specialist can go on vacation abroad without crossing the T..."How Ukrainian IT specialist can go on vacation abroad without crossing the T...
"How Ukrainian IT specialist can go on vacation abroad without crossing the T...Fwdays
 
"The Strength of Being Vulnerable: the experience from CIA, Tesla and Uber", ...
"The Strength of Being Vulnerable: the experience from CIA, Tesla and Uber", ..."The Strength of Being Vulnerable: the experience from CIA, Tesla and Uber", ...
"The Strength of Being Vulnerable: the experience from CIA, Tesla and Uber", ...Fwdays
 
"[QUICK TALK] Radical candor: how to achieve results faster thanks to a cultu...
"[QUICK TALK] Radical candor: how to achieve results faster thanks to a cultu..."[QUICK TALK] Radical candor: how to achieve results faster thanks to a cultu...
"[QUICK TALK] Radical candor: how to achieve results faster thanks to a cultu...Fwdays
 
"[QUICK TALK] PDP Plan, the only one door to raise your salary and boost care...
"[QUICK TALK] PDP Plan, the only one door to raise your salary and boost care..."[QUICK TALK] PDP Plan, the only one door to raise your salary and boost care...
"[QUICK TALK] PDP Plan, the only one door to raise your salary and boost care...Fwdays
 
"4 horsemen of the apocalypse of working relationships (+ antidotes to them)"...
"4 horsemen of the apocalypse of working relationships (+ antidotes to them)"..."4 horsemen of the apocalypse of working relationships (+ antidotes to them)"...
"4 horsemen of the apocalypse of working relationships (+ antidotes to them)"...Fwdays
 
"Reconnecting with Purpose: Rediscovering Job Interest after Burnout", Anast...
"Reconnecting with Purpose: Rediscovering Job Interest after Burnout",  Anast..."Reconnecting with Purpose: Rediscovering Job Interest after Burnout",  Anast...
"Reconnecting with Purpose: Rediscovering Job Interest after Burnout", Anast...Fwdays
 
"Mentoring 101: How to effectively invest experience in the success of others...
"Mentoring 101: How to effectively invest experience in the success of others..."Mentoring 101: How to effectively invest experience in the success of others...
"Mentoring 101: How to effectively invest experience in the success of others...Fwdays
 
"Mission (im) possible: How to get an offer in 2024?", Oleksandra Myronova
"Mission (im) possible: How to get an offer in 2024?",  Oleksandra Myronova"Mission (im) possible: How to get an offer in 2024?",  Oleksandra Myronova
"Mission (im) possible: How to get an offer in 2024?", Oleksandra MyronovaFwdays
 
"Why have we learned how to package products, but not how to 'package ourselv...
"Why have we learned how to package products, but not how to 'package ourselv..."Why have we learned how to package products, but not how to 'package ourselv...
"Why have we learned how to package products, but not how to 'package ourselv...Fwdays
 
"How to tame the dragon, or leadership with imposter syndrome", Oleksandr Zin...
"How to tame the dragon, or leadership with imposter syndrome", Oleksandr Zin..."How to tame the dragon, or leadership with imposter syndrome", Oleksandr Zin...
"How to tame the dragon, or leadership with imposter syndrome", Oleksandr Zin...Fwdays
 

More from Fwdays (20)

"How Preply reduced ML model development time from 1 month to 1 day",Yevhen Y...
"How Preply reduced ML model development time from 1 month to 1 day",Yevhen Y..."How Preply reduced ML model development time from 1 month to 1 day",Yevhen Y...
"How Preply reduced ML model development time from 1 month to 1 day",Yevhen Y...
 
"GenAI Apps: Our Journey from Ideas to Production Excellence",Danil Topchii
"GenAI Apps: Our Journey from Ideas to Production Excellence",Danil Topchii"GenAI Apps: Our Journey from Ideas to Production Excellence",Danil Topchii
"GenAI Apps: Our Journey from Ideas to Production Excellence",Danil Topchii
 
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks..."LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
 
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
 
"What is a RAG system and how to build it",Dmytro Spodarets
"What is a RAG system and how to build it",Dmytro Spodarets"What is a RAG system and how to build it",Dmytro Spodarets
"What is a RAG system and how to build it",Dmytro Spodarets
 
"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko
 
"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan
 
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
 
"Distributed graphs and microservices in Prom.ua", Maksym Kindritskyi
"Distributed graphs and microservices in Prom.ua",  Maksym Kindritskyi"Distributed graphs and microservices in Prom.ua",  Maksym Kindritskyi
"Distributed graphs and microservices in Prom.ua", Maksym Kindritskyi
 
"Rethinking the existing data loading and processing process as an ETL exampl...
"Rethinking the existing data loading and processing process as an ETL exampl..."Rethinking the existing data loading and processing process as an ETL exampl...
"Rethinking the existing data loading and processing process as an ETL exampl...
 
"How Ukrainian IT specialist can go on vacation abroad without crossing the T...
"How Ukrainian IT specialist can go on vacation abroad without crossing the T..."How Ukrainian IT specialist can go on vacation abroad without crossing the T...
"How Ukrainian IT specialist can go on vacation abroad without crossing the T...
 
"The Strength of Being Vulnerable: the experience from CIA, Tesla and Uber", ...
"The Strength of Being Vulnerable: the experience from CIA, Tesla and Uber", ..."The Strength of Being Vulnerable: the experience from CIA, Tesla and Uber", ...
"The Strength of Being Vulnerable: the experience from CIA, Tesla and Uber", ...
 
"[QUICK TALK] Radical candor: how to achieve results faster thanks to a cultu...
"[QUICK TALK] Radical candor: how to achieve results faster thanks to a cultu..."[QUICK TALK] Radical candor: how to achieve results faster thanks to a cultu...
"[QUICK TALK] Radical candor: how to achieve results faster thanks to a cultu...
 
"[QUICK TALK] PDP Plan, the only one door to raise your salary and boost care...
"[QUICK TALK] PDP Plan, the only one door to raise your salary and boost care..."[QUICK TALK] PDP Plan, the only one door to raise your salary and boost care...
"[QUICK TALK] PDP Plan, the only one door to raise your salary and boost care...
 
"4 horsemen of the apocalypse of working relationships (+ antidotes to them)"...
"4 horsemen of the apocalypse of working relationships (+ antidotes to them)"..."4 horsemen of the apocalypse of working relationships (+ antidotes to them)"...
"4 horsemen of the apocalypse of working relationships (+ antidotes to them)"...
 
"Reconnecting with Purpose: Rediscovering Job Interest after Burnout", Anast...
"Reconnecting with Purpose: Rediscovering Job Interest after Burnout",  Anast..."Reconnecting with Purpose: Rediscovering Job Interest after Burnout",  Anast...
"Reconnecting with Purpose: Rediscovering Job Interest after Burnout", Anast...
 
"Mentoring 101: How to effectively invest experience in the success of others...
"Mentoring 101: How to effectively invest experience in the success of others..."Mentoring 101: How to effectively invest experience in the success of others...
"Mentoring 101: How to effectively invest experience in the success of others...
 
"Mission (im) possible: How to get an offer in 2024?", Oleksandra Myronova
"Mission (im) possible: How to get an offer in 2024?",  Oleksandra Myronova"Mission (im) possible: How to get an offer in 2024?",  Oleksandra Myronova
"Mission (im) possible: How to get an offer in 2024?", Oleksandra Myronova
 
"Why have we learned how to package products, but not how to 'package ourselv...
"Why have we learned how to package products, but not how to 'package ourselv..."Why have we learned how to package products, but not how to 'package ourselv...
"Why have we learned how to package products, but not how to 'package ourselv...
 
"How to tame the dragon, or leadership with imposter syndrome", Oleksandr Zin...
"How to tame the dragon, or leadership with imposter syndrome", Oleksandr Zin..."How to tame the dragon, or leadership with imposter syndrome", Oleksandr Zin...
"How to tame the dragon, or leadership with imposter syndrome", Oleksandr Zin...
 

Alexandr Serbul "The Rust language for a high-load network service - a quick start and fast flight"

  • 1. Язык Rust для высоконагруженного сетевого сервиса - быстрый старт и стремительный полет Александр Сербул Head of Data Science, ООО «1С-Битрикс»
  • 2. О чем поговорим Делимся опытом. Никакой рекламы и философских выводов: • Что происходит в IT и языках программирования «на самом деле» • История проекта отправки push-уведомлений Битрикс24 • Как мы развивали архитектуру проекта: от bash-forks до Rust/Tokio • Одновременно поговорим о высоконагруженной работой с сетью в php, java, python, nodejs, golang и почему мы взяли Rust • Как быстро понять Rust и его сравнение с другими ЯП • Как начать решать задачи на Rust как можно быстрее, Cargo • Подводные камни в Rust и способы их преодоления • Выводы, рекомендации для будущих проектов и нагруженных сетевых архитектур
  • 3. Что происходит в IT и языках программирования «на самом деле» - и что подарил миру Rust?
  • 4. Как все начиналось… • Архитектура фон Неймана и машина Тьюринга • Процедурные языки программирования • Объектно-ориентированные языки программирования • Функциональные языки программирования • Гибридные языки программирования
  • 5. Все не заладилось с самого начала… Архитектура фон Неймана
  • 8. Теорема Гёделя о неполноте…
  • 11. Управление сложностью - инкапсуляция (все лишнее – скрыто поглубже) - абстракция (сложное становится простым, фасады) - иерархии абстракций - большое количество автотестов
  • 12. Haskell: “Quicksort” А могло же быть так: просто и сексуально
  • 14. Чем все закончилось… • Человечество – просиживает в соцсетях, в онлайн-играх и на сайтах для взрослых • Настоящее программирование – требует сильного напряжения ума и, желательно, знания математики • Взрослые люди – не хотят учиться, а это нужно для успеха в IT • Языки программирования – создаются методом копирования идей, борьба за разработчиков • Думать и учить логически строгие ЯП типа Haskell - никто не хочет
  • 15. Войны технологий – усугубляют сложность • Вместо сотрудничества – конкуренция на рынке • Вместо «развития» языков (Scala, Rust), отмечается «межвидовая мутация» (Node.js) и параллельное изобретение велосипедов • Масштабные религиозные войны: Java vs C#, PHP vs Python vs Ruby • Войны фреймворков: Angular vs React JS • “Зачем делать просто, если можно сложно?”
  • 16.
  • 17. «Шовинизм» в программировании •Вы писали 5 лет на PHP… Но почему, за деньги чтоль? – на работу не беру •Вы только байтики умеете на C гонять? – в нашу компанию вы не подходите •Только Java/Spring, только своих… - и пофиг на скорость, качество, результат •С#/Windows forever •Гошечка, милая гошечка…
  • 18. Докладчик сошел с ума  Все свободны. Спасибо за внимание!
  • 19. Выразительность языков программирования С – переносимый ассемблер С++ - много мелких тонкостей и «дыр», большое и противоречивое наследство Ассемблер Java Erlang C#Scala Kotlin Haskell Akka/JVM F# Go PHP Groovy Python Ruby Java ScriptLua
  • 20.
  • 21. PHP Выразительность языков программирования С – переносимый ассемблер С++ - много мелких тонкостей и «дыр», большое и противоречивое наследство Ассемблер Java C#Scala Kotlin Groovy Python Ruby Java ScriptLua Go Rust Erlang Haskell Akka/JVM F#
  • 22. Выразительность в Rust • Zero-cost (!) абстракции: итераторы, фильтры, мап-редьюсы … • Автовывод типов • Нет NULL, даже как концепции • Алгебраические типы данных (ADT) • Надежный pattern-matching по ADT • Защита от «опасных» операций с массивами, числами (переполнения …); “panic!” • Компилятор дает надежные гарантии безопасности при работе с памятью и автоматически освобождает ее – нет сборщика мусора • Очень мощный и строгий макро-язык • Нельзя напороться на «Undefined Behavior» (кроме как в unsafe режиме, но это нужно прямо постараться)
  • 23.
  • 25.
  • 27. Управление памятью в Rust •Владение объектами (ownership) •Передача объектов между функциями (move) и автоматический вызов «деструкторов» когда «пора» •Заимствование объектов (borrowing) при передаче по ссылке, в функции, ссылочная целостность •Slices, lifetimes •No dangling references
  • 28. Как быстро понять Rust и его сравнение с другими ЯП
  • 29. Философии • Python • JavaScript/Node.js • TypeScript • PHP • Java/C# • Scala/Kotlin • C/C++ • Haskell/ML • Rust
  • 30. Как набить руку в Rust • “Rust by example”: https://doc.rust-lang.org/stable/rust-by-example/ • “The Book”: https://doc.rust-lang.org/book/ • “The Rustonomicon”: https://doc.rust-lang.org/nomicon/ Первые 2 ссылки лучше пройти с руками в консоли 2-3 раза и потом все открывается и дальше легко. Самое непривычное для понимания: аффинные типы данных, алгебраические типы данных. Полезен опыт изучения FP. Последняя ссылка самая сложная и тяжелая, но ее можно … не читать 
  • 34. Аффинные типы данных - проникли гораздо глубже • Концепции: ownership, move, borrowing – активно применяются в многопоточном программировании и в других местах (итераторы и др.) • Забыть освободить Mutex – невозможно, не скомпилируется  • Поработать с инвалидированным итератором – невозможно, не скомпилируется  • Появилось больше времени на решение бизнес-задач
  • 35. Начало работы с Rust • «Непробиваемый» компилятор • Rust-plugin IntelliJ IDEA
  • 37. Менеджмент проекта, toolchain • Cargo.toml • Cargo.lock • “cargo build --release” • “rustup update”
  • 38. Автотестирование • Unit tests • Integration tests • “cargo test”
  • 39. Unsafe Rust И да, сторонние пакеты из Cargo могут содержать блоки «unsafe» и вызывать неопределенное поведение, но это случается на порядки реже, чем в связках python/c++ и т.п.
  • 40. Итоги «плюшек» в Rust • Пишешь быстро, как на python/php – автовывод типов • Очень строгая типизация без NULLs с ADT/PM* – а не как структурная в Golang/TypeScript или слабая динамическая в PHP/JS или «строгая»-динамическая в Python • Мощные гарантии компилятора: безопасная работа с памятью, авто-очистка памяти • Нет неопределенного поведения и прочих сюрпризов – «безопасный» язык, как Python/PHP** • Скорость как у C/C++! * - алгебраические типы данных/сопоставление по шаблону ** - сюрпризы возможны в unsafe-режиме языка, но их на порядки меньше
  • 41. Как мы развивали архитектуру проекта: от bash-forks до rust/tokio
  • 42. Пуши - технологии • Apple Push Notification service (APNs) - June 17, 2009; >= iOS 3.0, >= OS X v10.7 (Lion); max message - 256 B https://developer.apple.com/notifications/ • Google Cloud Messaging for Android (GCM) – June 27, 2012; >= Android 2.2; max message - 4 KB http://developer.android.com/google/gcm/ ранее - Android Cloud to Device Messaging (C2DM)
  • 43. APNS
  • 44. Идеи в основе архитектуры 1. Провайдер регистрируется в APNs, GCM и получает клиентский SSL/TLS-сертификат (ключ и т.п.) 2. Провайдер обслуживает запросы многих мобильных приложений и идентифицирует себя в APNs, GCM с помощью сертификата • Нам нужно поддерживать 10к – 100к и больше мобильных приложений
  • 45. Провайдер 1, Приложение Провайдер N, Приложение «Супер» Провайдер Клиентские SSL/TLS сертификаты, ключи
  • 46. APNS - протокол • Бинарный протокол • 2 формата: простой и расширенный • Пишем/читаем SSL/TLS сокет • Возвращает инфу о невалидных токенах устройств
  • 47. GCM - протокол • JSON/plain text POST -> https://android.googleapis.com/gcm/send Запрос: Content-Type:application/json Authorization:key=*aSyB-1uEai2WiUapxCs2Q0GZYzPu7Udno5aA { "registration_ids" : ["APA91bHun4MxP5egoKMwt2KZFBaFUH-1RYqx..."], "data" : { ... }, } Ответ: { "multicast_id": 108, "success": 1, "failure": 0, "canonical_ids": 0, "results": [ { "message_id": "1:08" } ] }
  • 48. Универсальный транспорт Пакет BCM Октеты в base64. TWFuIGlzIGRpc3;2;NoZWQsIG5vdC;1; ZXZlcmFuY2Ugb2YgZ…;3;… [0-9]{1} – переключатель формата: GCM, APNs … Push-сообщение Raw bytes, Json, txt, xml, … SSL/TLS клиентский сертификат APNS, Ключ GCM
  • 49. nginx Идентификация и проксирование сообщения в SQS PHP-процесс Long Pooling, получение и парсинг сообщения, отправка Push на устройство PHP-процесс Long Pooling, получение и парсинг сообщения, отправка Push на устройство PHP-процесс Long Pooling, получение и парсинг сообщения, отправка Push на устройство nginx Идентификация и проксирование сообщения в SQS nginx Идентификация и проксирование сообщения в SQS Итоговая архитектура (2013)
  • 50. Недостатки архитектуры • Синхронная работа с сокетами при отправке push- уведомлений в GCM/APNs • За счет скриптовых языков – высокая нагрузка на CPU 1) Итерация 1: PHP форкает системный процесс отправки push 2) Итерация 2: PHP начал работать с сокетами сам Нагрузка: до 1000 SQS-сообщений в секунду до 1000-15 000 отправляемых пуш-уведомлений в секунду
  • 51. Нагрузка, железо Нагрузка: до 1000 SQS-сообщений в секунду до 1000-15 000 отправляемых пуш-уведомлений в секунду • На PHP кластер жил за 6-8 серверах с 16-32 CPU и 16-32 ГБ ОЗУ и нагрузка постоянно росла • На Rust - нагрузку пушей Битрикс24 держит один сервер 4 CPU 8 ГБ ОЗУ (процесс, он один, занимает 3.5 ГБ в ОЗУ) TCP - не кешируются, ключи на диске - не кешируются. Это еще сильнее снизит нагрузку.
  • 52. Проект на Rust - обзор • Стандартные зависимости в Cargo • Сетевая асинхронная “монадическая” библиотека с корутинами – Tokio • Немного танцев с бубнами с TLS, но исходники помогли быстро • При росте нагрузки резко начались segfaults, но быстро полечились через увеличение ulimit ОС, видимо, наступили на ограничение стека на процесс и наступала нирвана • Никаких проблем, падений, анализов coredump • Никаких утечек памяти, Rust использует стандартные: malloc или jemalloc или можно выбрать • Никаких тюнингов GC и нагрузок от сборщика мусора 
  • 53. Проект на Rust - обзор
  • 54. Проект на Rust - тесты • Сразу пишутся тесты • За счет ADT/PM, отсутствия NULLs, Enums – тесты больше занимаются делом • В самом языке много вкусных функциональных библиотек с Zero-cost abstraction (итераторы, диапазоны, фильтры, мап-редьюсы) • В Tokio тоже монадически- функциональный подход
  • 56. Проект на Rust – Pattern Matching
  • 57. Проект на Rust – присваивание из PM
  • 58. Проект на Rust – “Option” monad
  • 59. Проект на Rust – TCP monads
  • 60. Проект на Rust – monadic network error handling
  • 62. ООП? Traits! • Развитого ООП, как в Java/C# - нет и не планируется. А зачем? • Структурки и методы, навешанные на них • Но за счет строгой типизации, ADT/PM, аффинных типов и сильных гарантий компилятора – этого хватает
  • 63. А что если взять … •Node.js •Python – корутины •Golang - горутины •Java/Netty •Erlang •Haskell •С++
  • 64. Итоги • Rust только кажется сложным. За сложностью скрывается строгость, простота и элегантность • Язык привносит несколько очень мощных и непривычных концепций, направленных на надежное программирование, в т.ч. системное • Компилятор дает очень высокие гарантии по работе с памятью и многие другие (переполнения, доступ за пределы массива …) и его нужно «преодолевать» • На языке легко писать, причем быстро и сразу без ошибок • Алгебраические типы данных, строгий pattern-matching и отсутствие NULLs хорошо структурируют код и сильно ускоряют разработку • В Cargo «из коробки» много готовых модулей, бери и используй • Скорость решения сравнима с C, потребление ОЗУ без сборщика мусора минимально.