Я работаю с библиотекой GPars, работая над улучшением масштабируемости соответствующей системы.Я хотел бы иметь возможность запрашивать базу данных и немедленно запрашивать базу данных, в то время как результаты обрабатываются одновременно.Узким местом является чтение из базы данных, поэтому я бы хотел, чтобы база данных была полностью занята при асинхронной обработке результатов, когда они доступны.Я понимаю, что у меня могут быть некоторые фундаментальные недоразумения относительно того, как работает структура актера, и я был бы рад, чтобы меня исправили!
В псевдокоде я пытаюсь сделать следующее:
Определить двух действующих лиц: один для запуска выбирает базу данных, а другой для обработки записей.
- queryActor запрашивает базу данных и отправляет результаты процессору процессора
- queryActor немедленно запрашивает базу данных снова, не дожидаясь окончания ProcessActor
Возможно, я смог бы добиться простого использованияслучай без использования акторов, но моя конечная цель - иметь пул акторов, который всегда работает над новыми запросами с потенциально разными источниками данных, чтобы увеличить пропускную способность системы в целом.
Актер обработки всегда будет многобыстрее, чем запрос к базе данных, поэтому я хотел бы запросить несколько реплик одновременно.
def processor = actor {
loop {
react {querySet ->
println "processing recordset"
if (querySet instanceof Object[]) {
MatcherDataRowProcessor matcher = new MatcherDataRowProcessor(matchedRecords, matchedRecordSet);
matchedRecords = matcher.processRecordset(querySet);
reply matchedRecords
}
else {
println 'processor fed nothing, halting processor actor'
stop()
}
}
}
}
def dbqueryer = actor {
println "dbqueryer has started"
while (batchNum.longValue() <= loopLimiter) {
println "hitting db"
Object[] querySet
def thisRuleBatch = new MatchRuleBatch(targetuidFrom, targetuidTo)
thisRuleBatch.targetuidFrom = batchNum * perBatch - perBatch
thisRuleBatch.targetuidTo = thisRuleBatch.targetuidFrom + perBatch
thisRuleBatch.targetName = targetName
thisRuleBatch.whereClause = whereClause
querySet = dao.getRecordSet(thisRuleBatch)
processor.send querySet
batchNum++
}
react { processedRecords ->
processor.send false
}
}