Я работаю над созданием программы, которая должна будет извлекать результаты из хранилища данных и публиковать эти результаты в другой системе.На данные, которые я выбираю, ссылается 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, что и мой код, поэтому они будут довольно близко друг к другу.