一个服务器如何处理来自多个客户端的Web服务请求

10
我刚完成了一个Android应用程序,它使用Web服务连接到远程数据库。我之前一直在本地工作。
现在,我计划将我的Web服务托管在服务器上。假设我已经将Android应用程序安装在许多不同的客户智能手机上。每个智能手机用户同时调用Web服务。
那么服务器如何处理这些请求呢?它会为每个请求执行一个线程吗?我想详细了解服务器处理过程。考虑到所有手机都使用GPRS,这种情况下是否会有任何延迟?
顺便说一句,我的Web服务都是基于SOAP的,并且我打算稍后使用SQL Server作为服务器。我已经使用.NET框架创建了Web服务。
4个回答

7

这是一个概念性的说明,与Android无关。

通常,每个用户都会发送一个页面的HTTP请求。服务器接收这些请求并将其委派给不同的工作进程或线程。

根据给定的URL,服务器会读取文件并将其发送回给用户。如果文件是PHP文件等动态文件,则在发送回用户之前执行该文件。

一旦请求的文件已经发送回来,服务器通常会在几秒钟后关闭连接。

请参阅Web服务器如何工作

编辑:

HTTP使用TCP,这是一种基于连接的协议。也就是说,在客户端与服务器通信时,客户端会建立一个TCP连接。

多个客户端可以同时连接到同一目标机器的相同目标端口上。服务器只需打开多个并发连接即可。

Apache(以及大多数其他HTTP服务器)都有一个多处理模块(MPM)。它负责分配Apache线程/进程来处理连接。这些进程或线程可以在自己的连接上并行运行,而不会互相阻塞。Apache的MPM还倾向于保持“备用”线程或进程,即使没有连接打开,这有助于加速后续请求。

注意:

多线程最常见的问题之一是“竞争条件”--当两个请求正在执行相同的操作(“竞赛”执行相同的操作)时,如果它是单一资源,则其中一个将获胜。如果他们都向数据库插入记录,则他们不能同时获得相同的ID--其中一个将获胜。因此,在编写代码时需要小心,以意识到其他请求正在同时进行,并可能修改您的数据库、写入文件或更改全局变量。


由于我的请求将是简单的SOAP请求,将执行更新、插入或从我的数据库中选择,我还想知道获取响应需要多长时间。例如,我的一个请求是在我的Android应用程序上显示100个项目,因此考虑到它们被多个客户端同时调用,服务器端是否会有任何延迟来显示这些100个项目。 - Parth Doshi
这取决于服务器的资源可用性和性能。 - user370305

3
服务器将维护一个线程池来监听传入请求。收到请求后,线程将处理请求并返回响应。如果所有请求同时到达且它们少于线程池中的最大线程数,则它们都将并行服务(尽管实际处理将根据核心/ CPU数量交错进行)。如果请求超过线程数,则请求将排队(等待连接),直到线程空闲或客户端请求超时。
如果您从移动网络连接到服务,则初始连接存在更高的延迟,但不足以产生影响。

谢谢!确实很有帮助。我只是想知道线程池监听的概念是否存在于所有服务器中,还是仅限于SQL服务器? - Parth Doshi
几乎所有的服务器都实现了连接池来管理连接。 - Chris

2

你的问题与Android无关,而是与基于Web后端的移动开发有关。

我不知道如何使用.NET进行服务器应用程序开发,但如果以Apache/PHP/MySQL为例,每个请求都在单独的线程中运行。

当请求到达服务器时可能会有小的延迟,但这不应影响服务器处理请求和数据所需的时间。

需要考虑的一件事是避免从同一客户端发送多个请求。这是一个常见的实现问题:由于没有返回的数据,您认为没有待处理的请求,因此启动了新的请求。这基本上会在服务器上创建不必要的负载。

希望这可以帮助!


将来我要托管我的服务时,在选择服务器时,我应该关注哪种配置?根据我的需求,它应该具备 SQL 后端和 .NET 支持吗?你能给我一些相关的建议吗? - Parth Doshi
这在很大程度上取决于您的应用程序特定性,但无论如何,我建议您保持熟悉的技术。大多数Web后端堆栈是等效的,但经验确实很重要! - AsTeR

0

a) 服务器上运行/监听一个Web服务实例(例如:Spring Boot微服务),端口号为80。

b) 这个Web服务(Spring Boot应用程序)需要像Tomcat这样的Servlet容器。该容器将配置线程池。

c) 当不同用户同时发出请求时,该容器将为每个传入请求分配来自池中的每个线程。

d) 由于服务器端Web服务代码将具有Bean(在Java中的情况下)大多数是单例的,因此与每个请求相关的每个线程都将调用单例API,如果需要访问数据库,则需要对这些线程进行同步,这是通过@transactional注释完成的。该注释同步数据库操作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接