在使用多个goroutine去开启消费者时,map并发不安全
虽然知道上游流向下游是有队列进行削峰,但是项目中可能会力求加快消费速率有多个goroutine 对topic进行订阅。
这里可以考虑加个读写锁。
func (serverConsumer *ServerConsumer) SubscribeStatus(mqttGroupId string, statusListener StatusListener) error {
serverConsumer.mu.Lock()
defer serverConsumer.mu.Unlock()
serverConsumer.statusSubscribeHandler[mqttGroupId] = statusListener
return serverConsumer._subscribeStatus(mqttGroupId, statusListener)
}
func recoverSubscribe(serverConsumer *ServerConsumer) error {
topicHandlers := make(map[string]MessageListener)
serverConsumer.mu.RLock()
for k, v := range serverConsumer.topicSubscribeHandler {
topicHandlers[k] = v
}
serverConsumer.mu.RUnlock()
for k, v := range topicHandlers {
err := serverConsumer._subscribeTopic(k, v)
if err != nil {
return err
}
}
statusHandlers := make(map[string]StatusListener)
serverConsumer.mu.RLock()
for k, v := range serverConsumer.statusSubscribeHandler {
statusHandlers[k] = v
}
serverConsumer.mu.RUnlock()
for k, v := range statusHandlers {
err := serverConsumer._subscribeStatus(k, v)
if err != nil {
return err
}
}
return nil
}
在使用多个goroutine去开启消费者时,map并发不安全
虽然知道上游流向下游是有队列进行削峰,但是项目中可能会力求加快消费速率有多个goroutine 对topic进行订阅。
这里可以考虑加个读写锁。