有图,我架构的GO语言IM,但手机如何通过忽略机房的ip,用统一域名进行连接?

有图,我架构的GO语言IM,但手机如何通过忽略机房的ip,用统一域名进行连接?
架构肯定没有这么简单,因为有登录服务器 消息服务器......用户的账号密码肯定不是分散的存储在各地机房

image.png

阅读 949
1 个回答

如果你要用统一的域名进行连接,那就不能用这种方案(这也是我觉得方案二不太行的原因之一)

Q:APP下载后怎么知道要连哪个IP?
不能根据地理位置获取,如果这样的话,一端A给另一端B发消息的时候,服务器是不知道B在哪里的,所以只能根据客户端的唯一ID+算法来判断去连那个服务器。

借用 redis hash槽的图
image.png

假设现在有
服务器S1 IP 11.11.11.11 域名 s1.conn.simple.com
服务器S2 IP 12.12.12.12 域名 s2.conn.simple.com
服务器S3 IP 13.13.13.13 域名 s3.conn.simple.com

客户端 xiaoming123
客户端 xiaozhang124
客户端 xiaowang125

有一个特定的算法:
伪代码

def Connect_to_where(client_name):
    hash_value = hash(client_name)
    result = hash_value % 3 + 1
    domain = "s" + str(result) + ".conn.simple.com"
    return domain  #这里会返回拼接后的域名

当 xiaoming123 要连接服务器的时候,执行一下这个函数 Connect_to_where("xiaoming123") ,这个时候xiaoming123根据hash的结果,去连接"s3.conn.simple.com"
同样的,xiaowang125 要连接服务器的时候,也执行这个函数,得到:"s1.conn.simple.com"

假如 xiaoming123 要给 xiaowang125 发送消息,服务器收到消息之后,发现消息要传递给xiaowang125 时,也执行这个函数 Connect_to_where("xiaowang125"),服务器就能得到 xiaowang125 应该在那个服务器上。

===

这个方案不行的原因是这样的,假如你服务器增加或者减少的时候,客户端的hash算法不能及时更换,结果hash到的数据可能会有问题,到时候会有问题。

===

可以试试,在客户端连接到任意一个服务器的时候,程序自己维护一个表,记录当前实例有连接着那些客户度,然后在需要的时候,查询一下表。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题