Компания Яндекс опубликовала исходные тексты специализированного прокси-сервера Odyssey (https://github.com/yandex/odyssey), предназначенного для поддержания пула открытых соединений к СУБД PostgreSQL и организации маршрутизации запросов. Приложение построено с использованием многопоточной архитектуры, базирующейся на движке сопрограмм machinarium (https://github.com/yandex/odyssey/tree/master/third_party/ma...), позволяющем создавать приложения для обработки событий в асинхронном режиме с использованием традиционных методов процедурного программирования без применения callback-вызовов. Код написан (https://github.com/yandex/odyssey) на языке Си и распространяется под лицензией BSD.
Основные возможности Odyssey:- Для обработки соединений запускается несколько рабочих процессов с многопоточными обработчиками, отвечающими за аутентификацию и проксирование запросов. Все рабочие потоки совместно используют общий пул соединений;
- Отслеживается состояния транзакций и выполняется их автоматическая отмена (Rollback) в случае преждевременного отсоединения клиента;
- Запоминается последний сервер, к которому был подключен клиент, для возобновления подключения к тому же серверу в случае повторного соединения;
- Возможность определения пулов соединений с учётом привязки к пользователю и БД. Каждый пул может иметь раздельную аутентификацию, режим работы и ограничения;
- Полная поддержка SSL/TLS и типовых методов аутентификации клиента и сервера. Возможность выборочной блокировки пользователей для разных пулов;- Ведение лога с идентификацией соединений клиента и сервера через UUID, который позволяет связать различные события в логе и сообщения об ошибках с определённым клиентом.
URL: https://github.com/yandex/odyssey
Новость: https://www.opennet.me/opennews/art.shtml?num=48684
в кои-то веке Яндекс решил написать что-то на C а не на наколеночном (как он обычно любит) C++ ..что произошло вдруг ?? :-)
Будешь ныть -- перейдут на Раст или ещё чего похуже.
Пусть переходят, давно пора C++17 кизяк
Чем плох раст? Драйвер для PG, написанный на нём, вполне хорош. Или плохо всё, что на слуху?
Жаль что не на go.
> Жаль что не на go.В go медленный TLS. Наверное, из-за этого.
> в кои-то веке Яндекс решил написать что-то на C а не на
> наколеночном (как он обычно любит) C++ ..Это просто новый уровень предъяв.
>позволяющем создавать приложения для обработки событий в асинхронном режиме с использованием традиционных методов процедурного программирования без применения callback-вызовов.надо же, кто-то ещё умеет программировать...
>>позволяющем создавать приложения для обработки событий в асинхронном режиме с использованием традиционных методов процедурного программирования без применения callback-вызовов.
> надо же, кто-то ещё умеет программировать...а в чем проблема с callback-вызовами?
может предложение нужно иначе интерпретировать? например так:
ниосиляторы для обработки событий в асинхронном режиме использовали примитивный стиль программирования вместо... ?
Коллбеки размазывают логику происходящего по многим функциям. Если язык позволяет создавать замыкания под коллбеки, то результат ещё может быть пристойным, а может и нет. Помимо этого лезут проблемы с асинхронностью этих самых коллбеков, и потенциальными проблемами синхронизации. Ещё очень интересно делать сложные атомарные операции, с откатом их назад, если что-то пошло не так. Логику происходящего по коду разобрать становится вообще никак -- использовать размотку стека для откатов не удастся, соответственно, ... ну ты понелТо есть да, ты прав. Это показатель ниасиляторства. Но это ни о чём не говорит, сегодня почти все ниасиляторы, пишут, видите ли, на языках высокого уровня, про машинные коды и думать забыли. Ведь были люди в наше время, не то что нынешнее племя...
>>позволяющем создавать приложения для обработки событий в асинхронном режиме с использованием традиционных методов процедурного программирования без применения callback-вызовов.
> надо же, кто-то ещё умеет программировать...а казалось бы наоборот. 1 thread per connection per task - это не самая лучшая парадигма.
Тред имеет привычку блокироваться на операциях - и когда можно было его отложить и заняться полезным делом, он будет продолжать жрать ресурсы системы.
>>>позволяющем создавать приложения для обработки событий в асинхронном режиме с использованием традиционных методов процедурного программирования без применения callback-вызовов.
>> надо же, кто-то ещё умеет программировать...
> а казалось бы наоборот. 1 thread per connection per task - это
> не самая лучшая парадигма.Они сделали не nginx, а apache (надеюсь, пока не "2.4"...) для Pg.
Они круты как Skype!
По умолчанию оно работает в два потока, один воркер и один DNS-резолвер.
Для программки вся деятельность которой сводится к трем шагам - бери больше, кидай дальше, отдыхай пока летит. И никакой другой деятельностью не занимающейся. Самопальные подходы к пробуждению ото сна (читай "асинхронное программирование") вестимо выиграют у операционной системы. Ее то писали не такие любители смузи. :)
>>позволяющем создавать приложения для обработки событий в асинхронном режиме с использованием традиционных методов процедурного программирования без применения callback-вызовов.
> надо же, кто-то ещё умеет программировать...Ну-да, ну-да...
* machinarium.---Вызываю дух Гринспена! Фи Фил! Вы с нами??
* cooperative multitasking engine.
100 лет не видел goto в коде Яндекс порадовал !!!
rc = machine_io_attach(obj);
if (rc == -1)
goto error;
return 0;
error:
if (io->fd != -1) {
rc = machine_io_attach(obj);
if (rc != -1) return 0;
if (io->fd != -1) {
кто io->fd закрывать будет?
А при rc != -1 он разве закрывается?
Код слегка не эквивалентен, если goto error встречается больше 1 раза. :)
Верно, но здесь изображён 1 раз :)
/*
* machinarium.
*
* cooperative multitasking engine.
*/#include <machinarium.h>
#include <machinarium_private.h>MACHINE_API int
machine_bind(machine_io_t *obj, struct sockaddr *sa)
{
mm_io_t *io = mm_cast(mm_io_t*, obj);
mm_errno_set(0);
if (io->connected) {
mm_errno_set(EINPROGRESS);
return -1;
}
int rc;
rc = mm_io_socket(io, sa);
if (rc == -1)
goto error;
rc = mm_socket_set_reuseaddr(io->fd, 1);
if (rc == -1) {
mm_errno_set(errno);
goto error;
}
if (sa->sa_family == AF_INET6) {
rc = mm_socket_set_ipv6only(io->fd, 1);
if (rc == -1) {
mm_errno_set(errno);
goto error;
}
}
rc = mm_socket_bind(io->fd, sa);
if (rc == -1) {
mm_errno_set(errno);
goto error;
}
rc = machine_io_attach(obj);
if (rc == -1)
goto error;
return 0;
error:
if (io->fd != -1) {
close(io->fd);
io->fd = -1;
}
io->handle.fd = -1;
return -1;
}
> 100 лет не видел goto в коде Яндекс порадовал !!!Вы невнимательно следите за Инновациями Микрософт.
09.04.2018 18:43 Microsoft открыл код классического фейлового [,,,]27.03.2018 11:41 Microsoft открыл код для адаптации [,,,]
15.05.2017 09:51 Первый выпуск компилятора Perl 5 в JVM от проекта Perlito
22.02.2017 21:14 Уязвимость в ядре Linux, позволяющая [,,,]
05.03.2014 11:34 Критическая уязвимость в GnuTLS, существенно влияющая на безопасность дистрибутивов Linux
> 100 лет не видел goto в коде Яндекс порадовал !!!Кто-то 100 лет не заглядывал в сорцы ядра? Если тебе интересен C, то я очень рекомендую заглядывать туда, хоть иногда. И хоть чего-нибудь пилить в свободное время, работающее в ядерном контексте. Хотя бы развлечения ради. Развивает.
goto error - одно из немногих применений goto, которое не осуждается. Ради интереса посмотрите код ядра Linux, например.
с code style у них большие проблемы
В отличии от многих контор, единого кодестайла у просто Яндекса нет. А если учесть, что куча сильных ребят уходит что бы уехать (тот же Гугл, например), то это и не удивительно: новая волна несет новый мусор в головах.
>shapito_stream_resetкак корабль назовешь
Под видом возможностей тут подсунута возможность использовать софт, который написан с использованием таких-то технологий. Это или hype driven development в чистом виде, или же просто несоответствие техписов/аналитиков/тестеров команды нагрузочного тестирования занимаемым. Следуя волне хайп-драйвен-чекин надо проверить всех причастных на синдром самозванца.