снимаем нагрузку с базы данных, упрощаем код основного приложения
Mikalai Saskavets
Group Manager
2021
Mikalai Saskavets
Group Manager
ex. Full Stack Web Developer
• профессионально разрабоатываю под web с 2006
• пишу на Python c 2013
• рассказываю про подходы к разработке с 2018
Change Data Capture
Приложение
Приложение
и много пользователей
Приложение
и много пользователей
и много данных в большой БД
Приложение
и много пользователей
и много данных в большой БД
и сложная, запутанная бизнес логика
один
пользовательский
запрос
|
▼
Приложение
|
|-> 1-10 подзапросов к БД
|-> 2-3-5 подзапросов к внешнему API
|-> 1-2 подзапроса на обновление поискового индекса
|-> тысячи их
@api_view(["POST"])
def mark_as_featured(request, id):
article = Articles.objects.get(id=id)
article.featured_start_date=now()
article.featured_end_date=__caclulate(article)
article.save()
# the magick is happening somewhere under the hood
return JsonResponse(article.as_json())
⇄ Захватчик изменений для поискового индекса
⇄ Захватчик изменений для пушей
⇄ Захватчик изменений для рассылки писем
Способы детектирования изменений в базе
Метаданные (поля last_update/change_date)
Триггеры на базе
Транзакционный лог/Журнал изменений
Детектирование изменений через метаданные
id
...
last_modified
1
...
2021-08-25 11:12:01
2
...
2021-08-25 11:12:23
3
...
2021-08-25 11:12:43
4
...
2021-08-25 11:12:54
5
...
2021-08-25 11:12:26
6
...
2021-08-25 11:12:41
Детектирование изменений через метаданные
id
...
last_modified
1
...
2021-08-25 11:12:01
2
...
2021-08-25 11:12:23
3
...
2021-08-26 19:12:43
4
...
2021-08-25 11:12:54
5
...
2021-08-25 11:12:26
6
...
2021-08-25 11:12:41
7
...
2021-08-26 19:12:55
Детектирование изменений через метаданные
id
...
last_modified
1
...
2021-08-25 11:12:01
2
...
2021-08-25 11:12:23
3
...
2021-08-26 19:12:43
4
...
2021-08-25 11:12:54
6
...
2021-08-25 11:12:41
7
...
2021-08-26 19:12:55
Захват изменений через триггеры
Вешаем триггеры на операции изменения:
BEFORE UPDATE
BEFORE INSERT
BEFORE DELETE
AFTER UPDATE
AFTER INSERT
AFTER DELETE
Захват изменений через триггеры
CREATE TRIGGER log_article_changes_trigger
BEFORE UPDATE OR INSERT OR DELETE
ON articles
FOR EACH ROW
EXECUTE PROCEDURE log_article_changes();
Захват изменений через триггеры
CREATE OR REPLACE FUNCTION log_article_changes()
RETURNS TRIGGER
LANGUAGE PLPGSQL
AS
$$
BEGIN
IF NEW.featured_start_date <> OLD.featured_start_date THEN
INSERT INTO articles_featured_log
(
article_id, featured_start_date, changed_on
)
VALUES
(
OLD.id, NEW.featured_start_date, now()
/* TODO: fix for "AFTER INSERT" cases */
);
END IF;
RETURN NEW;
END;
$$
Транзакционный лог Журнал изменений
Транзакционный лог в случае PostgreSQL
WAL (Write Ahead Log)
WAL PostgreSQL как механизм репликации
Схема использования WAL для репликации PostgreSQL
Схема использования WAL для репликации PostgreSQL
Debezium как вариант реализации CDC для PostgreSQL
Debezium как вариант реализации CDC
Debezium без Kafka (экспериментальный режим!)
Встраивание Debezium в ваше Java приложение
Используя Embedding Debezium Connectors / Debezium Engine API можно отказаться от слоя с очередью
Встраивание Debezium в ваше Java приложение
Используя Embedding Debezium Connectors / Debezium Engine API можно отказаться от слоя с очередью
PgSync: синхронизация PostgreSQL и Elasticsearch
https://pgsync.com/
https://github.com/toluaina/pgsync
https://github.com/topics/change-data-capture
Supabase Realtime: изменения из PostgreSQL в вебсокеты
Огромное количество возможностей
Минусы реализации CDC через WAL механизмы
WAL не бесплатен
Под CDC резервируются replication slots
Потенциальное переполнение диска базы (-> падение базы)
Debezium как вариант реализации CDC
Плюсы и минусы CDC
Минусы:
Инфраструктура и архитектура усложняются
Тяжело дебажить
Плюсы и минусы CDC
Ещё минусы:
Непросто "перенакатить" действия в случае выявленных ошибок
Нужен мониторинг
Плюсы и минусы CDC
Плюсы:
Упрощается кодовая база основного приложения
Легко добавлять новые обработчики
Плюсы и минусы CDC
Ещё плюсы:
Большая свобода выбора подходящий инструментов под задачу
Снижается нагрузка на основную БД
Плюсы и минусы CDC
Минусы:
Инфраструктура и архитектура усложняются
Тяжело дебажить
Непросто "перенакатить" действия в случае выявленных ошибок
Нужен мониторинг
Плюсы:
Упрощается кодовая база основного приложения
Легко добавлять новые обработчики
Большая свобода выбора подходящий инструментов под задачу
Снижается нагрузка на основную БД
В каких случаях выбирать CDC подход
Проект Data-центричен
Приложение уже сильно завязано на базу данных
В каких случаях выбирать CDC подход
Проект Data-центричен
Приложение уже сильно завязано на базу данных
Выполняемые задачи можно сделать идемпотентными
В каких случаях выбирать CDC подход
Проект Data-центричен
Приложение уже сильно завязано на базу данных
Выполняемые задачи можно сделать идемпотентными
В проекте уже есть ETL/ELT пайплайны и есть нужда ускорить их
В каких случаях выбирать CDC подход
Проект Data-центричен
Приложение уже сильно завязано на базу данных
Выполняемые задачи можно сделать идемпотентными
В проекте уже есть ETL/ELT пайплайны и есть нужда ускорить их