Алексей Фирсов
1
Email: virmir49@gmail.com
Telegram: @virmir49
AIOPG vs ASYNCPG
Очень коротко обо мне
● adv-experience
● Занимаюсь программированием ~ лет 8-9
● Последние ~ лет 5-6 работаю с Python
● Участник сообщества aio-alibs
● Один из основных maintainers aio-alibs/aiopg
2
Email: virmir49@gmail.com
Telegram: @virmir49
3
Сравнение AIOPG vs ASYNCPG
4
На самом деле
● aiopg
● psycopg
● libpq
● postgresql
Стек aiopg
5
● asyncpg
● postgresql
Стек asyncpg
На самом деле
● aiopg
● psycopg
● libpq
● postgresql
Стек aiopg
6
● Бинарный протокол
● “Не работает”с pgbouncer
● prepared statement
ASYNCPG
Что обычно говорят
● Текстовый протокол
● Работает с pgbouncer
● Нет prepared statement
AIOPG
7
● asyncpg
● pgbouncer
● postgresql
Стек asyncpg
Давайте тогда так
● aiopg
● psycopg
● libpq
● pgbouncer
● postgresql
Стек aiopg
8
Расширенный запрос
flow postgresql
Простой запрос
https://goo.gl/aqhnRE https://goo.gl/n2Lqac
9
Простой запрос
Query:
Byte1 - Q Указывает, что это простой запрос.
Int32 - Длина сообщения в байтах.
String - Строка запроса.
10
Простой запрос пример
11
Расширенный запрос
● Подготовленные операторы (Parse and OID)
● Порталы (Describe)*
● Bind
● Execute
● Sync
12
Расширенный запрос
● Подготовленные операторы (Parse and OID)
● Порталы (Describe)*
● Bind
● Execute
● Sync Это не все.
13
Parse (P) и OID type
● Parse - передает запрос строкой
● Параметры имеют свой формат
● Желательно указывать типы (OID)
● Типы могут определяться автоматически
14
Пример Parse (P) и OID type
15
Порталы и Describe (D)
● SELECT и открытый курсор
● WITH в python.
● D - задать имя портала*
16
Bind - Параметры к запросу
● Текстовый формат параметров
● Бинарный формат параметров
● Формат ответа - бинарный/текстовый
● Формат ответа выбирается неявно.
17
Execute и Sync
Execute - запрос готов, нужно выполнить.
Sync - Завершает сессию BEGIN/COMMIT.
18
Кэшируемый запрос
● Prepare( Parse/Describe/Sync )
● Execute( Bind(D)/Execute(D)/Sync )
● Execute( Bind(D)/Execute(D)/Sync )
19
Обычный запрос
● Execute(Parse/Bind/Execute/Sync)
● Execute(Parse/Bind/Execute/Sync)
● Execute(Parse/Bind/Execute/Sync)
20
Итог по postgresql
● Простой текстовый запрос
● Расширенный flow с/без кэша
● Расширенный flow - запрос string
● Расширенный flow - парам. text/binary
21
pgbouncer
● session - по сути прокся
● transaction - после завершения тран.
● statement - после завершения запроса.
Управляет пулом соединений к Postgresql
22
pgbouncer - session
Умеет работать с prepared statement.
Нет особых преимуществ
Хочется transaction
23
statement/transaction - prepared
Невозможно
24
transaction
● Prepare( Parse/Describe/Sync )
● Execute( Bind(D)/Execute(D)/Sync )
time
25
https://goo.gl/eLtNH1
26
statement/transaction
● Execute(Parse/Bind/Execute/Sync)
● Execute(Parse/Bind/Execute/Sync)
Работает!
27
asyncpg - не работает так
Холивар
https://goo.gl/C2gUzB
Asyncpg-форк
https://goo.gl/v21JQn
28
libpq
Интерфейс PostgreSQL для
программирования приложений на
языке C
Execute(Parse/Bind/Describe/Execute/Sync)
29
https://goo.gl/mGQh7
z
30
Ну и вот - кажется побеждаем!
31
Psycopg - не поддерживает!
Холивар 2010 г.
https://goo.gl/GX3879
Холивар 2013 г.
https://goo.gl/XsKLcE
32
Psycopg - форк
https://goo.gl/GTxPqY
Я еще не
пробовал
Нет
поддержки
33
Psycopg3
https://goo.gl/rgkcgQ
34
● Проблема ответственности
● Преграды на пути
Подводя итог
35
● Проблема ответственности
● Преграды на пути
● Скорость - важный показатель, но не
главный
Подводя итог
36
Вопросы?
● С вами был Алексей Фирсов - adv-experience
● Занимаюсь программированием ~ лет 8-9
● Последние ~ лет 5-6 работаю с Python
● Участник сообщества aio-alibs
● Один из основных maintainers aio-alibs/aiopg
Email: virmir49@gmail.com
Telegram: @virmir49

Сравнение технологий aiopg & asyncpg, Алексей Фирсов. 22 июня, 2019