套接字编程-服务器是否排队请求?

时间:2018-10-01 19:41:14

标签: java sockets spring-boot

我最近正在使用Java进行套接字编程,这使我感到困惑。我对此有三个问题。

第一个是

Java中有一个ServerSocket方法。并且此方法最多可以使用3个参数,例如portbacklogip address。待办事项是指可以作为队列形式连接到服务器的客户端数量。现在让我们考虑这种情况。

  

如果10个客户端尝试同时连接此服务器会发生什么   时间?

服务器会丢弃最近尝试连接的5个客户端吗?让我们将客户数量提高到每小时一百万。我该如何处理所有这些?


第二个问题是;

客户端可以在不等待服务器响应的情况下同时发送消息吗?如果客户端将5封邮件发送到具有5个待办事项大小的服务器,会发生什么情况?


最后一个实际上不是问题。我有一个计划来管理负载平衡。假设我们有一台机器上运行着3台服务器。

让服务器名称分别为A,B和C,并且它们都运行正常。根据我的计划,如果我根据传入的消息为它们赋予优先级,则最小优先级意味着最可用的服务器。例如;

初始优先级-> A(0),B(0),C(0),响应时间位于5个时间单位的末尾。

1。消息-> A(1),B(0),C(0)

2。消息-> A(1),B(1),C(0)

3。消息-> A(1),B(1),C(1)

4。消息-> A(2),B(1),C(1)

5。消息-> A(2),B(2),C(1)

6。消息-> A(1),B(2),C(2)

。 。

这个逻辑好吗?我敢打赌,还有更好的逻辑。我要如何处理一天内或多或少的几百万个请求?

PS:所有这些逻辑都将实现到Java Spring-Boot项目中。

谢谢

2 个答案:

答案 0 :(得分:2)

  

如果10个客户端尝试同时连接该服务器怎么办?

javadoc对此进行了解释:

  

backlog参数是套接字上请求的最大挂起连接数。它的确切语义是特定于实现的。特别是,一个实现可能会施加最大长度,或者可能选择完全忽略该参数。

  

让我们将客户数量提高到每小时一百万。我该如何处理所有这些?

通过足够快地接受它们,以在一小时内处理所有这些。对话是如此之快,以至于您可以一个接一个地处理它们。或者,更现实的是,您将在多个线程中处理各种消息,或者使用非阻塞IO。

  

客户端可以在不等待服务器响应的情况下同时发送消息吗?

是的

  

如果客户端向具有5个待办事项大小的服务器发送5条消息会发生什么?

发送消息与积压的大小无关。待办事项针对待处理的连接。连接后才能发送消息。

  

所有这些逻辑都将在Java Spring-Boot项目中实现。

大多数情况下,Spring Boot并不用于底层套接字通信,而是用于公开Web服务。您可能应该这样做,并让标准解决方案(反向代理,软件或硬件)为您完成负载平衡。尤其是考虑到您似乎还不了解套接字,无阻塞IO,线程等的工作原理。

答案 1 :(得分:1)

因此,对于第一个问题,如果您正忙于处理其他事务(例如已连接客户端的IO),则积压队列将使客户端处于等待状态。如果列表超出了积压的范围,则这些新闻客户端将被拒绝连接。您应该可以同时连接10个客户端。这是一个漫长的讨论,但是要保留一个线程池,一旦您从accept中获得一个连接的套接字,就将其交给您的线程池,然后返回以等待接受。您无法在一个服务器周期内“实际”支持数百万个客户端!您需要进行负载平衡。

您的第二个问题尚不清楚,客户无法发送消息,只要它们在队列中,一旦您接受它们,它们就会被从队列中删除,因此与队列的长度无关。

最后,关于负载均衡的问题,我建议您是否要服务数百万个客户,投资一些好的专用负载均衡器:),它可以像您提到的那样进行轮询。

话虽如此,请不要浪费时间:),有一些开源的Java服务器,我最喜欢:https://netty.io/