说我有很多goroutine工人来处理队列中的工作。
如何确保每次都将相同的用户发送到相同的goroutine?
我基本上必须按顺序处理每个用户消息,因此,如果将它们发送到同一goroutine,则可以由user_id同时执行操作。
答案 0 :(得分:1)
您没有go例程的控制权。但是,听起来好像您真正想要的是为每个用户存储某种上下文...使用map
和mutex
或sync.Map
足够容易了。>
func (h *YourHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
state := h.fetchUserState(r)
// do something with the state
}
func (h *YourHandler) fetchUserState(r *http.Request) UserState {
user := parseUser(r)
h.mu.Lock()
defer h.mu.Unlock()
state, ok := h.users[user]
if !ok {
// Do something like save state for new user
}
return state
}
有几件事要注意:
map
读取是
相当快... 如果第2点或第3点对您造成负担,请考虑将这种状态存储在何处而不是在内存中。根据运行的位置,您可以有很多选择。例如,如果您使用的是GCP,则您有Cloud Firestore。