Так что это похоже на довольно распространенный вариант использования, и, возможно, я слишком много думаю об этом, но у меня возникла проблема с сохранением централизованных метрик из нескольких потоков. Скажем, у меня есть несколько рабочих потоков, которые обрабатывают все записи, и каждые 1000 записей я хочу показать какой-то показатель. Теперь я мог бы записывать в каждый поток отдельные метрики, но потом получать числа пропускной способности, но мне пришлось бы добавлять их вручную (и, конечно, временные границы не будут точными). Вот простые примеры:
public class Worker implements Runnable {
private static int count = 0;
private static long processingTime = 0;
public void run() {
while (true) {
...get record
count++;
long start = System.currentTimeMillis();
...do work
long end = System.currentTimeMillis();
processingTime += (end-start);
if (count % 1000 == 0) {
... log some metrics
processingTime = 0;
count = 0;
}
}
}
}
Надеюсь, в этом есть смысл. Также я знаю, что две статические переменные, вероятно, будут AtomicInteger и AtomicLong. , , но может и нет. Интересует, какие у людей есть идеи. Я думал об использовании атомарных переменных и об использовании ReeantrantReadWriteLock - но я действительно не хочу, чтобы метрики останавливали поток обработки (т. Е. Метрики должны оказывать очень минимальное влияние на обработку). Спасибо.