非常感谢老师的讲解,但是还有个疑问:
在分布式环境下如何进行单点通信?
并不知道目标用户被分配在哪个服务器上
一有消息就向全部服务器推送?
HI同学,向单个用户推送不建议广播gateway。
会话层
这个架构需要继续演进,允许长连接认证(auth),这样每个长连接就对应一个用户ID(uid)。
当我们要给某个uid推送的时候,需要知道uid对应的长连接在哪些服务器上,所以我们需要实现一个会话层(session layer),最简单的就是搭建一套redis cluster,把uid与gateway之间的关系记录下来,然后基于客户端心跳,去redis cluster中做刷新,避免关系过期。
当我们要给uid推送时,可以由logic去session层获取uid所在gateway,然后定向推送到对应gateway,避免集群内广播。
登录
实际工程中,我们不会把帐号密码登录放在gateway里实现,而是写一个单独的认证服务(一般会与公司的账号系统打通),完成认证后发放一个生命期很短的TOKEN,比如JWT,这个TOKEN是可以自验证的。
客户端拿着token建到gateway的连接,然后auth提交token,由gateway直接验证有效,完成会话的建立。