delphi - 哪种网络协议(protocol)用于远程应用程序的轻量级通知?

标签 delphi protocols notifications soap-client

我有这种情况....
客户端发起的 SOAP 1.1 通信在一台服务器和数万个客户端之间进行。客户端是外部的,通过我们的防火墙进入,通过证书、https 等进行身份验证。他们可以在任何地方,并且通常有自己的防火墙、NAT 路由器等......他们确实是外部的,而不仅仅是远程公司办公室。它们可能位于公司/校园网络、DSL/电缆,甚至拨号网络中。

客户端使用 Delphi(2005 年 + 2007 年的 SOAP 修复),服务器是 C#,但从架构/设计的角度来看,这应该无关紧要。

目前,客户端将新数据推送到服务器,并在 15 分钟轮询循环中从服务器拉取新数据。服务器当前不推送数据 - 客户端点击“messagecount”方法,查看是否有新数据要拉取。如果为 0,它会再休眠 15 分钟并再次检查。

我们正在努力将其缩短到 7 秒。

如果这是一个内部应用程序,有一个或只有几十个客户端,我们会编写一个温和的“监听器”肥皂服务,并将数据推送到它。但由于它们是外部的,位于自己的防火墙后面,有时还位于 NAT 路由器后面的专用网络,因此这是不切实际的。

所以我们只剩下在更快的循环中进行轮询。 10K 客户端,每个客户端每 10 秒检查一次它们的消息计数,将是 1000/秒的消息,这将主要浪费带宽、服务器、防火墙和身份验证器资源。

所以我试图设计出比自我造成的 DoS 攻击更好的东西。

我认为让服务器向客户端发送肥皂消息(推送)是不切实际的,因为这需要在客户端进行太多配置。但我认为还有一些我不知道的替代方案。如:

1) 客户端是否有办法通过 Soap 1.1 向 GetMessageCount() 发出请求,并获得响应,然后可能“保持在线”大约 5-10 分钟以获取额外响应,以防万一有新数据到了吗?即服务器说“0”,然后一分钟后响应一些 SQL 触发器(服务器是 Sql Server 上的 C#,顺便说一句),知道这个客户端仍然“在线”并发送“5”的更新消息计数“?

2) 是否有其他协议(protocol)可以用来“ping”客户端,使用从他们上次 GetMessageCount() 请求中收集的信息?

3)我什至不知道。我想我正在寻找一些神奇的协议(protocol),客户端可以在其中发送 GetMessageCount() 请求,其中包括“哦,顺便说一下,如果答案在接下来的一小时内发生变化,请在此地址 ping 我... ”。

此外,我假设这些“保持线路开放”方案中的任何一个都会严重影响服务器的规模,因为它需要同时保持数千个连接打开。我认为,这也可能会影响防火墙。

有没有这样的东西?还是我几乎坚持投票?

TIA,
克里斯

2010 年 4 月 30 日更新:
已经证明拥有 7 秒通知既不简单也不便宜,尤其是在不超出 HTTPS/SOAP/防火墙的企业标准的情况下,我们可能会提出一个两阶段的解决方案。 Phase1 将让客户端“按需”轮询,并通过 SOAP 执行 GetMessageCount,这里没什么特别的。会有一个“刷新”按钮来拉取新数据(这里是合理的,因为用户通常有理由怀疑新数据已经准备好,即他们只是在在线系统中更改了 Fabric 颜色,所以他们知道点击在桌面上查看运输 list 之前刷新,现在他们会看到描述中的颜色。)(这不是真正的服装/时尚应用程序,但您明白了)。
使用这里讨论的技术,让两个 aps 始终同步并从主机推送实时更新的概念仍然存在。但我预计它会被推迟到另一个版本,因为我们可以提供 85% 的功能而不必这样做。但是,我希望我们能够进行概念验证,并且可以证明它会起作用。我会回来发布 future 的更新。感谢大家对此的帮助。

最佳答案

Delphi 中多层开发的两大方面是 components4developers(其 kbmMW 产品在 Mark Robinson 的回答中有所描述)和 RemObjects 及其产品 RemObjects SDK (他们有一个很好的例子,可能与您想要的类似: Push notifications for iPhone )。
在您的复杂环境中,多播 UDP 可能不会削减它,但从开销的角度来看,它是无与伦比的。
如果连接是打开的,它可以双向使用(这也被 .NET 远程处理和 WCF 使用),但有额外的开销。
您需要在保持连接活跃(锁定资源)和创建新连接(花费时间和延迟)之间找到平衡。
--杰罗恩

关于delphi - 哪种网络协议(protocol)用于远程应用程序的轻量级通知?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2675793/

相关文章:

delphi - 需要控件和对象之间的双向 LiveBindings

delphi - 适用于 Delphi 的通用 MP3 和 WMA 标签阅读器

objective-c - 是否可以在 Objective-C 中动态实现协议(protocol)?

java - 一段时间后通知

ios - 如何使用 SwiftUI 打开通知操作的自定义 View ?

delphi - 如何在 Delphi 中将 TProgressBar(背景/进度条本身)的颜色更改为(自定义)颜色?

c++ - 将 C++ 结构移植到 Delphi

IOS父ViewController获取子ViewCONtroller数据后丢失原始坐标

protocols - 存储大小受限协议(protocol)的前向兼容性

android - 我的代码有什么问题 - 通知 - 没有声音没有振动