【问题标题】:Handling multiple requests on a TCP/IP Socket处理 TCP/IP 套接字上的多个请求
【发布时间】:2012-10-19 08:47:29
【问题描述】:

在一个 Java TCP/IP 套接字上处理多个请求是不是很容易。只需接受一条消息并生成一个线程。接受另一条消息并产生另一个线程。问题是一旦你开始产生线程,事情就会变得更加不确定。假设您有 10 个客户端,其中一个客户端不断发出请求,而另外 9 个 9 个以 10% 的过度活跃客户端发送请求,发现更难查看。

您可以解决此问题的一种方法是在您的服务器中拥有一个信号量的哈希映射,其中每个客户端都有一个相应的信号量。在处理任何客户端的请求之前,您可以让它通过其信号量并配置信号量,以便每个客户端在任何时候只能有一定数量的请求。

在这个阶段,我认为是的,但有没有更好的方法或库可以做到这一点?

【问题讨论】:

  • 你的意思是像公平的消息队列?但我认为线程在每次请求后自动进入睡眠就足够了,因此其他线程有公平的机会被唤醒并避免饥饿。
  • 完全像消息队列。但通常消息在进入队列之前会通过 TCP/IP 套接字。如果此套接字是多线程的,那么您可以做到“公平”。我认为。
  • “其他 9 九个不怎么开火的人不要进去看看”。那没有意义。多线程 TCP 服务器没有理由偏爱一个客户端而不是另一个客户端。无论如何,整个事情都是网络绑定的。所有线程最初都被阻塞等待传入请求。如果一个客户端发送的请求是另一个客户端的 10 倍,它将获得 10 倍的服务,但没有理由他会获得超过 10 次。
  • thread-per-connection 是婴儿的第一个网络模型。你应该看看非阻塞io。
  • 我认为您根本没有说得更清楚。我认为您只是构想了一个虚构的问题,并试图找到解决方案。有像 Tomcat 这样的 Java 服务器被数以百万计地部署并处理数十万个客户端,每个客户端对这个所谓的“问题”没有做任何事情。它不存在。触发 90% 请求的客户端应该获得 90% 的服务。你有任何证据证明它没有吗?

标签: java multithreading sockets tcp-ip


【解决方案1】:

...但是有没有更好的方法...?

我使用一个每个服务器套接字接受线程和一个预生成线程池来处理工作负载。接受线程只接受连接(不做任何其他事情)并将处理程序套接字提供给池中的一个线程。然后该线程与处理程序套接字一起工作,直到客户端完成,然后关闭处理程序套接字。

您可以随意扩展此设置:如果您注意到接受线程大部分时间都在等待池线程,那么您需要 x2 池线程数,如果您注意到接受线程是您创建(A)另一个接受线程和(B)另一个接受连接的套接字的瓶颈,并且可以选择(C)将它们放在另一台机器上。

如果客户端比其他客户端更重要,那么您描述的一个超活跃客户端的具体问题可能是有意/期望的:在这种情况下,您无需做任何事情。或者它可以被认为是一个拒绝服务攻击,在这种情况下你应该有一个启发式方法来断开客户端并暂时禁止它的IP地址。 p>

【讨论】:

  • 与我接受的类似,您正在使用池进行请求处理。而且您在 Java 层中没有任何东西可以检查 DOS。你是说这应该做一个 N/W 层。不是一个坏主意。只是想知道你的想法。
  • 你会使用非阻塞 i/o,如果不是,为什么不呢?
  • 是否在 Java 中进行 DOS 检测取决于您,您可以在 Java 中通过让接受线程在哈希图中查找 IP 地址或让工作线程决定并断开连接。非阻塞 IO:起初我不会打扰它,毕竟只有工作线程被阻塞,如果所有其他线程都被阻塞,您可以向池中添加更多工作线程。您可以稍后添加它,但一开始我总是尽量保持简单和代码线性。
猜你喜欢
  • 2011-08-05
  • 2011-07-27
  • 2021-01-12
  • 2019-01-26
  • 1970-01-01
  • 2011-04-21
  • 1970-01-01
  • 2013-09-15
  • 2014-01-03
相关资源
最近更新 更多