LINUX.ORG.RU

Cloudflare выпустила первый публичный релиз Pingora v0.1.0

 ,

Cloudflare выпустила первый публичный релиз Pingora v0.1.0

0

4

5 апреля 2024 года Cloudflare представила первый публичный релиз открытого проекта Pingora v0.1.0 (уже v0.1.1). Это асинхронный многопоточный фреймворк на Rust, который помогает создавать прокси-сервисы HTTP. Проект используется для создания сервисов, обеспечивающих значительную часть трафика в Cloudflare (вместо применения Nginx). Исходный код Pingora опубликован на GitHub под лицензией Apache 2.0.

Pingora предоставляет библиотеки и API для создания сервисов поверх HTTP/1 и HTTP/2, TLS или просто TCP/UDP. В качестве прокси-сервера он поддерживает сквозное проксирование HTTP/1 и HTTP/2, gRPC и WebSocket. Поддержка HTTP/3 — в планах. Pingora также включает в себя настраиваемые стратегии балансировки нагрузки и аварийного переключения. Чтобы соответствовать требованиям и безопасности, он поддерживает как широко используемые библиотеки OpenSSL, так и BoringSSL, которые соответствуют требованиям FIPS (федеральных стандартов обработки информации США) и пост-квантового шифрования.

Помимо этих функций, Pingora предоставляет фильтры и обратные вызовы, позволяющие пользователям полностью настраивать то, как сервис должен обрабатывать, преобразовывать и пересылать запросы.

В рабочем режиме Pingora обеспечивает плавный перезапуск без простоев для самостоятельного обновления, не теряя ни одного входящего запроса. Syslog, Prometheus, Sentry, OpenTelemetry и другие необходимые инструменты наблюдения легко интегрируются с Pingora.

Возможности Pingora: использование Async Rust, поддержка HTTP 1/2 end to end proxy, TLS over OpenSSL или BoringSSL, gRPC и проксирование веб-сокетов, Graceful reload, настраиваемые стратегии балансировки нагрузки и аварийного переключения, поддержка различных инструментов мониторинга.

В версии Pingora v0.1.1 исправлены ранее обнаруженные ошибки, улучшена производительность алгоритма pingora-ketama, добавлено больше бенчмарков TinyUFO и тестов для pingora-cache purge, ограничен размер буфера для журналов ошибок InvalidHTTPHeader, а также исправлены опечатки и внесены необходимые исправления в комментариях и документации проекта.

>>> Подробности

★★★★

Проверено: hobbit ()
Последнее исправление: hobbit (всего исправлений: 1)

Ответ на: комментарий от monk

Так в расте тоже разбираться надо

fn main() {
    let mut arr = [5; 1000000000000];
    arr[0] = 3;
    eprintln!("{:?}", &arr[0..1])
}

А про unsafe я вообще молчу. В C/C++ есть корки, по ним такие ошибки хорошо локализуются. Кстати в расте они есть?

PRN
()
Ответ на: комментарий от Silerus

Что такое корки?

https://wiki.archlinux.org/title/Core_dump

A core dump is a file containing a process’s address space (memory) when the process terminates unexpectedly. Core dumps may be produced on-demand (such as by a debugger), or automatically upon termination. Core dumps are triggered by the kernel in response to program crashes …

Берешь gdb и в путь)

tldr gdb
...
 - Debug with a core file:
   gdb -c core executable
...
PRN
()
Ответ на: комментарий от PRN

При панике разворачивается backtrace, как в питоне или лиспе, Надо чтоб была собрана дебаг версия и переменная RUST_BACKTRACE установлена в 1

Silerus ★★★★
()
Ответ на: комментарий от Silerus

Надо чтоб была собрана дебаг версия

Т.е. если к нам придут благодарные пользователе с релизной версией. Мы им ответим «спасибо» и пойдем балду пинать?)

PRN
()
Последнее исправление: PRN (всего исправлений: 1)
Ответ на: комментарий от PRN

Т.е паника может быть отключена в релиз версии настройками при сборки. Что бы не было «спасибо» и пошли балду пинать. Есть крейты log и log4rs (и другие аналоги). Где мы, как умные программисты, будем обрабатывать все Result и Option, а вместо a[9999999]=… использовать match a.get_mut(99999){ Some(…) =>{….},None=>{….}}

Silerus ★★★★
()
Ответ на: комментарий от Silerus

Есть крейты log

Вот только логи не сильно помогут в случае сегфолта, когда программа остановилась и буферы не скинуты. К тому же их еще надо расставить где надо.

мы, как умные программисты, будем обрабатывать

Что могу сказать) Если на Си писать правильно, то ошибок тоже нет))))

PRN
()
Ответ на: комментарий от PRN

Паника отключается в настройка - принудительно программистом. Если не отключить минимальный выхлоп мы получим. А кордамп операционка сама делает

Silerus ★★★★
()
Ответ на: комментарий от PRN

Так в расте тоже разбираться надо

Здесь хоть порчи памяти нет.

В C/C++ есть корки, по ним такие ошибки хорошо локализуются. Кстати в расте они есть?

Они в линуксе в любом бинарнике есть. Вот только когда у тебя в корке что-то вроде https://stackoverflow.com/questions/9809810/gdb-corrupted-stack-frame-how-to-debug , то как локализовывать будешь?

unsafe rust в этом смысле не лучше, но на нём можно писать маленькую, тщательно протестированную часть программы и не бояться, что добавка кода, украшающего кнопку, обвалит всю программу.

monk ★★★★★
()
Ответ на: комментарий от monk

Они в линуксе в любом бинарнике есть …

Есть то оно, конечно, есть. Но допустим в unsafe корнулось, что дальше? С сишными бинарями понятно: берешь gdb версию бинаря с дебажными символами и начинаешь дебажить. В расте только дебаг собирать?

PRN
()
Ответ на: комментарий от PRN

берешь gdb версию бинаря с дебажными символами и начинаешь дебажить.

В расте только дебаг собирать?

Так это одно и то же.

monk ★★★★★
()
Ответ на: комментарий от monk

Так это одно и то же.

Конечно же нет) Если надо корки мучить, то с сишке собирается релиз с дебажными символами (-O2 -g для примера), который бережно храниться. Стрипается, чтобы дебажных символов не было в релизе (man strip), и отправляется юзеру.

PRN
()
Последнее исправление: PRN (всего исправлений: 1)
Ответ на: комментарий от unC0Rr

О точно, с 1.57 появилось. Давно я ржавого не щупал) Так глядишь на нем скоро можно будет нормально кодить))

PRN
()
Ответ на: комментарий от unC0Rr

В смысле, в прод отправлять без проблем)

PRN
()
Ответ на: комментарий от PRN

Конечно же нет) Если надо корки мучить, то с сишке собирается релиз с дебажными символами

Теперь понял. Неоднозначность термина «дебаг».

Вот оптимизированный с дебажными символами в раст:

[profile.release-with-debug]
inherits = "release"
debug = true
monk ★★★★★
()
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.