Более быстрый производитель в шаблоне очереди производитель / потребитель

У нас есть таблица 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

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

Если вы используете AUTO_INCREMENT в качестве опции столбца, вы не можете получить коллизии идентификаторов

Raymond Nijland 30.04.2018 19:43

@RaymondNijland - Мы используем AUTO_INCREMENT для поля id, и это то, что отправляется в SQS. Моя проблема в том, что у нас есть единственный производитель, который может так быстро перебирать записи MySQL. Нам нужно иметь возможность отправлять больше идентификаторов в SQS в секунду.

phirschybar 30.04.2018 19:46

ваш вопрос может быть более понятным, если вы предоставите структуры таблиц (SHOW CREATE TABLE table) с некоторыми примерами данных и некоторым кодом?

Raymond Nijland 30.04.2018 19:52

@RaymondNijland - обновлено

phirschybar 30.04.2018 19:59
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
0
4
109
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

Другие вопросы по теме