Как часто стоит открывать и закрывать соединение при записи в БД из Kafka?

Ссылка скопирована
1 ответ

Имеется сервис Kafka Consumer, который читает данные из топика в Кафке и затем записывает их в БД. В данный момент реализовано так, что при поступлении нового сообщения в топик, открывается соединение с БД, идёт запись, затем соединение закрывается.
Сообщения в топик Кафки приходят с непостоянной скоростью. Могут приходить раз в пару секунд, а могут раз в несколько минут (зависит от времени суток, дня недели и пр.).

И вопрос в том, что открывать новое соединение раз в пару секунд, наверное, не очень оптимально.

У меня, как мне кажется, есть три варианта:

  • Оставить как есть
  • Не закрывать соединение вообще
  • Проверять поступление сообщений каждые N минут и если сообщений не было, то закрывать соединение, а при получении нового сообщения открывать соединение

Какой из этих вариантов более правильный или может есть ли какие-то иные верные подходы?

Дополнительно:

А есть проблемы с этим?

  • Sergey, проблем с данными нет, скорость работы тоже в целом устраивает, но интересно послушать другие мнения, best practices и всякое такое. Возможно пригодится в будущих проектах с бо́льшим количеством данных.
  • Я использую буфер в виде очереди, при накоплении которой открывается соединение и данные записываются в БД, очередь очищается.
    Очередь имеет 2 параметра:
    макс_время_жизни - каждые N мин посылается сигнал проверки очереди, если она не пустая, то запись в БД
    макс_кол-во_сообщений - при появлении сообщения в топике, проверяется размер очереди, если равно пределу, то запись в БД и новое сообщение добавляется в очередь
  • Александр, идея хорошая, но для моего случая не подходит. У нас требование - обрабатывать данные сразу после их поступления
  • Ответы:

    Просто используй пул соединений к СУБД в своей программе. Тогда открытием и закрытием будет заниматься этот механизм.

    Не закрывать соединение вообще

    это нехороший вариант, по очевидным причинам.

    Нужно решить такую задачу?

    Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

    Заказать помощь
    Лучший ответ
    1
    Елена Вебер Ответ

    При записи данных в базу данных из Kafka, частота открытия и закрытия соединения зависит от нескольких факторов, таких как объем данных, пропускная способность сети, нагрузка на сервер базы данных и другие. Однако, есть несколько общих рекомендаций, которые могут помочь оптимизировать процесс записи данных.

    1. Пакетная запись: Вместо того чтобы открывать и закрывать соединение для каждой записи, рекомендуется использовать пакетную запись. Это позволит уменьшить нагрузку на сервер базы данных и улучшить производительность.

    2. Пул соединений: Использование пула соединений позволит повторно использовать соединения с базой данных, что также поможет улучшить производительность. Это особенно полезно в случае большого объема записей.

    3. Оптимизация запросов: Перед отправкой запросов в базу данных из Kafka, рекомендуется оптимизировать их, чтобы уменьшить количество обращений к базе данных. Это может включать в себя объединение нескольких запросов в один или использование хранимых процедур.

    Пример использования пула соединений в PHP:

    // Создание пула соединений
    $connectionPool = new ConnectionPool(function () {
        return new PDO('mysql:host=localhost;dbname=test', 'username', 'password');
    }, 10);
     
    // Получение соединения из пула
    $connection = $connectionPool->get();
     
    // Выполнение запроса
    $statement = $connection->prepare('INSERT INTO table (column) VALUES (:value)');
    $statement->bindParam(':value', $value);
    $statement->execute();
     
    // Возврат соединения в пул
    $connectionPool->put($connection);

    // Создание пула соединений $connectionPool = new ConnectionPool(function () { return new PDO('mysql:host=localhost;dbname=test', 'username', 'password'); }, 10); // Получение соединения из пула $connection = $connectionPool->get(); // Выполнение запроса $statement = $connection->prepare('INSERT INTO table (column) VALUES (:value)'); $statement->bindParam(':value', $value); $statement->execute(); // Возврат соединения в пул $connectionPool->put($connection);

    Учитывая вышеперечисленные рекомендации, рекомендуется открывать и закрывать соединение с базой данных из Kafka по мере необходимости, оптимизируя процесс записи данных для повышения производительности и эффективности.

    Другие ответы (0)

    Пока нет других ответов. Будьте первым, кто поможет автору.

    Ответить на вопрос

    комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *

    Вам также может быть интересно