Pull to refresh

Программируем биржу: почему мы выбрали Rust?

Level of difficultyEasy
Reading time4 min
Views12K

Язык программирования Rust постепенно набирает популярность не только среди разработчиков, но и в среде менеджмента. Такая растущая популярность не появляется на пустом месте, особенно в случае технологий с высоким порогом входа. В данной статье я хочу проанализировать чем Rust заслужил такую популярность на примере компании, в которой я работаю и в которой Rust является основным языком разработки, а также одного из основных наших продуктов - биржи.

Как и при выборе любого инструмента разработки, выбор языка исходит из требований предъявляемых к разрабатываемому продукту. Какие требования предъявляются к бирже?

Во-первых, важна надежность. Никто не захочет торговать на бирже, которая может потерять его деньги из-за ошибок в ПО. К сожалению нет 100% способа избежать багов, есть лишь возможность сократить их вероятность. Тестирование хорошо себя зарекомендовало в этом плане, но даже оно не дает абсолютных гарантий, а лишь снижает вероятность проблем. Даже если кажется, что ПО полностью покрыто тестами всех уровней, это лишь иллюзия, тесты сами могут содержать ошибки, а также могут упускать из вида некоторые сценарии использования.

В дополнение к тестам хорошо себя показывают инструменты статического анализа. Они позволяют выявлять проблемы еще на этапе разработки. Хорошо, если такие инструменты встроены в компилятор языка. Идеальный язык в плане надежности стремится к парадигме “компилируется значит работает”, и хотя идеальных языков нет, есть те, что сильно выделяются из большинства языков, построенных на противоположной парадигме “работает значит компилируется”.

Во-вторых, важна производительность. Биржа должна выполнять транзакции настолько быстро насколько это возможно. Мы на своей бирже стремимся к показателям десятков, в худшем случае сотен микросекунд на транзакцию. Важность этого параметра легко увидеть если посмотреть на тот факт, что большинство брокеров размещают свои сервера максимально близко к биржам дабы максимально сократить сетевые задержки. Еще одним фактором производительности важным для биржи является устойчивость к высоким нагрузкам. Мы живем в эпоху алгоритмической торговли, значимой частью рынка являются программы, совершающие огромное число сделок каждую секунду. Трейдер торгующий по старинке просто не может конкурировать с такими программами, а значит их будет становится только больше. Добавьте сюда копи-трейдинг, предлагаемый сегодня многими брокерами, когда сделки одного трейдера моментально приводят к похожим сделкам у тех, кто за ним следует. Биржа должна быть способна выдержать миллионы транзакций в секунду не теряя в скорости их исполнения.

И хотя выбор языка является не единственным фактором влияющим на производительность, на таких высоких требованиях к ней имеет значение каждый из факторов. Языки, в рантайме которых происходит интерпретация, JIT-компиляция и/или сборка мусора, имеют менее предсказуемую производительность, скорее всего худшую чем языки имеющие более минималистичный рантайм. Следовательно для более высокой производительности следует выбрать язык с ручным управлением памятью и с AOT-компиляцией в машинный код.

В-третьих, важна скорость разработки. Данное требование важно практически для любого современного продукта, не только для биржи. Чем быстрее разработка сможет поставлять новые фичи, тем более конкурентным окажется продукт среди аналогов. На скорость разработки влияют множество факторов, которые отличаются у разных языков: наличие у языка высокоуровневых абстракций, развитая экосистема библиотек с готовыми решениями для типовых проблем, развитые инструменты разработки и отладки и т.д. Неплохо, если язык позволяет удобно работать с многопоточными и асинхронными вычислениями. Если мы боремся за производительность, то крайне желательно чтобы абстракции стоили как можно меньше, желательно чтоб они были zero-cost. А если мы хотим управлять памятью вручную, то хорошо бы иметь умные указатели и коллекции, которые будут управлять выделением и освобождением памяти за нас.

Сложите все требования воедино и выбор языка программирования сужается до очень короткого списка. С одним требованием производительности уже можно выбирать между C++ и Rust, ну может еще парочки языков, которые быстро будут отброшены или при анализе скорости разработки на них или при попытке кого-либо нанять. Добавим сюда надежность и Rust сильно опередит C++ одним только фактом, что в нем гарантированно нет undefined behaviour пока вы не напишите ключевое слово unsafe.

Многие IT бизнесы боятся внедрять у себя Rust, предпочитая делать свои сервисы на Node.js, Python или Go.

Кто-то боится, что не сможет никого нанять, а обучить имеющихся разработчиков будет крайне сложно из–за кривой входа. Но разработчики на Rust есть, многие знают несколько других языков и многие из них предпочтут Rust если дать им выбор.

Кто-то боится, что это всего лишь новомодная игрушка. Вот только Rust развивается примерно столько же как Node.js или Go, он готов к продакшену и вероятно что-то из того, чем вы пользуетесь ежедневно написано на Rust.

Кто-то смотрит на Rust как на язык исключительно для системной разработки. Хотя в его экосистеме есть библиотеки и практически для любой базы данных, почти любого брокера сообщений и почти любого формата сериализации (притом многие работают через единый интерфейс библиотеки serde). А писать rest api с помощью axum, rocket или actix-web ничуть не сложнее чем на django, flask, express или koa.

В завершении хочу сказать, что Rust разработчики гораздо спокойнее спят, реже выгорают и реже увольняются. Причина тому меньшее число багов, почти никогда не падающий прод и язык с которым приятно работать.

Tags:
Hubs:
Total votes 20: ↑11 and ↓9+2
Comments50

Articles