not sure if we handle race condition correclty, like disconnection, multi user. Also, to improve the concurrency, we should use room-level lock as more as possible.