У нас есть таблица MySQL, в которую ежедневно записывается около 5 миллионов записей.
Каждая запись требует немного времени для обработки некоторых связанных с ней метаданных. Итак, у нас есть ОДИН процесс «производителя», который отправляет каждый идентификатор записи в очередь сообщений (SQS).
Затем у нас есть 50 «потребителей», которые извлекают каждый идентификатор и выполняют необходимые задачи обработки.
Этот шаблон хорошо работает. Однако объем данных продолжает расти. Наш единственный производитель больше не может справляться с объемом данных, вставляемых в таблицу.
Я понимаю, что мы можем добавить больше потребителей, чтобы ускорить обработку. Но какова хорошая стратегия для ускорения работы производителя без столкновений с идентификаторами?
ОБНОВИТЬ
Вот структура таблицы:
id int(10) AUTO_INCREMENT
name varchar(255)
is_processed tinyint(1)
is_queued tinyint(1)
created_at timestamp
updated_at timestamp
meta_data text
Я хотел бы, чтобы работало несколько производителей, но не знаю, как избежать проблем с параллелизмом.
@RaymondNijland - Мы используем AUTO_INCREMENT для поля id, и это то, что отправляется в SQS. Моя проблема в том, что у нас есть единственный производитель, который может так быстро перебирать записи MySQL. Нам нужно иметь возможность отправлять больше идентификаторов в SQS в секунду.
ваш вопрос может быть более понятным, если вы предоставите структуры таблиц (SHOW CREATE TABLE table) с некоторыми примерами данных и некоторым кодом?
@RaymondNijland - обновлено






В итоге я использовал такой подход: Лучшие практики для многопоточной обработки записей базы данных - это отправляет наборы записей, чтобы их могли забрать несколько потребителей. Это намного быстрее, чем использование очереди для обработки отдельных записей.
Если вы используете
AUTO_INCREMENTв качестве опции столбца, вы не можете получить коллизии идентификаторов