Сервис в реальном времени с одновременными вставками - PullRequest
0 голосов
/ 19 февраля 2020

Текущая ситуация:

Моя структура MySQL состоит из 2000 баз данных, по одной на каждого клиента, все таблицы InnoDB.

Клиенты, использующие мое приложение более или менее 500 000 пользователей.

Я начинаю проект, в котором мне нужно в режиме реального времени записывать все изменения, которые клиенты вносят в некоторые объекты своих данных.

Все эти изменения затем отправляются через файл json в конечную точку с помощью curl.

Я думаю создать на отдельной БД таблицу InnoDB, куда я собираюсь чтобы указать все эти INSERT, одну уникальную и общую таблицу.

Таблица:

CREATE TABLE IF NOT EXISTS `delta_table` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `id_tab` int(11) NOT NULL,
  `op` enum('save','delete') NOT NULL,
  `data` datetime NOT NULL,
  `id_customer` int(11) NOT NULL,
  `processed` enum('no','yes') NOT NULL DEFAULT 'no',
  PRIMARY KEY (`id`),
  KEY `id_customer` (`id_customer`),
  KEY `processed` (`processed`)
) ENGINE=InnoDB;

Это запросы для обработки службы реального времени:

INSERT INTO `db_example`.`delta_table`(`id_tab`, `op`, `data`, `id_customer`, `processed`) 
VALUES (32321, 'save', NOW(), 1000, 'no');

INSERT INTO `db_example`.`delta_table`(`id_tab`, `op`, `data`, `id_customer`, `processed`) 
VALUES (32322, 'delete', NOW(), 1000, 'no');

Каждая в минуту, когда задача cron берет эти данные и составляет файл json для последней операции отправки.

Задача cron выполняет обновление (или удаление), чтобы пометить запись как «отправленную»:

UPDATE `db_example`.`delta_table` SET processed = 'yes' WHERE id = '32';

Как вы думаете, это правильный способ управления ситуацией?

Есть ли у вас какие-либо предложения?

Боюсь, что огромное количество INSERT поступает от клиентов, потенциально каждый секунд, может вызвать некоторую тупиковую ситуацию, я прав?

...