Я играю с библиотекой GPars, работая над улучшением масштабируемости соответствующей системы. Я хотел бы иметь возможность запрашивать базу данных и немедленно запрашивать базу данных, пока результаты обрабатываются одновременно. Узкое место читается из базы данных, поэтому я хочу, чтобы база данных работала полный рабочий день, обрабатывая результаты асинхронно, когда они доступны. Я понимаю, что у меня могут быть некоторые фундаментальные недоразумения в отношении того, как работает актерский каркас, и я был бы счастлив, если бы его исправили!Использование массивных актеров для максимальной пропускной способности из базы данных?
В псевдокоде я пытаюсь сделать следующее:
Определение двух актеров, один для работы выбирает к базе данных, а другой для обработки записей.
- queryActor querys база данные и отправляет результаты processorActor
- queryActor сразу querys базы данных снова, не дожидаясь processorActor закончить
я мог бы достичь простого случая использования без актеров, но моя конечная цель иметь пул актеров, который всегда работает над новыми запросами с потенциально разными источниками данных, чтобы увеличить пропускную способность системы в целом.
Оператор обработки всегда будет намного быстрее, чем запрос к базе данных, поэтому я хотел бы запросить несколько реплик одновременно в будущем.
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
}
}
Спасибо за ваш ответ Джон. Я смотрел на различные шаблоны в библиотеке gpars, и действительно, первое, что я пробовал, это поток данных. В то время я не дошел до этого, но я должен закончить эту реализацию, чтобы понять, как это получается. – barrymac 2011-01-04 10:45:19