我有这种情况.... 一台服务器与数万个客户端之间的客户端发起的 SOAP 1.1 通信。客户端是外部的,通过我们的防火墙进入,通过证书、https 等进行身份验证。它们可以在任何地方,并且通常有自己的防火墙、NAT 路由器等……它们是真正的外部,而不仅仅是远程公司办公室。它们可以在公司/校园网络、DSL/Cable 甚至拨号中。
客户端使用 Delphi(2005 + 2007 年的 SOAP 修复),服务器是 C#,但从架构/设计的角度来看,这无关紧要。
目前,客户端以 15 分钟的轮询循环将新数据推送到服务器并从服务器拉取新数据。服务器当前不推送数据——客户端点击“messagecount”方法,查看是否有新数据要拉取。如果为 0,它会再休眠 15 分钟并再次检查。
我们正试图将其缩短到 7 秒。
如果这是一个内部应用程序,有一个或几十个客户端,我们会编写一个 cilent“监听器”soap 服务,并将数据推送到它。但由于它们是外部的,位于自己的防火墙后面,有时位于 NAT 路由器后面的专用网络,这是不切实际的。
所以我们只剩下一个更快的循环轮询。10K 个客户端,每个客户端每 10 秒检查一次他们的消息计数,将是 1000 条/秒的消息,这将主要浪费带宽、服务器、防火墙和身份验证器资源。
因此,我正在尝试设计一些比自我造成的 DoS 攻击更好的东西。
我认为让服务器向客户端发送肥皂消息(推送)是不切实际的,因为这需要在客户端进行太多配置。但我认为还有一些我不知道的替代方案。如:
1) 有没有办法让客户端通过 Soap 1.1 请求 GetMessageCount() 并获得响应,然后也许“在线”5-10 分钟以获得额外的响应以防新数据到了?即服务器说“0”,然后一分钟后响应一些SQL触发器(服务器是Sql Server上的C#,顺便说一句),知道这个客户端仍然“在线”并发送更新的消息计数“5 “?
2) 是否有其他协议可以用来“ping”客户端,使用从他们上次 GetMessageCount() 请求中收集的信息?
3)我什至不知道。我想我正在寻找一些魔术协议,客户端可以在其中发送 GetMessageCount() 请求,其中将包括“哦,顺便说一句,如果答案在接下来的一个小时内发生变化,请在这个地址上 ping 我...... ”。
另外,我假设任何这些“保持线路开放”方案都会严重影响服务器的大小,因为它需要同时保持数千个连接打开。我认为这也可能会影响防火墙。
那里有这样的东西吗?还是我几乎被民意调查所困?
TIA,
克里斯
2010 年 4 月 30 日更新:
已经证明拥有 7 秒通知既不容易也不便宜,尤其是在不超出 HTTPS/SOAP/防火墙的企业标准的情况下,我们可能会提出一个两阶段的解决方案。Phase1 将让客户端通过 SOAP 执行 GetMessageCount 来“按需”轮询,这里没什么特别的。会有一个“刷新”按钮来拉取新数据(这在这里是合理的,因为用户通常会有理由怀疑新数据已经准备好,即他们只是在在线系统中更改了面料颜色,所以他们知道点击在桌面上查看运输清单之前刷新,现在他们会看到描述中的颜色。)(这不是真正的服装/时尚应用程序,但你明白了)。让两个应用程序始终保持同步的概念,从主机推送实时更新,仍然在桌面上,使用这里讨论的技术。但我预计它将推迟到另一个版本,因为我们可以提供 85% 的功能而不必这样做。但是,我希望我们能够进行概念验证,并证明它会起作用。我会回来并发布未来的更新。感谢大家对此的帮助。