У меня есть сценарий, когда несколько потоков записываются в одну и ту же очередь.
Потоки Appender получают обновления с разных рынков (каждый поток — отдельный рынок) и помещают эти данные в одну и ту же очередь:
ChronicleQueue queue = SingleChronicleQueueBuilder.binary(path + "/market").build();
final ExcerptTailer tailer = queue.createTailer();
appender.writeDocument(
wire -> {
wire
.getValueOut().text("buy")
.getValueOut().text(exchange.name())
.getValueOut().text(currencyPair.toString())
.getValueOut().dateTime(LocalDateTime.now(Clock.systemUTC()))
.getValueOut().text(price);
});
Затем у меня есть совершенно отдельный процесс (другая JVM) для непрерывного чтения из очереди, выполнив:
while (true){
tailer.readDocument(........
Но пока я генерирую около 10 обновлений в очередь в секунду, хвостовик обрабатывает примерно одну запись за 3 секунды. Я думаю, что мне не хватает чего-то фундаментального здесь :-)
Или как правильно постоянно прослушивать обновления в очереди? Я не смог найти другого решения, кроме как while (true), затем сделать...
Я разрабатываю на 18-ядерной машине (36 потоков) и использую Java Affinity для назначения каждой работы собственному процессору.
Спасибо за любые подсказки.