【发布时间】:2013-11-26 05:54:46
【问题描述】:
由于 REST 是无状态的,因此传入的每个请求都不知道传入的前一个请求。在这种情况下是否可以使用连接池?
如果要实现连接池,它将像标准数据库连接一样在每次请求时打开并关闭连接池。
如何实现 REST 以利用连接池?
【问题讨论】:
由于 REST 是无状态的,因此传入的每个请求都不知道传入的前一个请求。在这种情况下是否可以使用连接池?
如果要实现连接池,它将像标准数据库连接一样在每次请求时打开并关闭连接池。
如何实现 REST 以利用连接池?
【问题讨论】:
你需要了解什么是连接池(对象池)、缓存和区别。
创建连接池是为了避免创建这些昂贵资源的费用。它们大多是在某个地方创建和存储的,在使用后,它们会返回池中并可以再次使用。这是您避免一遍又一遍地创建这些资源的费用。比如数据库连接。
对于 REST,如何向 REST 服务发出请求?让我们通过 PUT、GET、POST 等通过 HTTP 说,所以你需要 HTTP 连接。如果您担心服务器,则取决于您使用的服务器,它们中的大多数都使用线程。
我有一种感觉,您可能对缓存和对象池感到困惑。使用对象池,就像线程池一样,您创建 X 数量的该对象并将其存储在池中(通常是队列)。每当你需要一个时,你就从池子里问一个。完成后,您将其放回游泳池。
连接池上下文中的 REST 太有意义了。
您可能想要的是缓存... REST 是无状态的,但每个对象都有一个唯一标识符,因此您可以根据该 ID 缓存它。
【讨论】:
这当然是可能的:REST 并没有说明您的服务器是如何在内部构建的,但它忽略了状态并拥有统一的 HTTP 接口。因此,您可以拥有一个使用连接池连接到您的数据库的服务器进程,但这仍然完全符合整个 REST、无状态、插入式组件的设计风格。
【讨论】:
REST 实现中的无状态要求处理请求所需的任何状态都需要包含在其中。它不会阻止服务器为了效率而保持状态。
连接池可以,服务器上的身份验证缓存也可以。不行的是 SQL 类型的连接池,其中您的请求流如下: { login / operation1 / operation2 } 如果不首先在同一连接上执行登录操作,则无法为 operation1 提供服务。 REST 实现需要类似 { login + operation1 / login + operation2 },因为它可以在 { login + operation1 } { drop cnx } { login + operation2 } 中安全地拆分,因此不需要服务器维护状态。
【讨论】:
对于 REST 框架的性能调整,我建议阅读 Performance of RESTful apps 并作为一个很好的案例研究 Profiling Django REST framework。
ps.:虽然问题的重点是 REST 的连接池,但它表明 OP 的目标是提高 REST 服务的吞吐量/速度。
【讨论】: