Дизайн Java, который использует FixedThreadPool (s) и очереди - PullRequest
0 голосов
/ 17 декабря 2018

Я работаю над созданием программы, которая должна будет извлекать результаты из хранилища данных и публиковать эти результаты в другой системе.На данные, которые я выбираю, ссылается UUID, и есть другие документы, связанные с ним UUID.Я буду публиковать много документов (> 100 тыс. Документов), поэтому я хотел бы сделать это одновременно.Я думаю о следующем дизайне:

Получить список документов из хранилища данных.Каждый документ будет иметь:

docId (UUID)
docData (json doc)
type1 (UUID)
type1Data (json)
type2 (UUUID)
type2Data (json)
list<UUID> type3Ids
list of type3 data (json)

Единственные данные, которые я получаю из моего первого звонка, - это docIds.Я думал о том, чтобы поместить эти документы в очередь и заставить ряд работников (сборщиков) сделать соответствующие вызовы обратно в хранилище данных для извлечения данных.

retrieve the docData from datastore, fill in the type1, type2 and type3 UUIDS
do a batch get to retrieve all the type1, typ2 and type3 docs
Push the results into another queue for posting to other system

Второй набор работников (плакатов) будетпрочитайте из очереди scond каждый документ и опубликуйте результаты во второй системе.

Один вопрос, который у меня возник, должен ли я создать 1 FixedThreadPool (размер X) или два FixedThreadPool (размер X / 2)?Существует ли опасность голодания, если в первой очереди много заданий, так что вторая очередь не запустится до тех пор, пока первая очередь не опустеет?

Сборщики будут вызывать сетевые вызовы, чтобы поговорить сПо всей видимости, они будут более привязаны к IO, чем к CPU.Постеры также будут выполнять сетевые вызовы, но они находятся в облаке в том же VPC, что и мой код, поэтому они будут довольно близко друг к другу.

1 Ответ

0 голосов
/ 18 декабря 2018

Очередь блокировки

Это довольно обычный шаблон.

Если у вас есть две разные задачи, используйте два разных пула потоков и настройте их размер, чтобы вы могли изменять их по мере необходимости./ проверить разные значения на сервере развертывания.

Обычно используют очередь блокировки (BlockingQueue, встроенную в Java 5 и более поздние версии) с ограниченным размером (скажем, 1000 элементов дляпроизвольный пример).

Очередь блокировки потоко-безопасна , поэтому все в первом пуле потоков пишет в него так быстро, как только может, все во втором пуле потоков читает так быстрокак может.Если очередь заполнена, запись просто блокируется, а если очередь пуста, чтение просто блокируется - легко и просто.

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

...