有图,我架构的GO语言IM,但手机如何通过忽略机房的ip,用统一域名进行连接?
架构肯定没有这么简单,因为有登录服务器 消息服务器......用户的账号密码肯定不是分散的存储在各地机房
有图,我架构的GO语言IM,但手机如何通过忽略机房的ip,用统一域名进行连接?
架构肯定没有这么简单,因为有登录服务器 消息服务器......用户的账号密码肯定不是分散的存储在各地机房
1 回答908 阅读✓ 已解决
1 回答697 阅读✓ 已解决
3 回答692 阅读✓ 已解决
2 回答1.3k 阅读
1 回答1.4k 阅读
1 回答828 阅读✓ 已解决
2 回答600 阅读✓ 已解决
如果你要用统一的域名进行连接,那就不能用这种方案(这也是我觉得方案二不太行的原因之一)
Q:APP下载后怎么知道要连哪个IP?
不能根据地理位置获取,如果这样的话,一端A给另一端B发消息的时候,服务器是不知道B在哪里的,所以只能根据客户端的唯一ID+算法来判断去连那个服务器。
借用 redis hash槽的图

假设现在有
服务器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
有一个特定的算法:
伪代码
当 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到的数据可能会有问题,到时候会有问题。
===
可以试试,在客户端连接到任意一个服务器的时候,程序自己维护一个表,记录当前实例有连接着那些客户度,然后在需要的时候,查询一下表。