diff --git a/broker/src/main/java/org/apache/rocketmq/broker/metrics/BrokerMetricsManager.java b/broker/src/main/java/org/apache/rocketmq/broker/metrics/BrokerMetricsManager.java index a6707d0dd2c..960c1dd2505 100644 --- a/broker/src/main/java/org/apache/rocketmq/broker/metrics/BrokerMetricsManager.java +++ b/broker/src/main/java/org/apache/rocketmq/broker/metrics/BrokerMetricsManager.java @@ -674,7 +674,13 @@ private void initLagAndDlqMetrics() { .setDescription("Consumer lag messages") .ofLongs() .buildWithCallback(measurement -> - consumerLagCalculator.calculateLag(result -> measurement.record(result.lag, buildLagAttributes(result)))); + consumerLagCalculator.calculateLag(result -> { + // Note: 'record' method uses HashMap which may cause + // concurrent access issues when Pull thread executes Pop callbacks. + synchronized (this) { + measurement.record(result.lag, buildLagAttributes(result)); + } + })); consumerLagLatency = brokerMeter.gaugeBuilder(GAUGE_CONSUMER_LAG_LATENCY) .setDescription("Consumer lag time")