Я использую глобальные счетчики для параллельного приложения go.
Мой вариант использования заключается в том, что счетчик должен быть сброшен через x секунд и записан в БД.
Я пытался использовать мьютекс (я могу сбросить счетчик, используя это)
Также, когда я увеличиваю счетчик, я тоже что-то записываю.
Я обнаружил, что после того, как приложение работает в течение приблизительно 8-9 часов, число зарегистрированных строк и значение счетчика не совпадают (версия мьютекса). Значения счетчика всегда меньше.
Я до сих пор не нашел причину для этого.
Я использую мьютекс следующим образом
func (s *Metrics) AddQps() {
s.qpsMu.Lock()
s.qps++
s.qpsMu.Unlock()
}
And the flushing of metrics is done as follows.
for {
ticker := time.NewTicker(time.Duration(interval) * time.Second)
select {
case <-ticker.C:
logger.Println("flushing metrics...")
}
}
Я реализовал ссылку на мьютекс
[ Как создать глобальный счетчик в golang в высококонкурентной системе
Из-за вышеупомянутой проблемы я сейчас пытаюсь использовать счетчики sync.atomic.
Поскольку я хочу, чтобы метрика была очищена через x секунд, я хотел сбросить счетчик.