SlideShare a Scribd company logo
Язык 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
• “Зачем делать просто, если можно сложно?”
Alexandr Serbul "The Rust language for a high-load network service - a quick start and fast flight"
«Шовинизм» в программировании
•Вы писали 5 лет на PHP… Но почему, за деньги
чтоль? – на работу не беру
•Вы только байтики умеете на C гонять? – в нашу
компанию вы не подходите
•Только Java/Spring, только своих… - и пофиг на
скорость, качество, результат
•С#/Windows forever
•Гошечка, милая гошечка…
Докладчик сошел с ума 
Все свободны.
Спасибо за внимание!
Выразительность языков программирования
С – переносимый
ассемблер
С++ - много мелких тонкостей и
«дыр», большое и противоречивое
наследство
Ассемблер
Java
Erlang
C#Scala Kotlin
Haskell
Akka/JVM
F#
Go
PHP
Groovy
Python
Ruby
Java ScriptLua
Alexandr Serbul "The Rust language for a high-load network service - a quick start and fast flight"
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
режиме, но это нужно прямо постараться)
Alexandr Serbul "The Rust language for a high-load network service - a quick start and fast flight"
Управление памятью
С
С++
Ассемблер
Java
Erlang
PHP
C#Scala
Kotlin
Groovy
Haskell
Python Ruby
Java ScriptLua
Akka/JVM
F#
Go
Alexandr Serbul "The Rust language for a high-load network service - a quick start and fast flight"
Управление памятью
С
С++
Ассемблер
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

PDF
2020.10.13 HA Redis is simple. FWDays Highload
PPTX
Yevgen Lysenko "AWS RDS Aurora Serverless, ECS Fargate and more serverless-pr...
PDF
Anton Turetckii "What does it take to build a host?"
PDF
Юрий Насретдинов, Badoo
PDF
Путь к Go на конкретном примере
PDF
Архитектура растущего проекта на примере ВКонтакте / Алексей Акулович (ВКонт...
PDF
Архитектура хранения фотографий в Badoo
PDF
Облако в Badoo год спустя
2020.10.13 HA Redis is simple. FWDays Highload
Yevgen Lysenko "AWS RDS Aurora Serverless, ECS Fargate and more serverless-pr...
Anton Turetckii "What does it take to build a host?"
Юрий Насретдинов, Badoo
Путь к Go на конкретном примере
Архитектура растущего проекта на примере ВКонтакте / Алексей Акулович (ВКонт...
Архитектура хранения фотографий в Badoo
Облако в Badoo год спустя

What's hot (20)

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

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

PDF
Rust - GDG DevFest Siberia 2016
PDF
Практика разработки веб-серверов на Rust
PDF
Rust - GDG DevFest 2016 Nizhny Novgorod
PDF
Rust: история языка и контекст применения
ODP
GetDev.NET: Снова Эрланг
PDF
"YT — новая платформа распределённых вычислений". Максим Бабенко, Яндекс.
PDF
Дмитрий Грошев, Фёдор Гоголев. Erlang и Haskell в production: проблемы и решения
PDF
Erlang: прагматичный рассказ про прагматичный язык
PDF
У всех на виду: нюансы Open Source разработки
KEY
Erlang&rails
PDF
Григорий Петров "WebRTC в мобильных приложениях при помощи React Native"
PDF
Anton Tsitou "Designing hybrid Go/PHP applications using RoadRunner"
KEY
Erlang for Yandex
PDF
Андрей Сибирёв "Ваше собственное облако — война за независимость"
KEY
Что и почему писать на Erlang
PDF
Node.js Меньше сложности, больше надежности Holy.js 2021
PDF
Erlang railsclub - 1
PPTX
«Нужно больше шин! Eventbus based framework vertx.io»
PDF
Vert.x eventbus-based framework
PDF
CodeFest 2013. Лузин А. — Бэкенд-винегрет: как подружить разные ЯП на ваших с...
Rust - GDG DevFest Siberia 2016
Практика разработки веб-серверов на Rust
Rust - GDG DevFest 2016 Nizhny Novgorod
Rust: история языка и контекст применения
GetDev.NET: Снова Эрланг
"YT — новая платформа распределённых вычислений". Максим Бабенко, Яндекс.
Дмитрий Грошев, Фёдор Гоголев. Erlang и Haskell в production: проблемы и решения
Erlang: прагматичный рассказ про прагматичный язык
У всех на виду: нюансы Open Source разработки
Erlang&rails
Григорий Петров "WebRTC в мобильных приложениях при помощи React Native"
Anton Tsitou "Designing hybrid Go/PHP applications using RoadRunner"
Erlang for Yandex
Андрей Сибирёв "Ваше собственное облако — война за независимость"
Что и почему писать на Erlang
Node.js Меньше сложности, больше надежности Holy.js 2021
Erlang railsclub - 1
«Нужно больше шин! Eventbus based framework vertx.io»
Vert.x eventbus-based framework
CodeFest 2013. Лузин А. — Бэкенд-винегрет: как подружить разные ЯП на ваших с...
Ad

More from Fwdays (20)

PDF
"Mastering UI Complexity: State Machines and Reactive Patterns at Grammarly",...
PDF
"Effect, Fiber & Schema: tactical and technical characteristics of Effect.ts"...
PPTX
"Computer Use Agents: From SFT to Classic RL", Maksym Shamrai
PPTX
"Як ми переписали Сільпо на Angular", Євген Русаков
PDF
"AI Transformation: Directions and Challenges", Pavlo Shaternik
PDF
"Validation and Observability of AI Agents", Oleksandr Denisyuk
PPTX
"Autonomy of LLM Agents: Current State and Future Prospects", Oles` Petriv
PDF
"Beyond English: Navigating the Challenges of Building a Ukrainian-language R...
PPTX
"Co-Authoring with a Machine: What I Learned from Writing a Book on Generativ...
PPTX
"Human-AI Collaboration Models for Better Decisions, Faster Workflows, and Cr...
PDF
"AI is already here. What will happen to your team (and your role) tomorrow?"...
PPTX
"Is it worth investing in AI in 2025?", Alexander Sharko
PDF
''Taming Explosive Growth: Building Resilience in a Hyper-Scaled Financial Pl...
PDF
"Scaling in space and time with Temporal", Andriy Lupa.pdf
PDF
"Database isolation: how we deal with hundreds of direct connections to the d...
PDF
"Scaling in space and time with Temporal", Andriy Lupa .pdf
PPTX
"Provisioning via DOT-Chain: from catering to drone marketplaces", Volodymyr ...
PPTX
" Observability with Elasticsearch: Best Practices for High-Load Platform", A...
PPTX
"How to survive Black Friday: preparing e-commerce for a peak season", Yurii ...
PPTX
"Istio Ambient Mesh in production: our way from Sidecar to Sidecar-less",Hlib...
"Mastering UI Complexity: State Machines and Reactive Patterns at Grammarly",...
"Effect, Fiber & Schema: tactical and technical characteristics of Effect.ts"...
"Computer Use Agents: From SFT to Classic RL", Maksym Shamrai
"Як ми переписали Сільпо на Angular", Євген Русаков
"AI Transformation: Directions and Challenges", Pavlo Shaternik
"Validation and Observability of AI Agents", Oleksandr Denisyuk
"Autonomy of LLM Agents: Current State and Future Prospects", Oles` Petriv
"Beyond English: Navigating the Challenges of Building a Ukrainian-language R...
"Co-Authoring with a Machine: What I Learned from Writing a Book on Generativ...
"Human-AI Collaboration Models for Better Decisions, Faster Workflows, and Cr...
"AI is already here. What will happen to your team (and your role) tomorrow?"...
"Is it worth investing in AI in 2025?", Alexander Sharko
''Taming Explosive Growth: Building Resilience in a Hyper-Scaled Financial Pl...
"Scaling in space and time with Temporal", Andriy Lupa.pdf
"Database isolation: how we deal with hundreds of direct connections to the d...
"Scaling in space and time with Temporal", Andriy Lupa .pdf
"Provisioning via DOT-Chain: from catering to drone marketplaces", Volodymyr ...
" Observability with Elasticsearch: Best Practices for High-Load Platform", A...
"How to survive Black Friday: preparing e-commerce for a peak season", Yurii ...
"Istio Ambient Mesh in production: our way from Sidecar to Sidecar-less",Hlib...

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 • “Зачем делать просто, если можно сложно?”
  • 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
  • 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 режиме, но это нужно прямо постараться)
  • 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, потребление ОЗУ без сборщика мусора минимально.