3

我正在开发的系统可能有大量的客户端(比如说一百万),它们需要定期用一些信息更新中央服务器。客户端是用 Java 编写的。

具体的用例是服务器后端需要有 IP 地址到客户端的最新映射。但是客户端 IP 是动态的,并且会(实际上是随机的)变化。

我想到的解决方案要求客户端 ping 服务器以更新其 IP。理想情况下,该周期应该是每分钟一次,但即使是 1 ping/10 分钟也是可以接受的。

我的问题,按顺序:

  1. 每 1 分钟 1M ping 超过 10k/秒。 所以首先我想知道这些方法可以扩展以处理这样的负载。 这是为了了解可用的选项。

  2. 假设您有多个解决方案,其中哪一个是最经济的? 成本效益至关重要。我没有自己的数据中心或网络上的静态和胖端点,因此服务器应用程序将需要在某种提供商上运行或最终在云上运行。

笔记:

  • 我考虑过使用我自己的 ISP 提供的连接从家里运行服务器,但我既不确定性能问题,也不确定我的 ISP 会如何看待持续不断的 ping 流。

  • 我看不到服务器如何自动发现这些 IP 更改。

4

6 回答 6

2

也许您可以为此目的使用 SIP 作为协议?可能 java SIP 库已经解决了您的问题。

顺便说一句,不错的应用程序。

于 2012-04-18T20:25:54.820 回答
2

Erik,你的问题比听起来要简单得多。

这个问题已经存在了十年或者两年。无需在这里重新发明轮子。

为什么轮询/ping 是一个坏主意

ISP 提供的动态 IP 可以具有可变的租用时间,但通常至少为 24-72 小时。每 1-10m 对服务器进行一次 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 更新 API,我认为您正在寻找的细节在这里:DynDNS 执行更新。由于路由器硬件通常具有每个人都想使用的内置 DynDNS 客户端,因此大多数商业实现都非常接近相同的协议。
  • 大多数路由器(即使是便宜的)已经内置了动态 DNS 客户端。(您可以编写自己的软客户端,但路由器可能是最有效的位置,因为您的客户端可能会使用私有 IP 进行 NAT - 您仍然可以这样做,但代价是公共 IP 发现需要更多带宽)
  • 在谷歌上快速搜索“动态 DNS Java 客户端”会找到像这样的完整源代码项目:Java DynDNS 客户端(未经测试,仅说明搜索的强大功能)

系统架构的其他注意事项

假设 IP 客户端映射问题得到解决。你想通了,它工作得很好,你总是知道每个客户端的 IP。然后,您会拥有一个可靠的系统来将文件从移动设备传输到客户端吗?我会说不。

手机和家用电脑都可以有多种连接类型,Wi-Fi、蜂窝数据,也许还有有线数据。这些网络中的每一个都可能具有不同的安全系统。因此,从蜂窝数据移动设备到家庭路由器后面的 wifi 笔记本电脑的连接看起来与在同一个 wifi 网络上连接到笔记本电脑的 wifi 移动设备非常不同。

您可能需要应对物理路由器防火墙。此外,家用电脑可能启用了 Windows 防火墙,可能是 Norton Internet Security,可能是 symantec,可能是 AVG,可能是区域警报等……您知道所有这些潜在客户的防火墙注意事项吗?

于 2012-04-22T16:58:27.463 回答
1

我建议更好地调整你的 java 程序以了解 IP 更改,然后只访问 Web 服务。

你可以这样做,

  1. 在您的 java 程序启动时提取机器的 IP 并将其存储在全局变量或更好的一些属性文件中。
  2. 运行批处理/调度程序,它将每 30 秒/1 分钟检查一次您的 IP 是否有更改。Java Quartz Scheduler对您来说非常方便。
  3. 在 IP 更改的情况下调用 Web 服务。

这样可以减少您的服务器角色,从而减少流量和连接。

于 2012-04-20T21:09:09.743 回答
1

您可以在 UDP 之上创建自己的协议,例如基于 XML。定义 3 条消息:

  • request - 客户端向服务器请求质询
  • 挑战 - 服务器回复挑战(基本上是一个随机数)
  • 响应 - 客户端将用户名和哈希密码 + 质询发送回服务器

它是轻量级的,而且不会太拥挤。您可以将其负载平衡到任何层的多个服务器或使用负载平衡器。

只要您在 C/C++ 中进行服务器端操作,任何普通 PC 都可以每分钟处理数百万次此类点击(我不了解 java 网络性能)

于 2012-04-22T14:41:54.813 回答
0

我有正确的用例吗?一个用户社区都想接收彼此的图片?您不想将图像托管在服务器上,而是直接将它们广播给所有用户?

这里有两个问题。第一个问题是“如何知道自己的WAN IP地址是否发生了变化”。

如果您未经过 NAT,则:

InetAddress.getLocalHost()

会告诉你你的IP地址。

如果您是 NATed,那么使用动态 DNS 并解析您自己的主机名将起作用。

第二个问题类似于“如何在互联网上来来往往的主机之间共享图片”。

可能的解决方案空间包括:

IP 组播,可能带有前向纠错和轮播,例如 FLUTE。

文件群 - 例如 bittorrent。

使用 Jabber、AMQP、JMS、STOMP 或类似工具的发布/订阅消息总线解决方案。合适的实现包括 RabbitMQ、ActiveMQ 等。JMS 主题是这里的一个关键概念。

该解决方案应该避免在 IP 级别做事的巨大开销。

于 2012-04-22T07:48:10.660 回答
0

请看一下 no-ip 的工作原理。您的要求与它的功能完全相同。

于 2012-04-22T06:35:54.987 回答