【问题标题】:Duplex streaming in Java EEJava EE 中的双工流式传输
【发布时间】:2013-02-04 17:10:16
【问题描述】:

我正在寻找使用 Java EE 的全双工流式处理解决方案。

情况:客户端应用程序 (JavaFX) 从外围设备读取数据。这些数据需要近乎实时地传输到服务器进行处理,并且还需要异步返回响应,同时不断发送新数据进行处理。

与服务器的通信需要尽可能低的开销。传入的数据基本上是一些传感器数据,经过处理后上交可以描述为一组命令。

我所调查的:

  1. TCP/IP 服务器(这是一种非 Java EE 方法)。这将是显而易见的解决方案。每个客户端应用并行打开两个连接:一个用于上游数据,一个用于下游数据。
  2. 远程和无状态 EJB。这意味着不涉及流式传输,并且我将传感器数据打包在较小的窗口中(价值 1-2 秒的传感器数据),然后我将其发送到服务器进行处理并获取处理结果作为响应。对于这种方法,虽然它是可扩展的,但考虑到我必须每 1-2 秒发出一个请求,我不确定它的速度有多快。我仍然需要对此进行测试,但我有疑问。
  3. RMI。从技术上讲,这与 EJB 有什么不同吗?
  4. 两个具有长轮询的 servlet(向上/向下)。我以前没有这样做过,所以有待测试。

现在我想测试我的方法 #2 的性能。第一个解决方案肯定会起作用,但我不太喜欢拥有一个单独的服务器(在 Tomcat 旁边,我已经在其中运行了一些东西)。

然而,与此同时,值得了解是否有任何其他 Java 特定(EE 或非 EE)技术可以轻松解决这个问题。如果有人有想法,请分享。

【问题讨论】:

    标签: java performance jakarta-ee scalability ejb-3.1


    【解决方案1】:

    这看起来是使用JMS 的好地方。您可能会使用Message-Driven Beans,而不是无状态 EJB。

    这为您提供了一种类似于您的第一个解决方案的方法,即使用两个消息队列而不是 TCP/IP 连接。 JMS 使您的通信完全异步并且开销很低,因为无论您的服务器可以多快地使用它们,您的客户端都可以尽可能快地发送消息。您还可以获得交付保证和其他 JMS 优点。

    但是,Tomcat 不附带 JMS。您可以尝试TomEE 或将现有的Tomcat 与ActiveMQ 等JMS 实现集成。

    【讨论】:

    • 是的,我将使用 ActiveMQ(至少用于测试)。我有时间研究它,另一边的 MDB 也无济于事,因为我需要将处理后的消息返回给发件人。但我发现 ActiveMQ 支持消息转换。基本上我可以在代理内部处理消息,然后再将其转发给消费者。
    【解决方案2】:

    您可以尝试多种选择。适当的解决方案取决于您的应用程序的性质、通信协议、数据传输类型、您对客户端和服务器的控制以及对客户端服务器路由的防火墙限制。

    您的问题中没有太多关于此的信息,但鉴于您提供的信息,您可能希望查看netty,因为它非常通用且灵活,似乎符合您的要求。 Netty 还包括一个双工 websocket 实现。请注意,与其他一些解决方案(例如 jms)相比,基于 netty 的解决方案实施起来可能更复杂,并且需要更多的背景研究。

    GraniteDS 中的另一个可能的解决方案,它宣传 JavaFX 客户端集成和多服务器集成以实现全双工客户端/服务器通信,尽管我没有使用它。 GraniteDS 使用 Comet(您的两个具有长轮询模型的异步 servlet)和 Active Message Format 来处理您可能熟悉的来自 Flex/Flash 的数据。

    【讨论】:

    • 谢谢!不幸的是,我受到了一些限制,无法使用 任何 技术(尽管我很乐意这样做,因为无论如何这都是新事物)。希望你明白我的意思。 Netty 似乎不是很普遍的东西。我想我会给 ActiveMQ 一个机会。
    • 总是最好在您的问题中包含任何限制条件。
    【解决方案3】:

    您是否将 websockets 视为一种解决方案?众所周知,它们会保持持久连接,因此异步响应会很快。

    【讨论】:

    • 感谢您的回答,但客户端不是 Web 浏览器,而是 JavaFX 应用程序。我会更新我的问题。
    • websockets 并非特定于浏览器。只要你可以使用一个 websocket 客户端库,你应该可以使用它。我不太了解JavaFX...但是快速谷歌似乎建议您可以将websockets与javafx一起使用。 yoshio3.com/2012/12/22/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-17
    • 2016-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多