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

标签 java sockets spring-boot

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

第一个是;

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

What happens if 10 clients try to connect this server at the same time?

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


第二个问题是;

客户端能否在不等待服务器响应的情况下并发发送消息?如果客户端将 5 条消息发送到具有 5 积压大小的服务器,会发生什么情况?


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

让服务器名称为 A、B 和 C,并且它们都运行顺利。根据我的计划,如果我根据传入消息为它们设置优先级,那么最小优先级意味着最可用的服务器。例如;

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

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

2.Message -> 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 项目中实现。

谢谢

最佳答案

What happens if 10 clients try to connect this server at the same time?

javadoc 对此进行了解释:

The backlog argument is the requested maximum number of pending connections on the socket. Its exact semantics are implementation specific. In particular, an implementation may impose a maximum length or may choose to ignore the parameter altogther.

.

Lets increase the number of clients up to 1 million per hour. How can I handle all of them?

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

Can a client send messages concurrently without waiting server's response?

是的。

What happens if a client sends 5 messages into server that has 5 backlog size?

发送消息与积压大小无关。积压的是待处理的连接。只有连接后才能发送消息。

All this logic is going to be implemented into Java Spring-Boot project.

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

关于java - 套接字编程 - 服务器是否排队请求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52597799/

相关文章:

java - RabbitMQ 消息过期通知

c - 在客户端套接字程序中使用 select()

spring-boot - 如何使用 gRPC 拦截器在 Spring-Boot 应用程序中附加/更新日志记录 MDC

spring-boot - Spring WebClient多次retryWhen处理不同的错误

java - 设置对象的颜色

java - 为什么 '\117' 是 Java 中的有效字 rune 字?

java - 如何迭代 Flux 并使用来自另一个 Mono 的结果来过滤 Flux

Java - 在客户端之间发送

javascript - Nodejs 服务器/客户端套接字与 engine.io 连接

java - 无法从Spring云配置服务器中的GIT读取属性源