问答详情
源自:-

分布式环境下单点通信的问题

非常感谢老师的讲解,但是还有个疑问:

在分布式环境下如何进行单点通信?

并不知道目标用户被分配在哪个服务器上

一有消息就向全部服务器推送?

提问者:慕尼黑5866961 2018-08-06 22:52

个回答

  • 小鱼儿老师
    2018-08-07 13:46:45

        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直接验证有效,完成会话的建立。