Skip to content

在使用多个goroutine去开启消费者时,map并发不安全 #1

Description

@mkshift

在使用多个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
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions