Java параллельных запросов к той же таблице для обработки электронной почты - PullRequest
0 голосов
/ 01 июля 2019

У меня есть таблица mysql, которая действует как очередь электронной почты - содержит все записи, которые необходимо отправить.Я пытаюсь выполнить отправку каждого письма с несколькими потоками.Каждый поток должен сделать запрос к этой таблице очереди электронной почты, чтобы получить набор записей, которые затем будут отправлены и удалены из таблицы.Как вы решили, какие записи каждый поток будет извлекать из таблицы?Оттуда, как вы управляете этими параллельными запросами?Я использую Java Spring Boot с Hibernate.

1 Ответ

0 голосов
/ 01 июля 2019

Я хотел бы представить что-то вроде ниже.Это делается с помощью идентификатора строки в базе данных.Не очень хорошее решение, если у вас огромные пробелы в идентификаторе.Вы можете реорганизовать это для использования некоторого столбца даты или любых других данных, которые могут помочь в пакетных записях.

10 - количество потоков

i - номер текущего потока, который мы повторяемчерез

10000 - размер пакета, используемый для получения пакета из 10000 электронных писем

counter - переменная, определяющая, какой поток должен отвечать за какой идентификатор пакета

maximumEmailId - максимальный идентификатор электронной почты в таблице электронных писем

1. Create 10 numbered threads - 0, 1, 2..., 9
2. Start every thread
3. For each thread number (i):
4. For counter = 0, step 10000
5. if (counter / 10000) % 10 == i then
- SELECT * FROM emails WHERE id BETWEEN (counter) AND (counter + 10000)
- Send emails
6. if counter > maximumEmailId then break;

Он будет вести себя так:

iteration 0:
  -thread 0 - counter = 0 - select ... where id between 0 and 10000
  -thread 1 - counter = 10000 - select ... where id between 10000 and 20000
  -thread 9 - counter = 90000 - select ... where id between 90000 and 100000

iteration 1:
  -thread 0 - counter = 100000 - select ... where id between 100000 and 11000
  -thread 1 - counter = 110000 - select ... where id between 110000 and 12000
  -thread 9 - counter = 190000 - select ... where id between 190000 and 20000

По сути, это решение не имеет ничего общего с блокировкой, техническими параллельными приемами и т. Д., Вы просто делите свой набор данных, чтобы никто не пытался прочитать один и тот же пакет.Представьте себе 100 коробок на земле, нить 0 принимает коробки с номерами 0, 10, 20,...,90, нить 1 коробки 1, 11, 21,...,91 и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...