分布式挤号问题
分布式挤号问题
需求
在分布式环境下,多台服务器后端处理用户连接,对于用户连接可能会打到不同的服务器上。在这样的条件下,如何实现用户异地登录挤号的需求呢。用户异地登录,登录请求可能会打到另外一台服务器上,分布式系统如何将旧的在另一台服务器的用户连接给断开,接受新的登录连接呢?
实现方案
redis+消息队列实现
首先我们来分析需求制定方案。不允许用户同时登录在多台服务器上,也就是登录具有唯一性。自然而然我们能够想到使用唯一的标识表示用户的登录状态,这里用登录的服务器id表示唯一的登录状态,并缓存在redis中,其实也就是分布式锁的使用。redis持有用户的服务器id,表示用户锁定在这台服务器上,不能够登录到其他服务器。
然后就是分布式状态变更通知的实现。用户在新的服务器上请求登录,我们希望通知持有用户登录记录的服务器去释放分布式锁,再由新的服务器去持有分布式锁。分布式下的消息通知,一般使用消息队列实现。新服务器发送释放登录分布式锁的消息,由消息队列进行广播。旧服务器接收到请求后释放并断开用户连接,新服务器再建立连接并持有分布式锁。
This post is licensed under CC BY 4.0 by the author.