【问题标题】:Sending messages over an unreliable network in JAVA在 JAVA 中通过不可靠的网络发送消息
【发布时间】:2014-03-20 06:09:56
【问题描述】:

我需要通过无线网络从移动的计算机发送连续的消息流(带有时间戳和 x/y 坐标的简单文本消息)。会有很多这样的短消息(比如每秒 200 条),不幸的是,网络连接很可能不可靠,因为发送设备会不时离开 WLAN 区域......当连接不可用时,所有即将发送的消息应该被缓冲,直到连接再次备份。传输消息的顺序无关紧要,因为它们包含时间戳,但必须传输所有消息。

发送这些电报的简单但可靠的方法是什么?是否可以只使用“普通”的 TCP 或 UDP 套接字连接?连接暂时断开时是否会缓冲消息并在之后自动发送?还是直接检测并报告连接丢失,因此我可以缓冲消息并尝试自己定期重新连接?像 Netty 这样的库有帮助吗?

我还考虑过使用代理来代理通信(例如 ActiveMQ 代理网络)作为替代方案。这里的开销会不会太大?!在这种情况下,您会推荐另一个消息传递中间件吗?

【问题讨论】:

    标签: java sockets activemq netty


    【解决方案1】:

    TCP 保证传送(当它已连接时) - 您应该检查连接是否断开,并在重试连接时将消息放入队列中。一旦它看到连接已备份,就将队列转储到 TCP 套接字中。

    还要查看 TCP Keepalive 以识别断开的连接:http://tldp.org/HOWTO/TCP-Keepalive-HOWTO/overview.html

    【讨论】:

    • 过去我发现有时连接报告已连接,即使连接实际上已丢失。我认为 Keepalive 检测到断开连接的速度不够快……但我已经重新检查了 WLAN 连接。不过,您是否为此推荐任何额外的库,或者只使用 JDK 类并自己完成所有工作?
    • @Ingo 在另一端也保持活动状态。在没有响应时发送一个活动数据包,如果没有来自活动数据包的响应,则认为它已死。我不熟悉任何库,但我敢肯定那里有一些。
    【解决方案2】:

    似乎您可以使用 Java JMS 之类的消息包装器,使用“保证持久性”可靠性模式。在短信的背景下,我自己并没有这样做,但这个想法可能会引导你找到正确的答案。此外,可能已经编写了一个 Apache 库来处理您需要的内容,例如 Qpid

    【讨论】:

    • 正如我所提到的,我也考虑过允许 JMS 和 AMPQ 的 ActiveMQ,但我不知道这会对性能产生多大影响。也许我需要实现一个原型来测试它......关于“保证持久性”:这不是只有在消息需要“生存”崩溃时才需要吗?即使没有持久性,消息也应该排队。
    猜你喜欢
    • 2017-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-19
    相关资源
    最近更新 更多