2012-03-31 30 views
3

我正在开发的系统可能有非常大量的客户端(可以说有一百万)需要定期用一些信息更新中央服务器。客户端用Java编写。如何知道广域网IP是否发生了变化并接收到大量的IP地址广播

具体的用例是服务器后端需要IP地址的最新映射到客户端。但客户IP是动态的并且受到(有效的随机)更改。

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

我的问题,在序列:

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

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

注:

  • 我认为用我自己的ISP提供的连接离家服务器,但我既不是肯定的性能问题,也没有人知道我的ISP会去想络绎不绝的ping。

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

+1

他们为什么需要将他们的IP地址发送到服务器? – 2012-03-31 11:37:35

+0

因为我有移动设备连接到计算机,他们需要查询上述服务器的计算机IP地址。由于计算机无法建立与设备的连接,设备需要启动套接字连接 – Erik 2012-03-31 11:44:01

+0

上述移动设备需要做什么? – 2012-03-31 11:45:21

回答

2

埃里克,你的问题似乎比简单得多已发出声音。

这个问题已经存在了十年,也许两年。这里不需要重新发明轮子。

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

由互联网服务供应商所提供的动态IP可以具有可变的租用时间,但通常是至少24-72小时。每隔1到1米对服务器进行一次屏蔽就会造成可怕的资源损失,这可能会在72小时内造成4320个无用的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客户端映射的东西得到解决。你把它全部搞清楚了,它完美地工作,你总是知道每个客户端的IP。你会有一个很好的可靠系统,用于从移动设备向客户端传输文件吗?我会说不。

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

您可能需要与物理路由器防火墙进行抗衡。此外,家用电脑可能会启用Windows防火墙,可能是诺顿互联网安全,可能是赛门铁克,也许AVG,也可能是防区警报等等。您是否知道所有这些潜在客户的防火墙考虑因素?

+0

感谢您的分解。你的DNS解决方案应该可以工作。所有客户都将查询相同的dyndns帐户。并可以通过这样做来了解IP是否已经改变。这是你最初的意思吗?这样客户端只会在ip改变的情况下ping服务器。关于防火墙问题以及每个java客户端如何获得入站连接,我认为UPnP可能可以用来创建端口转发,但不确定。这个想法是,客户端程序安装在一台固定的家用电脑上。如果他们将它安装在ip跳转一整天的Wi-Fi笔记本电脑上,他们不得不在该笔记本电脑上安装客户端。 – Erik 2012-05-02 16:41:32

2

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

不错的应用程序。

+0

将在SIP上读取 – Erik 2012-04-20 15:23:00

1

我会建议更好的调整你的Java程序来知道IP更改,然后只打网络服务。

你可以不喜欢它,

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

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

+0

这只有在计算机直接连接到互联网并因此具有WAN IP时才起作用。煽动感谢 – Erik 2012-05-02 17:19:14

0

请看看没有ip的工作原理。您的要求与其所做的完全相同。

0

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

这里有两个问题。第一个问题是“如何知道我自己的WAN IP地址是否已经改变。”

如果你不经过NAT则:

InetAddress.getLocalHost() 

会告诉你,你的IP地址。

如果你是NAT,那么使用动态DNS和解析你自己的主机名将会起作用。

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

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

IP组播,可能与前向纠错和Carouseling,例如长笛。

File Swarming - 例如BitTorrent的。

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

该解决方案应该避免在IP级别处理大量开销。

+0

。得到这样的评论真的很花时间。我有一个阅读噜噜:)文件不被直接发送的原因是因为大多数移动设备将具有片状网络。通过这种方式,发送/接收设备将连接到一个无碎片的服务器,并提高发送/录制速度。我知道有更好的方法,这是我知道的最好的方法 – Erik 2012-05-02 16:58:41

+0

动态DNS在这里并没有真正的帮助 - 服务器的IP和DNS是静态的和已知的。它是一个publsh /订阅问题。如果您认为网络在数据包丢失的意义上是片状的,那么您可能需要前向纠错(FLUTE是一种规范的解决方案),但实际上这也看起来像文件群集场景(例如bittorrent)。还可以通过文件传输查看聊天应用程序。 – Julian 2012-05-02 17:25:29

+0

我以为计算机java客户端可以ping一个dyndns并得到回复,因此读取自己的广域网ip地址。然后客户端不必每隔60秒就会ping服务器,只有当WAN IP发生变化时才能ping服务器。也许我在错误的水中钓鱼.. – Erik 2012-05-02 18:10:34

1

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

  • 请求 - 客户机请求来自服务器的询问
  • 挑战 - 服务器挑战应答(基本上是随机数)
  • 响应 - 客户端发送的用户名和散列密码+挑战回服务器

它重量轻,不太流量。您可以将其负载平衡到任何层的多个服务器或使用负载平衡器。

任何普通的PC能处理每分钟万个这样的命中率,只要你在C/C做服务器端++(我不知道关于Java的网络性能)

+0

我同意UDP在这里是明智的选择。 +1(仅供参考,Java网络性能非常好,唯一的问题是在预算上运行JVM会导致预算托管选项的内存配额崩溃。) – alphazero 2012-04-22 14:49:47