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)

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

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

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

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

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

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

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

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

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

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

Есть крейты log

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

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

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

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

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

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

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

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

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

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

Нет, это зависит от библиотеки.

Преобразований между std::string и QString и std::list и QStringList не избежать.

То есть, там, где в питоне я просто пишу:

widget.addItems(lib.data())

в С++ приходится писать что-то вроде

widget.addItems(toQStringList(lib.data()))

и так на всех стыках между моделью и отображением.

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

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

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

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

[profile.release-with-debug]
inherits = "release"
debug = true
monk ★★★★★
()
Ответ на: комментарий от zx_gamer

Если библиотека очень плохо интегрируется со стандартной библиотекой языка, то она не идеоматична.

Например, я могу написать библиотеку для Си, которая строку будет принимать и возвращать в виде структуры из двух указателей. Она тоже будет не идеоматична для Си, так как даже для вывода через printf эту строку сначала придётся копировать.

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

А разве для Qt уже не требуется компиляция через moc?

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

Тогда у тебя в программе будет по представлению строки и массива из каждой библиотеки, которую используешь. И постоянное копирование из одного представления в другое.

Или вместо единого Си++ множество подъязыков: Qt, VTK, MFC, ROOT, … для каждого из которых нужна своя реализация алгоритма.

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

Не нужно. Все умеют работать с const char*. И все реализации предоставляют возможность получить указатель на нультерминированную строку.

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

И много кто использует, например, не std::string, а QString, boost::container::string и т.п.

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

Преобразования это мелочи. Проблемы начинаются, когда надо какую-нибудь синхронную, либу прикрутить к асинхронному гую. Это в любом случае решаемая задача, хотя и ценой некоторого геморроя либо с тредами, либо с поллом, если повезет. Поэтому в том месте, где Qt ты с большой вероятностью сможешь построить приложение только из самого Qt, с гтк или другими либами придется гороить огород из идеоматических оберток.

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

И все реализации предоставляют возможность получить указатель на нультерминированную строку.

И как его получить из QString, например?

Судя по https://wiki.qt.io/Technical_FAQ#How_can_I_convert_a_QString_to_char.2A_and_vice_versa.3F только через копирование всей строки. Причём двойное, если нужно время жизни после временной переменной.

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

Поэтому в том месте, где Qt ты с большой вероятностью сможешь построить приложение только из самого Qt

Вот поэтому я и считаю Qt де-факто отдельным языком.

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

В рамках «языка Qt» это логичное решение. Строка там изменяемый массив юникодных символов. Если хранить постоянно char* в UTF-8, то на s[0] = c возможно придётся переписывать всю строку, если старое значение первого символа и новое использует разное количество байтов в UTF-8.

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

Сам Юникод «замечательный». Потому что понятие символа напрочь убито. И особой разницы нет, пишешь ты кодопоинт от 1 до 4 байт в UTF-8 или от 1 до 2 байт в QString. Символ всё равно может состоять из произвольного числе кодопоинтов или, наоборот один кодепоинт может описывать несколько символов, а значит его изменение может заставить переписывать всю остальную строку.

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

Фреймворки бывают идиоматическими (которые можно использовать совместно с базовой библиотекой и друг с другом) и неидиоматическими (как Qt в C++).

К слову, в Python основанный на Qt PySide является идиоматическим: в нём нет своих версий строки и коллекций, которые уже есть в базовом языке. И не требуется отдельного синтаксиса для сигналов и слотов (для слота есть декоратор).

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

Фреймворки бывают идиоматическими (которые можно использовать совместно с базовой библиотекой и друг с другом) и неидиоматическими (как Qt в C++).

Ты это деление сам только что придумал?

  • Qt использует свой препроцессор, но все еще преобразуется в обычный плюсовый код.
  • Посмотри на прототипы в Qt - увидишь кучу стыкующихся функций с обычными плюсовыми типами.
liksys ★★★★
()
Ответ на: комментарий от liksys

Qt использует свой препроцессор, но все еще преобразуется в обычный плюсовый код.

Я больше про NIH-синдром на все базовые типы.

Когда в питоне можно писать

table.setHorizontalHeaderLabels(["Name", "Hex Code", "Color"])

а в C++ надо собирать через

QStringList horzHeaders;
horzHeaders << "test1" << "test2" << "test3";
table.setHorizontalHeaderLabels(horzHeaders);

В Common Lisp такой же hu.dwim есть. Вроде библиотека, но при использовании любого кусочка надо тащить почти весь фреймворк и при использовании свои описания пакетов и классов.

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

Посмотри на прототипы в Qt - увидишь кучу стыкующихся функций с обычными плюсовыми типами.

Ага. Эдакий FFI к остальному Си++.

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

NIH-синдром на все базовые типы

Это не NIH, а вполне оправданная унификация компонентов, чтобы не использовать тысячу и один каст. 99% всех кейсов при работе со строками и списками отлично покрываются Qt. Плюс строки в кишках используют неявное кеширование, чтобы экономить память.

а в C++ надо собирать через

table.setHorizontalHeaderLabels(QStringList() << "test1" << "test2" << "test3");

Слава богу, Qt делали умные люди.

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

Это не NIH, а вполне оправданная унификация компонентов, чтобы не использовать тысячу и один каст.

Вот есть libyue. Идиоматичная библиотека графического интерфейса. Где строки — это std::string, строки таблицы выбираются через std::set, а не QTableWidgetSelectionRange, пометка текста делается двумя числами, а не через QTextCursor.

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

Qt использует свой препроцессор, но все еще преобразуется в обычный плюсовый код.

Чего-чего? Его обычный g++ компилирует.

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

Потому что это библиотека гуев, а не фреймворк.

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

Раньше вроде moc требовался. Или g++ научился «signals:» и «slots:» понимать?

И сейчас требуется. signals: он не понимает, ты видимо goto метку создал.

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

в С++ приходится писать что-то вроде

std::for_each или range-based-for спасут отца русской демократии от необходимости приводить коллекции (кутешные, кстати, под стд мимикрируют на ура). Останется только тип внутри, тут варианта три:

  • страдать и приводить явно

  • вкорячить какой модный std::views::transform

    for (auto item : input | std::views::transform([](auto &s) { return QString::fromStdString(s); }))
    
  • страдать и приводить в некоторых случаях неявно (например, char * будет захватываться в QString без необходимости явного приведения).

arcanis ★★★★
()
Ответ на: комментарий от liksys
table.setHorizontalHeaderLabels({"test1", "test2", "test3"});

upd а выше монку ответили такое же (:

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

кутешные, кстати, под стд мимикрируют на ура

Как QStringList передать в f(vector<string> & v)?

table.setHorizontalHeaderLabels({«test1», «test2», «test3»});

Да, для непосредственного ввода в Си++ много магии прикрутили. Я имел в виду, что в питоне можно передать стандартный список строк. А в C++, если уже есть vector, приходится через transform (два раза копируем данные каждой строки).

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

Проблема с приведением больше не синтаксическая, а алгоритмическая. Если мы берём Си++, значит нам важна производительность, а на границе Qt и остального Си++ мы получаем накладные расходы такого же порядка, как между Си++ и питоном.

Например, если у нас есть QSqlQuery, какой-то алгоритм, преобразующий очень большой vector<tuple<string, string, int>> в другой маленький vector<tuple<string, string, int>> и вывод этого результата в QTableWidget, то для скорости работы придётся либо выкидывать QSqlQuery и заменять на что-то, что даст сразу пару std::string и число (типа pqxx), либо переписывать алгоритм, чтобы он мог работать с структурой из двух QString и int.

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

алгоритм, преобразующий очень большой vector<tuple<string, string, int>> в другой маленький vector<tuple<string, string, int>>

Точно такие же проблемы возникнут, если у нас на руках только array<wstring>, и тут уже начинаются вопросы к кодеру алгоритма, а почему, собственно, такой ограниченный интерфейс?

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

а почему, собственно, такой ограниченный интерфейс

А какой интерфейс должен быть? Вот есть алгоритм, который что-то делает с набором элементов, каждый из которых — две строки и целое число. Какой API предложишь?

monk ★★★★★
()
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.