这并不是在以粉丝男孩的方式推动 Flex,但事实上,这是我们日常构建到所有基于 Flex 的应用程序中的那种架构。以下是我们在 Flex 上所做的 - 毫无疑问,它可以适当地转换为 Silverlight:
我们采用三种成分并将它们整合在一起以实现此功能:
- Comet 模式(一种与 HTTP 兼容的服务器推送通知方式 - 更多信息请查看 Wikipedia)
- JMS 消息传递主题(发布/订阅队列)
- Adobe BlazeDS servlet
后一项实现了 Comet 模式,支持 AMF 对象编组(Adobe 的 ActionScript3 对象的二进制序列化格式),并桥接到 JMS 队列或主题。当桥接到一个主题时,在浏览器中运行的多个 Flex 客户端可以作为 JMS 主题的订阅者进行代理。因此,如果任何客户端发布消息(或服务器端代码发布到主题中),所有客户端订阅者都将通过 BlazeDS 和 Comet Pattern 实现将消息推送给他们。
实际上,您需要找到或编写一个组件来完成 BlazeDS 的工作。您可能还需要实现一些与此服务器端组件的 Comet 模式交互的客户端代码。
WCF 是否支持彗星模式和双向消息传递?特别是在符合 HTTP 和端口 80 或端口 443 的 SSL 的情况下。看起来您已经对此进行了调查,但没有找到任何双向消息传递。所以你可能需要卷起袖子做一些编码。
关于将服务器推送到 Web 应用程序的一些注意事项:
BlazeDS 支持实现 Comet 模式的两种主要模式(实际上有第 3 个轮询选项,但我忽略了它):
- 长轮询
- HTTP 流媒体
您应该会发现大多数网络浏览器更普遍支持长轮询。因此,您可能会简化为最初仅支持它。或者您可以花时间让您的客户端代码先尝试 HTTP 流式传输,并在必要时切换到长轮询。
对于可以提供发布/订阅功能的消息代理,您可以考虑使用 ActiveMQ JMS。它是开源和免费的,有积极的社区支持(你也可以购买支持)。此外,您还可以使用 NMS 集成为 .NET 客户端。
让消息代理位于中间层实际上很重要,因为它将是安全放置消息的地方。如果您的客户正在进行长轮询,您不希望他们在没有实际连接的时间间隔内错过任何新消息。
在高流量场景(数百或数千个客户端,例如 Internet 上的网站)中要考虑的另一件事是,您需要采用可扩展的彗星模式方法。
在 Flex/Java 世界中,BlazeDS servlet(它是开源的)已被修改为使用异步模型。在 Java 中,可以构建套接字侦听器以使用 NIO 通道和 Java 并发执行器线程池。 Tomcat Web 服务器有一个 NIO 监听器并支持异步 Servlet 3.0 事件。但是,特别是 BlazeDS 已经过修改,可以与 Jetty Web 服务器一起使用。最重要的是,这种异步方法的可扩展性意味着可以增强单个物理 Web 服务器,以支持多达约 20,000 个并发 Comet 式客户端连接。
我已经有一段时间没有认真地进行 .NET 编程了,但习惯了 io 功能很像 Java 1.1,除了具有异步结果处理程序功能。但是,这与通过 Java NIO 通道创建异步套接字侦听器不同。一个 NIO 通道实现可以用一个相对较小的线程池支持数百到数千个套接字连接。但是 C# 和 .NET 已经经历了两到三个重大的改进——也许已经添加了与 NIO 通道相当的新 io 功能。