每次如何将用户发送到同一goroutine

时间:2018-12-30 18:31:06

标签: go goroutine

说我有很多goroutine工人来处理队列中的工作。

如何确保每次都将相同的用户发送到相同的goroutine?

我基本上必须按顺序处理每个用户消息,因此,如果将它们发送到同一goroutine,则可以由user_id同时执行操作。

1 个答案:

答案 0 :(得分:1)

您没有go例程的控制权。但是,听起来好像您真正想要的是为每个用户存储某种上下文...使用mapmutexsync.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
}

有几件事要注意:

  1. 锁不应保持太长时间。从map读取是 相当快...
  2. 这仅在您只有一个 单个实例...这将无法扩展。
  3. 如果您的实例得到 由于某种原因被杀,您的状态不见了。如果您不需要 短暂的,你很快就碰到需要某种 存储。

如果第2点或第3点对您造成负担,请考虑将这种状态存储在何处而不是在内存中。根据运行的位置,您可以有很多选择。例如,如果您使用的是GCP,则您有Cloud Firestore