我最近正在使用Java进行套接字编程,这使我感到困惑。我对此有三个问题。
第一个是
Java中有一个ServerSocket
方法。并且此方法最多可以使用3个参数,例如port
,backlog
和ip 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项目中。
谢谢
答案 0 :(得分:2)
如果10个客户端尝试同时连接该服务器怎么办?
javadoc对此进行了解释:
backlog参数是套接字上请求的最大挂起连接数。它的确切语义是特定于实现的。特别是,一个实现可能会施加最大长度,或者可能选择完全忽略该参数。
。
让我们将客户数量提高到每小时一百万。我该如何处理所有这些?
通过足够快地接受它们,以在一小时内处理所有这些。对话是如此之快,以至于您可以一个接一个地处理它们。或者,更现实的是,您将在多个线程中处理各种消息,或者使用非阻塞IO。
客户端可以在不等待服务器响应的情况下同时发送消息吗?
是的
如果客户端向具有5个待办事项大小的服务器发送5条消息会发生什么?
发送消息与积压的大小无关。待办事项针对待处理的连接。连接后才能发送消息。
所有这些逻辑都将在Java Spring-Boot项目中实现。
大多数情况下,Spring Boot并不用于底层套接字通信,而是用于公开Web服务。您可能应该这样做,并让标准解决方案(反向代理,软件或硬件)为您完成负载平衡。尤其是考虑到您似乎还不了解套接字,无阻塞IO,线程等的工作原理。
答案 1 :(得分:1)
因此,对于第一个问题,如果您正忙于处理其他事务(例如已连接客户端的IO),则积压队列将使客户端处于等待状态。如果列表超出了积压的范围,则这些新闻客户端将被拒绝连接。您应该可以同时连接10个客户端。这是一个漫长的讨论,但是要保留一个线程池,一旦您从accept中获得一个连接的套接字,就将其交给您的线程池,然后返回以等待接受。您无法在一个服务器周期内“实际”支持数百万个客户端!您需要进行负载平衡。
您的第二个问题尚不清楚,客户无法发送消息,只要它们在队列中,一旦您接受它们,它们就会被从队列中删除,因此与队列的长度无关。
最后,关于负载均衡的问题,我建议您是否要服务数百万个客户,投资一些好的专用负载均衡器:),它可以像您提到的那样进行轮询。
话虽如此,请不要浪费时间:),有一些开源的Java服务器,我最喜欢:https://netty.io/