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)

Ответ на: комментарий от Qui-Gon

вот честно говоря зачем хаскель - не знаю.

Потом на других языках интуитивно раскидываешь задачу на функции, которые идеально сочетаются с модульными тестами.

И идея класса типов хороша для проектирования даже на питоне.

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

И питон в студию - по крайней мере для линуксоидов.

Питон, перл, баш, … — это всё надо, но от них польза в других языках минимальна.

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

https://ru.stackoverflow.com/questions/548017/%D0%9A%D0%B0%D0%BA-%D0%B2-golang-%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D1%82%D1%8C-c-%D0%B8%D0%BB%D0%B8-c-%D0%BA%D0%BE%D0%B4

Вот это я и имел в виду. На 7 строчек интерфейса Си++ надо 30 строк обвязки в Си++ и 20 в Go. Плюс, если функция Си++ возвращает не число, а что-то полезное (например, std::map<std::string, int> хотя бы), то развлечения ещё на порядок больше.

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

Мне объяснять не надо, я-то всё прекрасно понимаю :)

Вот где плюсы действительно почти безальтернативны - гуевый кроссплатформенный софт. Мне в прошлом году понадобилось софтину одну написать, и пришлось лабать на плюсах с Qt.

PS: Электрон не предлагать.

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

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

Вот ещё эпический UB: https://kqueue.org/blog/2012/06/25/more-randomness-or-less/

struct timeval tv;
unsigned long junk;

gettimeofday(&tv, NULL);
srandom((getpid() << 16) ^ tv.tv_sec ^ tv.tv_usec ^ junk);

на современных компиляторах превращается примерно в

srandom(junk);

или даже в

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

PS: Электрон не предлагать.

Ещё Gtk есть, к которому интерфейс с любого языка. И Avalonia. И Java. Это всё лучше, чем отлаживать неожиданное UB.

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

Ещё Gtk есть, к которому интерфейс с любого языка.

Хуже придумать сложно.

И Java

Вышел Intel Core i48. Наконец-то достойный соперник Java.

Это всё лучше, чем отлаживать неожиданное UB.

UB неожиданно для тех, кто на языке писать не умеет.

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

Можно. Я люблю питон, но учитывая, что там уже были кусочки, критичные к производительности, а сама софтина была не сильно большая, плюсы были проще. И потом, я и так намучился с упаковкой его в setup.exe и dmg, а тут питон еще.

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

PS: Электрон не предлагать.

tauri - часть фронтэнда отдаем тому кто умеет в html js/ts и прочие, остальное пишем сами. Если интерфейс не очень сложный, и не надо влезать в странные размеры (800х600) - можно и самому комфортно в одно рыло

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

UB неожиданно для тех, кто на языке писать не умеет.

UB может быть просто от опечатки. И я уже приводил пример UB даже в коде сишного компилятора.

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

Для Си есть MISRA C: набор правил, позволяющий писать безопасный код.

Программирование на Си чем-то напоминает игру в настольную стратегию с киданием кубика в ручную. Играть можно и интересно, но также можно автоматизировать чать рутинных действий.

Но эти правила ещё жёстче, чем Rust без unsafe.

В рамках этой метафоры выходит: стратегия Rust это как настольная стратегия Си где запрограммированы рутинные действия кидания кубика.

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

Да. Поэтому я считаю, что знать надо, как минимум, схему, форт, хаскель и с++.

Согласен. Звучит роскошно, но требует дисциплины, Хаскель и Lisp это уж очень теоретические языки.

Даже более прикладные языки и хорошие спикеры дают кругозор.

К слову Спикеры - не нравится мне этот термин. Как этих людей по русски назвать: учителя, мастера, докладчики, авторы? Авторы.

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

Не везде можно обратиться по указателю на уже освобождённую память. Не везде INT_MAX + 1 это UB. Да в этом Си даже написать цикл от a до b включительно не каждый осилит написать.

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

Так везде. Везде можно перепутать + 0 и / 0.

Да. Но если у тебя нормальный язык, то именно в этой точке будет ошибка с нормальной трассой стека. А если UB, то эта точка может просто вообще пропасть из программы вместе со всеми командами до и после ошибки.

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

Согласен. Звучит роскошно, но требует дисциплины, Хаскель и Lisp это уж очень теоретические языки.

Для меня скорее форт оказался теоретическим языком: я на нём решал только учебные задачи. На хаскеле удобно писать обработку текста, на схеме у меня почти все локальные программы от сайта до обмена сообщениями.

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

В рамках этой метафоры выходит: стратегия Rust это как настольная стратегия Си где запрограммированы рутинные действия кидания кубика.

Это Си++. А Rust это как настольная стратегия, где перед ходом можешь сказать, что выпавшую 1 или 6 всегда перебрасываешь.

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

На хаскеле удобно писать обработку текста

Хаскель настойчиво рекомендуют выучить, даже в роликах посвященных Rust.

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

Я не знаю что надо такого написать, чтобы это не заметил cppcheck, gcc -fsanitize=undefined,address и valgrind.

$ cat test.cpp
#include <iostream>
using namespace std;

int table[4];
bool exists_in_table(int v)
{
    for (int i = 0; i <= 4; i++) {
        if (table[i] == v) return true;
    }
    return false;
}

int main()
{
    table[0] = 0;
    table[1] = 1;
    table[2] = 2;
    table[3] = 3;

    cout << "2 in table " << exists_in_table(2) << "\n";
}
$ g++ -fsanitize=undefined,address test.cpp
$ ./a.out
2 in table 1
$ g++ -O3 test.cpp
$ valgring ./a.out
==18435== Memcheck, a memory error detector
==18435== Copyright (C) 2002-2022, and GNU GPL'd, by Julian Seward et al.
==18435== Using Valgrind-3.20.0 and LibVEX; rerun with -h for copyright info
==18435== Command: ./a.out
==18435==
2 in table 1
==18435==
==18435== HEAP SUMMARY:
==18435==     in use at exit: 0 bytes in 0 blocks
==18435==   total heap usage: 2 allocs, 2 frees, 74,752 bytes allocated
==18435==
==18435== All heap blocks were freed -- no leaks are possible
==18435==
==18435== For lists of detected and suppressed errors, rerun with: -s
==18435== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)

UB есть:

$ objdump -d ./a.out
...
00000000000011a0 <_Z15exists_in_tablei>:
    11a0:       b8 01 00 00 00          mov    $0x1,%eax
    11a5:       c3                      ret
...
monk ★★★★★
()
Ответ на: комментарий от liksys

Так надо и писать, что «плюсы действительно почти безальтернативны среди тех языков, на которых я пишу, и тех графических библиотек, что мне нравятся».

Даже на схеме есть racket/gui, который переносим не хуже Qt.

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

Если руки растут не из жёпы, то обычно все работает как надо))

test.cpp:8:20: runtime error: index 4 out of bounds for type 'int [4]'
test.cpp:8:20: runtime error: load of address 0x563232cd2ef0 with insufficient space for an object of type 'int'
0x563232cd2ef0: note: pointer points here
 03 00 00 00  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  00 00 00 00
              ^ 
=================================================================
==9971==ERROR: AddressSanitizer: global-buffer-overflow on address 0x563232cd2ef0 at pc 0x563232ccf323 bp 0x7fffe2e43150 sp 0x7fffe2e43148
READ of size 4 at 0x563232cd2ef0 thread T0
    #0 0x563232ccf322 in exists_in_table(int) /mnt/data/main/development/ansible/test.cpp:8
    #1 0x563232ccf4ef in main /mnt/data/main/development/ansible/test.cpp:20
    #2 0x7f79030456c9  (/lib/x86_64-linux-gnu/libc.so.6+0x276c9) (BuildId: 3b0430552f7704425a91887df0fcd734bf3c0f6f)
    #3 0x7f7903045784 in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x27784) (BuildId: 3b0430552f7704425a91887df0fcd734bf3c0f6f)
    #4 0x563232ccf130 in _start (/mnt/data/main/development/ansible/a.out+0x2130) (BuildId: 30d7057078444035488f7ae70692393ed45cb847)

0x563232cd2ef0 is located 0 bytes after global variable 'table' defined in 'test.cpp:4:5' (0x563232cd2ee0) of size 16
SUMMARY: AddressSanitizer: global-buffer-overflow /mnt/data/main/development/ansible/test.cpp:8 in exists_in_table(int)
Shadow bytes around the buggy address:
  0x563232cd2c00: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  0x563232cd2c80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  0x563232cd2d00: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  0x563232cd2d80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  0x563232cd2e00: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
=>0x563232cd2e80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00[f9]f9
  0x563232cd2f00: f9 f9 f9 f9 00 00 00 00 00 00 00 00 00 00 00 00
  0x563232cd2f80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  0x563232cd3000: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  0x563232cd3080: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  0x563232cd3100: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
Shadow byte legend (one shadow byte represents 8 application bytes):
  Addressable:           00
  Partially addressable: 01 02 03 04 05 06 07 
  Heap left redzone:       fa
  Freed heap region:       fd
  Stack left redzone:      f1
  Stack mid redzone:       f2
  Stack right redzone:     f3
  Stack after return:      f5
  Stack use after scope:   f8
  Global redzone:          f9
  Global init order:       f6
  Poisoned by user:        f7
  Container overflow:      fc
  Array cookie:            ac
  Intra object redzone:    bb
  ASan internal:           fe
  Left alloca redzone:     ca
  Right alloca redzone:    cb
==9971==ABORTING
PRN
()
Ответ на: комментарий от PRN

Если руки растут не из жёпы, то обычно все работает как надо))

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

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

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

У тебя код говно и ты это прекрасно знаешь. Ты бы еще бинарь не запускал, а потом включил дурачка и удивлялся: «А что оно не работает? А кто это сделал?» XD

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

У тебя код говно и ты это прекрасно знаешь.

Так любой код с UB говно. zx_gamer заявлял, что инструменты в любом коде с UB, обнаружат его.

Ты бы еще бинарь не запускал, а потом включил дурачка и удивлялся

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

Вот только это требует либо выдачи пользователю неоптимизированного бинарника с санитайзерами, теряя в скорости примерно в 4 раза, либо гарантировать, что при тестировании будут тесты на все случаи, где потенциально может быть UB (для сложной программы трудноосуществимо, иначе UB в том же gcc не попадалось бы).

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

Вот это вообще не отлавливается:

#include <iostream>
#include <string>

int main()
{
    std::string str = "hell";
    auto p1 = str.begin() + 5; // UB
    auto p2 = p1 - 3;
    str.erase(p2);
    std::cout << str;
}
monk ★★★★★
()
Ответ на: комментарий от monk

среди тех языков, на которых я пишу, и тех графических библиотек, что мне нравятся

Давай только не путать Qt-фреймворк с графичиескими библиотеками. Берешь Qt - и у тебя есть сеть, ком-порты и почти всё, что может понадобиться среднему десктопному софту. Для остального придется городить идеоматический огород.

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

Ты писал «гуевый кроссплатформенный софт». Сеть и ком-порты к гуёвому софту перпендикулярны.

Вообще в любом кроссплатформенном языке, от лиспа до питона, практически все библиотеки кроссплатформенны.

Си++ нужен только когда тебе нужна не просто сеть, а сеть с максимально быстрой обработкой данных. И ты согласен за это рисковать лишним временем отладки и возможным наличием загадочных ошибок при работе.

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

Так любой код с UB говно. zx_gamer заявлял, что инструменты в любом коде с UB, обнаружат его.

У тебя была сама проверка не корректна.

Вот только это требует либо выдачи пользователю неоптимизированного бинарника с санитайзерами

Пользователю отдается релиз версия, ничего не мешает в паплайне собирать их параллельно.

… для сложной программы трудноосуществимо, иначе UB в том же gcc не попадалось бы.

Осуществимо. Баги есть всегда не зависимо от их типа.

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

Осуществимо. Баги есть всегда не зависимо от их типа.

Но когда это нормальный язык, пользователь предоставляет стек вызова, а в журнале есть контекст, в котором была ошибка. Когда же это Си++, то просто SegFault. Причём, как правило, не в тот момент, когда случилось UB, а чуть позже.

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

Ты писал «гуевый кроссплатформенный софт». Сеть и ком-порты к гуёвому софту перпендикулярны.

Писал, уточняю.

Вообще в любом кроссплатформенном языке, от лиспа до питона, практически все библиотеки кроссплатформенны.

Я там выше еще писал про идеоматичность.

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

Просто по умолчанию компилятор его не вшивает (нафиг он нужен в релизе?)

Чтобы не разбираться с ошибками пользователя «я что-то нажал и у меня Segmentation Fault», причём в коре видно, что у структуры объекта адрес испортился.

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

Qt относительно Си++ очень плохо идеоматичен. Постоянные преобразования между QString и std::string. Его даже обычным компилятором Си++ не скомпилировать.

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

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

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

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

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

Постоянные преобразования между QString и std::string

Зачем? Впрочем, многие библиотеки заставляют перегонять из своих контейнеров в стандартные или чужие. Пишу на работе приложение в связке из Qt и osgEarth, в osgEarth свой ref_ptr, свой optional, свои векторы и матрицы, свой тип для геокоординат, вот и приходится обмазывать всё клеем, гоняя данные между разными библиотеками.

unC0Rr ★★★★★
()
Ответ на: комментарий от 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

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

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

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

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

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

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

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

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

Это как раз не сильно большая проблема. Я про то, что для стыковки обычных библиотек с гуем надо потратить немножко сил, в то время как кутешные либы с кутешным же гуем стыкуются без всяких проблем (было бы странно, если нет).

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

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

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

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

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

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

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

Я про то, что для стыковки обычных библиотек с гуем надо потратить немножко сил

Питоновские обычные библиотеки даже с гуем на Qt легче стыкуются, чем обычные C++.

Если брать стыковку библиотек Racket с racket/gui, то там всё вообще идеально.

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