我正在开发的系统可能有大量的客户端(比方说一百万)需要定期用一些信息更新*服务器.客户端是用Java编写的.
具体的用例是服务器后端需要具有最新的IP地址到客户端的映射.但客户端IP是动态的,并且受到(有效随机)更改的影响.
我想到的解决方案要求客户端ping服务器以更新其IP.理想情况下,这段时间应该是每分钟一次,但即使是1分钟/ 10分钟也是可以接受的.
我的问题按顺序排列:
>每分钟1M次ping超过10k / sec.所以首先我想知道
这些方法可以扩展以处理这种负载.这是了解可用的选项.
>假设您有多个解决方案,其中哪一个
会是最经济的吗?成本效益至关重要.我没有自己的数据中心或
网上的静态和胖端点,所以服务器应用程序会
需要在某种提供商或最终在云上运行.
笔记:
>我考虑使用我自己的ISP提供的连接从家里运行服务器,但我不确定性能问题,也不知道我的ISP会考虑持续的ping流.
>我无法看到服务器如何自动发现这些IP更改.
解决方法:
Erik,你的问题比听起来要简单得多.
这个问题已经持续了十年,也许两年.无需在这里重新发明*.
为什么轮询/ Ping是一个坏主意
ISP提供的动态IP可以具有可变的租用时间,但通常至少为24-72小时.每隔1-10米ping一次服务器将是一个可怕的资源,可能会在72小时内产生超过4,320个无用的HTTP客户端请求.每个请求都会说大约300字节* 4,320浪费的http请求等于1.3mb浪费的带宽乘以你的目标客户端数量为100万的客户端,你说的是每月浪费的带宽约为1.2 TB!这只是浪费的带宽,而不是运行应用程序并提供有用信息所需的其他带宽.
客户需要更聪明,而不仅仅是经常ping.相反,他们应该能够在启动时检查他们的IP地址是否与DNS匹配,然后仅在IP更改时,向服务器发送通知.这将使您的带宽和服务器处理要求减少数千倍.
您所描述的是动态DNS
您所谈论的是“动态DNS”(既是技术的描述性名称,也是提供SaaS解决方案的公司的名称).
动态DNS非常简单的DNS服务器,允许您快速更改名称和IP地址之间的映射.通常,这对使用仅提供动态IP的ISP的设备很有用.每当IP在动态IP上更改路由器/服务器时,它将通知动态DNS服务器该更改.
>动态DNS的事实标准协议已有详细记录.从这里开始:DNS Update API,我认为您正在寻找的具体内容如下:DynDNS Perform Update.由于路由器硬件通常具有每个人都想使用的内置DynDNS客户端,因此大多数商业实现都非常接近相同的协议.
>大多数路由器(甚至便宜的路由器)已经内置了动态DNS客户端. (您可以编写自己的软客户端,但路由器可能是最有效的位置,因为您的客户端可能使用私有IP进行NAT访问 – 您仍然可以这样做,但代价是公共IP发现的带宽更多)
>快速谷歌搜索“动态DNS Java客户端”带来像这样的完整源项目:Java DynDNS client(未经测试,只是说明了搜索的力量)
系统架构的其他注意事项
让我们说IP-client映射的东西得到解决.你认为这一切都完美无缺,你总是知道每个客户的IP.那么您是否有一个可靠的系统来从移动设备向客户端传输文件?我会说不.
移动设备和家用计算机都可以具有多种连接类型,Wi-Fi,蜂窝数据,也可以是有线数据.这些网络中的每一个都可以具有不同的安全系统.因此,从家庭路由器后面的蜂窝数据移动设备到wifi笔记本电脑的连接看起来与连接到同一wifi网络上的笔记本电脑的wifi移动设备看起来非常不同.
您可能有物理路由器防火墙来应对.家用电脑也可能启用了Windows防火墙,可能是诺顿网络安全,也许是赛门铁克,也许是AVG,也许是区域警报等等……你知道所有这些潜在客户的防火墙考虑因素吗?