» » Безопасно ускоряем Erlang приложение c помощью NIF на Rust

 

Безопасно ускоряем Erlang приложение c помощью NIF на Rust

Автор: admin от 19-02-2018, 13:50, посмотрело: 188

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

rustler. Пожалуй, самая популярная и функциональная библиотека, однако авторы сконцентрировали свои усилия на поддержке Elixir. В https://github.com/hansihe/rustler/issues/127 предлагают тащить mix в erlang проект. Документации по использованию в Erlang нет.
  • erlang-rust-nif. Представляет из себя низкоуровневую реализацию NIF и подход к сборке расширения. Код выглядит простой трансляцией с C. Сборка имеет граничные условия и не универсальна.

  • erlang_nif-sys. Низкоуровневая и полнофункциональная связка. Является основой для Rustler. Требует усилий и времени для написания NIF.

  • bitwise_rust. Демонстрирует работу с планировщиком. Также является оберткой без синтаксического сахара над С api.



  • Поскольку одним из пунктов требований является скорость разработки, наиболее привлекательно выглядит Rustler. Однако вносить в проект дополнительную зависимость в виде Elixir и сборщика mix не хочется.



    Rustler



    Отвечая на вопрос “зачем вообще тащить в erlang проект elixir?” и следуя принципу KISS, решено использовать rustler, но без дополнительных зависимостей. В качестве билд системы используется rebar3. Самым простым и быстрым шагом является определение pre_hooks для компиляции нашего rust кода.



    Для этого допишем в тестовом профиле hook:



    {pre_hooks, [
              {"(linux|darwin|solaris|freebsd)", compile, "sh -c "cd crates/bloom && cargo build && cp target/debug/libbloom.so ../../priv/""}
    ]}


    В боевом окружении добавим опцию --release, таким образом в боевой профиль добавляем:



    {pre_hooks, [
              {"(linux|darwin|solaris|freebsd)", compile, "sh -c "cd crates/bloom && cargo build --release && cp target/release/libbloom.so ../../priv/""}
    ]}


    После этих манипуляций появляется динамическая библиотека priv/libbloom.so, полностью готовая к загрузке в Erlang VM.

    Подробности и пример использования rustler в erlang проекте можно найти в репозитории проекта https://github.com/Vonmo/erbloom



    Фильтр Блума



    Поскольку экосистема rust предоставляет уже готовые реализации фильтра блума, выбираем подходящую и добавляем в cargo.toml. В данном проекте используется bloomfilter = "0.0.12"



    Расширение реализует следующие функции:




  • new(bitmap_size, items_count) – инициализация фильтра. bitmap_size и items_count – расчетные значения, существует масса готовых калькуляторов.

  • serialize() – упаковка фильтра, например, для последующего сохранения на диск или передачи по сети.

  • deserialize() – восстановление фильтра из сохраненного состояния.

  • set(key) – добавляет элемент в множество.

  • check(key) – проверяет принадлежность элемента множеству.

  • clear() – очищает фильтр.



  • Erlang



    Следует отметить, что загрузка расширения в Erlang – это абсолютный прозрачный процесс. После загрузки вашего модуля, происходит вызов on_load, в котором необходимо реализовать загрузку nif через erlang:load_nif/2. При этом обработка вызовов будет прозрачно происходить уже в Rust.



    Правилом хорошего тона является генерация ошибки erlang:nif_error/1 в случае если NIF не загружен.



    Подробное описание окружения для сборки проекта можно найти в данной статье.



    Итоги



    В результате проделанной работы мы получили производительное и безопасное расширение. В наших проектах данное расширение позволяет сократить объем обращений к хранилищу данных в некоторых случаях до 10 раз и обслуживать поток обращений более 500к RPS на машину.



    Исходный код расширения доступен на github.



    Источник: Хабрахабр

    Категория: Программирование

    Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь.
    Мы рекомендуем Вам зарегистрироваться либо войти на сайт под своим именем.

    Добавление комментария

    Имя:*
    E-Mail:
    Комментарий:
    Полужирный Наклонный текст Подчеркнутый текст Зачеркнутый текст | Выравнивание по левому краю По центру Выравнивание по правому краю | Вставка смайликов Выбор цвета | Скрытый текст Вставка цитаты Преобразовать выбранный текст из транслитерации в кириллицу Вставка спойлера
    Введите два слова, показанных на изображении: *