当前位置: 首页 > 知识库问答 >
问题:

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

浦德义
2023-12-05

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

image.png

共有1个答案

庄瀚玥
2023-12-05

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

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到的数据可能会有问题,到时候会有问题。

===

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

 类似资料:
  • 我正在尝试使用以下命令从现有的PostgreSQL数据库生成模型: 它通过尝试连接到主机来“工作”一次,但由于无法访问端口5432而失败。 我修复了网络问题,现在端口已打开,但连接字符串中的< code>Host被忽略,我得到的错误是: 28000:无pg_hba。主机“my.public.ip.address”、用户“postgres”、数据库“my-db”的conf条目,SSL关闭 我不知道为

  • 本文向大家介绍linux下通过go语言获得系统进程cpu使用情况的方法,包括了linux下通过go语言获得系统进程cpu使用情况的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了linux下通过go语言获得系统进程cpu使用情况的方法。分享给大家供大家参考。具体分析如下: 这段代码通过linux的系统命令 ps来分析cpu的使用情况,代码如下: 希望本文所述对大家的Go语言程序设计有所

  • 忽略域名 您可能要从mitmproxy的拦截机制中免除部分流量的主要原因有两个: 证书固定:使用证书固定保护某些流量, 而mitmproxy的拦截会导致错误。例如,如果mitmproxy处于活动状态,则Twitter应用程序,Windows Update或Apple App Store无法工作。 便利性:您实际上并不关心某些流量,而只是希望它们消失。请注意,在这里,mitmproxy的Limit选

  • 主要内容:手动触发宕机,在运行依赖的必备资源缺失时主动触发宕机,在宕机时触发延迟执行语句Go语言的类型系统会在编译时捕获很多错误,但有些错误只能在运行时检查,如数组访问越界、空指针引用等,这些运行时错误会引起宕机。 宕机不是一件很好的事情,可能造成体验停止、服务中断,就像没有人希望在取钱时遇到 ATM 机蓝屏一样,但是,如果在损失发生时,程序没有因为宕机而停止,那么用户将会付出更大的代价,这种代价可以是金钱、时间甚至生命,因此,宕机有时也是一种合理的止损方法。 一般而言,当宕机发生时

  • 问题内容: 我最近看到了以下帖子: 内存分配器的级别不低于malloc。(默认分配器通常直接或间接调用malloc) 分配器仅允许您指定不同的分配策略。例如,您可以使用一个分配器,该分配器一次调用malloc来检索一个大的内存池,然后对于后续的分配请求,它仅返回该池的一小部分。 或者,您可以将其用作挂钩,以便每次分配或释放内存时都可以执行一些其他任务。 关于您的第二个问题,malloc是在不损失可

  • 本文向大家介绍go语言通过管道连接两个命令行进程的方法,包括了go语言通过管道连接两个命令行进程的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了go语言通过管道连接两个命令行进程的方法。分享给大家供大家参考。具体实现方法如下: 希望本文所述对大家的Go语言程序设计有所帮助。