У меня есть таблица базы данных MySQL с несколькими миллионами записей, как показано ниже:
item_id processing_time
1 01:30:00
2 16:50:00
3 23:24:00
В столбце processing_time указано время, когда запись должна обрабатываться каждый день.
Есть хронзапланированное задание (с использованием библиотеки кварца), которое выполняется каждые пять минут и обрабатывает записи из таблицы. Каждый раз, когда задание запускается, оно запрашивает записи с processing_times в течение следующих пяти минут и обрабатывает их.
В настоящее время это задание выполняется только на одном сервере с рабочей нагрузкой, распределенной по нескольким потокам. Из-за количества записей, которые необходимо обработать, я хотел бы распределить работу по нескольким серверам в дополнение к потокам.
Мой вопрос заключается в том, как я могу распределить работу по нескольким серверам и обеспечить, чтобы каждая запись былаобрабатывается только одним сервером.
Первое решение, о котором я подумал, - назначить каждой записи в таблице элементов один узел обработки (1-n) и сохранить это отношение в другой таблице. Например, схема может выглядеть следующим образом:
item_id processing_node
1 1
2 2
3 3
...
Каждый раз, когда создается новый элемент, в таблицу item_processing_node вставляется соответствующая запись. Поскольку время обработки распределяется неравномерно, также должен быть какой-то алгоритм, используемый для обеспечения равномерного распределения между узлами обработки элементов с одинаковым временем обработки.
Второе решение, которое я могу придумать, заключается в использованииархитектура очередей. Один узел (главный узел) запрашивает элементы для обработки и вставляет их в очередь. Затем все узлы читают элементы из очереди.
Есть какие-нибудь мысли по поводу любого из этих решений и какое из них предпочтительнее?