The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

Яндекс опубликовал Odyssey, многопоточный балансировщик соединений для PostgreSQL

31.05.2018 22:10

Компания Яндекс опубликовала исходные тексты специализированного прокси-сервера Odyssey, предназначенного для поддержания пула открытых соединений к СУБД PostgreSQL и организации маршрутизации запросов. Приложение построено с использованием многопоточной архитектуры, базирующейся на движке сопрограмм machinarium, позволяющем создавать приложения для обработки событий в асинхронном режиме с использованием традиционных методов процедурного программирования без применения callback-вызовов. Код написан на языке Си и распространяется под лицензией BSD.

Основные возможности Odyssey:

  • Для обработки соединений запускается несколько рабочих процессов с многопоточными обработчиками, отвечающими за аутентификацию и проксирование запросов. Все рабочие потоки совместно используют общий пул соединений;
  • Отслеживается состояния транзакций и выполняется их автоматическая отмена (Rollback) в случае преждевременного отсоединения клиента;
  • Запоминается последний сервер, к которому был подключен клиент, для возобновления подключения к тому же серверу в случае повторного соединения;
  • Возможность определения пулов соединений с учётом привязки к пользователю и БД. Каждый пул может иметь раздельную аутентификацию, режим работы и ограничения;
  • Полная поддержка SSL/TLS и типовых методов аутентификации клиента и сервера. Возможность выборочной блокировки пользователей для разных пулов;
  • Ведение лога с идентификацией соединений клиента и сервера через UUID, который позволяет связать различные события в логе и сообщения об ошибках с определённым клиентом.


  1. Главная ссылка к новости (https://github.com/yandex/odys...)
  2. OpenNews: Yandex опубликовал статический анализатор файлов конфигурации nginx
  3. OpenNews: Релиз проекта pgpool-II 3.0
  4. OpenNews: Яндекс начал формирование коллекции своих открытых проектов
  5. OpenNews: Яндекс.Почта успешно мигрировала с Oracle на PostgreSQL
  6. OpenNews: Яндекс открыл код библиотеки машинного обучения CatBoost
Лицензия: CC BY 3.0
Короткая ссылка: https://opennet.ru/48684-yandex
Ключевые слова: yandex, odyssey, postgresql
При перепечатке указание ссылки на opennet.ru обязательно


Обсуждение (30) Ajax | 1 уровень | Линейный | +/- | Раскрыть всё | RSS
  • 1.1, Xasd (ok), 22:21, 31/05/2018 [ответить] [﹢﹢﹢] [ · · · ]  
  • –8 +/
    в кои-то веке Яндекс решил написать что-то на C а не на наколеночном (как он обычно любит) C++ ..

    что произошло вдруг ?? :-)

     
     
  • 2.2, A.Stahl (ok), 22:24, 31/05/2018 [^] [^^] [^^^] [ответить]  
  • +6 +/
    Будешь ныть -- перейдут на Раст или ещё чего похуже.
     
     
  • 3.9, Аноним (-), 00:08, 01/06/2018 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Пусть переходят, давно пора C++17 кизяк
     
  • 3.33, Anonim (??), 12:30, 02/06/2018 [^] [^^] [^^^] [ответить]  
  • +/
    Чем плох раст? Драйвер для PG, написанный на нём, вполне хорош. Или плохо всё, что на слуху?
     
  • 2.6, Отражение луны (ok), 22:56, 31/05/2018 [^] [^^] [^^^] [ответить]  
  • –6 +/
    Жаль что не на go.
     
     
  • 3.8, Аноним (-), 23:40, 31/05/2018 [^] [^^] [^^^] [ответить]  
  • +/
    > Жаль что не на go.

    В go медленный TLS. Наверное, из-за этого.

     
  • 2.7, XoRe (ok), 23:29, 31/05/2018 [^] [^^] [^^^] [ответить]  
  • +9 +/
    > в кои-то веке Яндекс решил написать что-то на C а не на
    > наколеночном (как он обычно любит) C++ ..

    Это просто новый уровень предъяв.

     

  • 1.11, хрю (?), 07:12, 01/06/2018 [ответить] [﹢﹢﹢] [ · · · ]  
  • +2 +/
    >позволяющем создавать приложения для обработки событий в асинхронном режиме с использованием традиционных методов процедурного программирования без применения callback-вызовов.

    надо же, кто-то ещё умеет программировать...

     
     
  • 2.13, ыы (?), 07:40, 01/06/2018 [^] [^^] [^^^] [ответить]  
  • –4 +/
    >>позволяющем создавать приложения для обработки событий в асинхронном режиме с использованием традиционных методов процедурного программирования без применения callback-вызовов.
    > надо же, кто-то ещё умеет программировать...

    а в чем проблема с callback-вызовами?

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

     
     
  • 3.29, Ordu (ok), 16:15, 01/06/2018 [^] [^^] [^^^] [ответить]  
  • +2 +/
    Коллбеки размазывают логику происходящего по многим функциям. Если язык позволяет создавать замыкания под коллбеки, то результат ещё может быть пристойным, а может и нет. Помимо этого лезут проблемы с асинхронностью этих самых коллбеков, и потенциальными проблемами синхронизации. Ещё очень интересно делать сложные атомарные операции, с откатом их назад, если что-то пошло не так. Логику происходящего по коду разобрать становится вообще никак -- использовать размотку стека для откатов не удастся, соответственно, ... ну ты понел

    То есть да, ты прав. Это показатель ниасиляторства. Но это ни о чём не говорит, сегодня почти все ниасиляторы, пишут, видите ли, на языках высокого уровня, про машинные коды и думать забыли. Ведь были люди в наше время, не то что нынешнее племя...

     
  • 2.14, Аноним (-), 07:40, 01/06/2018 [^] [^^] [^^^] [ответить]  
  • +/
    >>позволяющем создавать приложения для обработки событий в асинхронном режиме с использованием традиционных методов процедурного программирования без применения callback-вызовов.
    > надо же, кто-то ещё умеет программировать...

    а казалось бы наоборот. 1 thread per connection per task - это не самая лучшая парадигма.
    Тред имеет привычку блокироваться на операциях - и когда можно было его отложить и заняться полезным делом, он будет продолжать жрать ресурсы системы.

     
     
  • 3.18, Andrey Mitrofanov (?), 09:48, 01/06/2018 [^] [^^] [^^^] [ответить]  
  • –1 +/
    >>>позволяющем создавать приложения для обработки событий в асинхронном режиме с использованием традиционных методов процедурного программирования без применения callback-вызовов.
    >> надо же, кто-то ещё умеет программировать...
    > а казалось бы наоборот. 1 thread per connection per task - это
    > не самая лучшая парадигма.

    Они сделали не nginx, а apache (надеюсь, пока не "2.4"...) для Pg.

    Они круты как Skype!

     
     
  • 4.24, 1 (??), 11:51, 01/06/2018 [^] [^^] [^^^] [ответить]  
  • +/
    По умолчанию оно работает в два потока, один воркер и один DNS-резолвер.
     
  • 3.20, КО (?), 10:15, 01/06/2018 [^] [^^] [^^^] [ответить]  
  • +/
    Для программки вся деятельность которой сводится к трем шагам - бери больше, кидай дальше, отдыхай пока летит. И никакой другой деятельностью не занимающейся. Самопальные подходы к пробуждению ото сна (читай "асинхронное программирование") вестимо выиграют у операционной системы. Ее то писали не такие любители смузи. :)
     
  • 2.17, Andrey Mitrofanov (?), 09:45, 01/06/2018 [^] [^^] [^^^] [ответить]  
  • +1 +/
    >>позволяющем создавать приложения для обработки событий в асинхронном режиме с использованием традиционных методов процедурного программирования без применения callback-вызовов.
    > надо же, кто-то ещё умеет программировать...

    Ну-да, ну-да...

    [CODE] * machinarium.
    * cooperative multitasking engine.[/CODE]---Вызываю дух Гринспена! Фи Фил! Вы с нами??

     

  • 1.21, Аноним (21), 11:07, 01/06/2018 [ответить] [﹢﹢﹢] [ · · · ]  
  • –1 +/
    100 лет не видел goto в коде  Яндекс порадовал !!!


    rc = machine_io_attach(obj);
    if (rc == -1)
    goto error;
    return 0;
    error:
    if (io->fd != -1) {

     
     
  • 2.23, VladSh (?), 11:37, 01/06/2018 [^] [^^] [^^^] [ответить]  
  • –2 +/
    rc = machine_io_attach(obj);
    if (rc != -1) return 0;
    if (io->fd != -1) {
     
     
  • 3.25, Аноним (-), 12:05, 01/06/2018 [^] [^^] [^^^] [ответить]  
  • –1 +/
    кто io->fd закрывать будет?
     
     
  • 4.31, VladSh (?), 17:39, 01/06/2018 [^] [^^] [^^^] [ответить]  
  • +/
    А при rc != -1 он разве закрывается?
     
  • 3.26, КО (?), 12:09, 01/06/2018 [^] [^^] [^^^] [ответить]  
  • +/
    Код слегка не эквивалентен, если goto error встречается больше 1 раза. :)
     
     
  • 4.32, VladSh (?), 17:41, 01/06/2018 [^] [^^] [^^^] [ответить]  
  • +/
    Верно, но здесь изображён 1 раз :)
     
     
  • 5.37, Аноним (21), 15:48, 04/06/2018 [^] [^^] [^^^] [ответить]  
  • +/
    /*
    * 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;
    }

     
  • 2.27, Andrey Mitrofanov (?), 13:42, 01/06/2018 [^] [^^] [^^^] [ответить]  
  • +/
    > 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

     
  • 2.30, Ordu (ok), 16:24, 01/06/2018 [^] [^^] [^^^] [ответить]  
  • +1 +/
    > 100 лет не видел goto в коде  Яндекс порадовал !!!

    Кто-то 100 лет не заглядывал в сорцы ядра? Если тебе интересен C, то я очень рекомендую заглядывать туда, хоть иногда. И хоть чего-нибудь пилить в свободное время, работающее в ядерном контексте. Хотя бы развлечения ради. Развивает.

     
  • 2.34, Аноним (-), 13:40, 02/06/2018 [^] [^^] [^^^] [ответить]  
  • +/
    goto error - одно из немногих применений goto, которое не осуждается. Ради интереса посмотрите код ядра Linux, например.
     

  • 1.22, anonymous (??), 11:33, 01/06/2018 [ответить] [﹢﹢﹢] [ · · · ]  
  • –2 +/
    с code style у них большие проблемы
     
     
  • 2.28, Stop (?), 15:11, 01/06/2018 [^] [^^] [^^^] [ответить]  
  • +1 +/
    В отличии от многих контор, единого кодестайла у просто Яндекса нет. А если учесть, что куча сильных ребят уходит что бы уехать (тот же Гугл, например), то это и не удивительно: новая волна несет новый мусор в головах.
     

  • 1.35, ананимас (?), 20:20, 03/06/2018 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    >shapito_stream_reset

    как корабль назовешь

     
  • 1.36, тот самый парень (?), 09:38, 04/06/2018 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Под видом возможностей тут подсунута возможность использовать софт, который написан с использованием таких-то технологий. Это или hype driven development в чистом виде, или же просто несоответствие техписов/аналитиков/тестеров команды нагрузочного тестирования занимаемым. Следуя волне хайп-драйвен-чекин надо проверить всех причастных на синдром самозванца.
     

     Добавить комментарий
    Имя:
    E-Mail:
    Текст:



    Партнёры:
    PostgresPro
    Inferno Solutions
    Hosting by Hoster.ru
    Хостинг:

    Закладки на сайте
    Проследить за страницей
    Created 1996-2024 by Maxim Chirkov
    Добавить, Поддержать, Вебмастеру