我最近在 Java 上进行套接字编程,有些事情让我感到困惑。我对此有三个问题。
第一个是;
Java 中有一个ServerSocket
方法。并且这个方法最多可以带3个参数,比如port
,backlog
和ip 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/