我正在开发的系统可能有大量客户端(比方说一百万)需要定期更新中央服务器并提供一些信息。客户端是用Java编写的。
具体的用例是服务器后端需要具有最新的IP地址到客户端的映射。但客户端IP是动态的,并且受(有效随机)变化的影响。
我想到的解决方案要求客户端ping服务器以更新其IP。理想情况下,这段时间应该是每分钟一次,但即使是1分钟/ 10分钟也是可以接受的。
我的问题,按顺序:
每1分钟1M次ping超过10k / sec。 首先,我想知道 这些方法可以扩展以处理这样的负载。这是了解可用的选项。
假设您有多个解决方案,其中哪一个 会是最经济的吗? 成本效益至关重要。我没有自己的数据中心或 网上的静态和胖端点,所以服务器应用程序会 需要在某种提供商或最终在云上运行。
注意:
我考虑过使用我自己的ISP提供的连接从家里运行服务器,但我不确定性能问题,也不知道我的ISP会不会想到持续的ping流。
我无法看到服务器如何自动发现这些IP更改。
答案 0 :(得分:2)
也许您可以将SIP用作协议用于此目的? 可能java SIP库已经解决了你的问题。
顺便说一句不错的应用程序。
答案 1 :(得分:2)
这个问题已经持续了十年左右。无需在这里重新发明轮子。
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”(既是技术的描述性名称,也是提供SaaS解决方案的公司的名称)。
动态DNS非常简单,是一种DNS服务器,可以让您快速更改名称和IP地址之间的映射。通常,这对使用仅提供动态IP的ISP的设备很有用。每当IP在动态IP上更改路由器/服务器时,它都会通知动态DNS服务器该更改。
让我们说IP-client映射的东西得到解决。你认为这一切都完美无缺,你总是知道每个客户的IP。那么您是否有一个可靠的系统来从移动设备向客户端传输文件?我会说不。
手机和家用电脑都可以有多种连接类型,Wi-Fi,蜂窝数据,也可能是有线数据。这些网络中的每一个都可以具有不同的安全系统。因此,从家庭路由器后面的蜂窝数据移动设备到wifi笔记本电脑的连接看起来与连接到同一wifi网络上的笔记本电脑的wifi移动设备看起来非常不同。
您可能需要物理路由器防火墙才能应对。家用电脑也可能启用了Windows防火墙,可能是诺顿网络安全,也许是赛门铁克,也许是AVG,也许是区域警报等等...你知道所有这些潜在客户的防火墙考虑因素吗?
答案 2 :(得分:1)
我建议你更好地调整你的java程序以了解IP更改,然后只打网页服务。
你可以这样做,
这样可以减少您的服务器角色,从而减少流量和连接。
答案 3 :(得分:1)
您可以在UDP之上创建自己的协议,例如基于XML。定义3条消息:
它重量轻,而且不会太繁重。您可以将其负载平衡到任何层的多个服务器或使用负载平衡器。
如果你在C / C ++中做服务器端(我不知道java网络性能),任何普通的PC每分钟都可以处理数百万次点击
答案 4 :(得分:0)
请查看no-ip的工作原理。您的要求与它的要求完全相同。
答案 5 :(得分:0)
我有用例吗?用户社区都希望彼此接收图片?您不希望在服务器上托管图像,而是直接将它们广播给所有用户?
这里有两个问题。第一个问题是“如何知道我自己的WAN IP地址是否已经改变。”
如果你没有被NAT,那么:
InetAddress.getLocalHost()
会告诉你你的IP地址。
如果您是NATed,那么使用动态DNS并解析您自己的主机名将起作用。
第二个问题是“如何在互联网上出现的主机之间共享图片”。
可能的解决方案空间包括:
IP多播,可能具有前向纠错和轮播,例如FLUTE。
文件群集 - 例如BitTorrent的。
使用Jabber,AMQP,JMS,STOMP或类似的发布/订阅消息总线解决方案。合适的实现包括RabbitMQ,ActiveMQ等.JMS主题是一个关键概念。
解决方案应避免在IP级别处理大量开销。