首页 > 解决方案 > 套接字编程 - 服务器是否对请求进行排队?

问题描述

我最近在 Java 上进行套接字编程,有些事情让我感到困惑。我对此有三个问题。

第一个是;

Java中有一个ServerSocket方法。并且此方法最多可以使用 3 个参数,例如port,backlogip address。积压意味着可以以队列形式连接到服务器的客户端数。现在让我们考虑一下这种情况。

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

服务器是否会丢弃最后 5 个尝试连接的客户端?让我们将客户端数量增加到每小时 100 万。我该如何处理所有这些?


第二个问题是;

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


最后一个其实不是问题。我有一个计划来管理我的负载平衡。假设我们有 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 项目中实现。

谢谢

标签: javasocketsspring-boot

解决方案


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

javadoc对此进行了解释:

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

.

让我们将客户端数量增加到每小时 100 万。我该如何处理所有这些?

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

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

是的。

如果客户端将 5 条消息发送到具有 5 个 backlog 大小的服务器会发生什么?

发送消息与积压的大小无关。积压用于挂起的连接。只有在您连接后才能发送消息。

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

Spring Boot 在大多数情况下,不是用于低级套接字通信,而是用于公开 Web 服务。您可能应该这样做,并让标准解决方案(反向代理、软件或硬件)为您进行负载平衡。特别是考虑到您似乎还不了解套接字、非阻塞 IO、线程等如何工作。


推荐阅读