【问题标题】:Java Socket Client patternJava Socket 客户端模式
【发布时间】:2011-11-10 10:22:37
【问题描述】:

我的 java 应用程序必须将消息(多线程)发送到套接字服务器。该应用程序每秒可以发送大约 100-200 条消息。

我想知道哪种方法更好?

  1. 打开一个客户端套接字并通过这个套接字从所有线程发送消息。 缺点:连接失败时必须处理重连逻辑,重连过程中可能会丢失很多消息。线程安全,阻塞??
  2. 为每个线程创建一个新的客户端套接字连接并在发送后关闭它。 缺点:即使我关闭了socket,端口也会等到TIME_WAIT周期。

哪种方法更实用?

【问题讨论】:

    标签: java sockets socket.io stream-socket-client


    【解决方案1】:

    我建议 3. : 每个线程打开一个套接字,并重用线程(例如通过线程池)。然后处理线程内的重新连接,或者只是正确处理它并创建新的。这样可以避免阻塞和同步问题

    【讨论】:

    • 但是操作系统做得对吗?它具有固定数量的端口(例如 65000)并重用该池中的端口。我应该在微观层面实现同样的事情吗?
    • 让OS打开news socket是不合理的,所以最好保留并重用现有的(打开新的socked意味着与服务器的TCP hanshaking)
    【解决方案2】:

    每秒 100-200 条消息并不算多。我不会每次都重新连接,因为这很昂贵。如果你重新使用你的连接,它会更快。

    如果您担心丢失消息,您可以发送一批消息或一次发送一条消息,然后等待服务器确认已收到消息。您仍然可以通过这种方式每秒发送数千条消息。

    【讨论】:

    • 100-200 个进程,每个进程产生 3 个连接,因此实际上每秒大约有 600 个套接字连接。像 apache MINA 或 Jboss netty 这样的 NIO 框架呢?他们会帮忙吗?我有点担心池化,因为我负担不起重新连接或线程等待/阻塞。它必须是我发送的实时数据。另外,我只能写socket客户端。目的地不在我的控制范围内,无法批量读取数据。
    • 每个连接发送一条消息必然是非常低效的。开销比重新使用现有连接高 1000 倍以上。它也给服务器带来了巨大的负担。如果你不小心,你可能会导致它耗尽资源。如果您确实每次都必须重新连接,则必须通过实验确定您可以执行此操作的限制是什么,并将您的客户集体限制在此速率。你最好尝试说服管理服务器的人修复它,或者至少警告他们如果你关闭服务器,他们需要告诉你。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-24
    • 1970-01-01
    • 2014-10-19
    • 2013-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多