Повышение производительности с помощью Distributed Counter, поиск библиотеки - PullRequest
1 голос
/ 10 октября 2019

У нас есть система с множеством потоков, каждый из которых увеличивает один и тот же счетчик. В конце нам нужно общее количество приращений всех потоков. Из-за размера конечного результата и стоимости синхронизации мы подозреваем некоторые проблемы с производительностью нашего текущего решения, в котором используется синхронизированный доступ к одной переменной.

Чтобы избежать синхронизации, я хотел бы использовать DistributedСчетчик (правильный термин?), Где каждый поток увеличивает свою собственную копию счетчика. Индивидуальные счетчики суммируются только один раз при получении окончательного результата.

Я мог бы реализовать такой счетчик с нуля. Но я думаю, я не первый с таким требованием. Удивительно, но быстрый поиск не обнаружил никакой библиотеки. Не могли бы вы предложить какую-нибудь библиотеку или демонстрационный код? Я ищу простые решения, без тяжелых рамок.

Ответы [ 3 ]

2 голосов
/ 10 октября 2019

Много ли в вашей системе процессов, управляющих всеми потоками?

если все потоки управляются одним и тем же процессом, я не думаю, что вам нужен распределенный ресурс (счетчик), вы можете просто использовать, как предложено, AtomicInteger Atomic означает, что он безопасен для потоков ик нему можно получить доступ из многих потоков, и повреждение данных не произойдет.

, если ваша система использует много процессов, чем вам потребуется распределенный ресурс. Вы можете использовать любой тип базы данных для достижения этой цели. мне кажется, что Redis может быть хорошим вариантом. или любую базу данных MySql, если вы хотите 100% согласованности данных

0 голосов
/ 30 октября 2019

Решение, которое вы предлагаете себе, - счетчик CRDT. Возможно, поиск по этому ключевому слову позволит вам найти подходящую реализацию.

0 голосов
/ 10 октября 2019

Если это процесс с 1 JVM, просто прочитайте локальные счетчики потоков, чтобы суммировать их.

Если это межпроцессный процесс, файлы с отображением в памяти отлично подходят для производительности и только API уровня ввода (или уровня буфера) API ввода / вывода, когда дело доходит до чтения и записи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...