【问题标题】:Is there a way to tell the servlet container to spawn one instance of a resource at a time?有没有办法告诉 servlet 容器一次生成一个资源实例?
【发布时间】:2016-12-27 18:34:41
【问题描述】:

我有一个资源,比如为客户服务的@POST 方法。它不会在任何外部参数上运行,甚至不是调用方 URL(我们将其留给防火墙)或用户身份验证。

但是,我们不想同时处理用户请求。当 request1 正在处理并且该方法尚未返回时,进入的 request2 应该收到状态 309(或任何适用的状态代码)的响应,并且应该没有得到服务。

有没有办法做到这一点,而无需进入服务器后端的任何东西,如多线程?

我使用的是 Tomcat 8。应用程序将部署在 JBoss 上,但这不会影响结果(?)我使用 Jersey 1.19 对资源进行编码。

这是一个与How to ignore multiple clicks from an impatient user? 相关的问题。

TIA。

【问题讨论】:

  • 您能告诉我们更多关于您为什么要拒​​绝同时来电的原因吗?我可以想到许多用于序列化处理请求的用例,即一个接一个地提示响应,但为什么要求在处理任何请求时拒绝请求?
  • @jakeblues 请参阅此 Q 中指出的 Q。可能还有许多其他情况。这样的事情会减轻后端的负担。感觉 servlet 容器提供了这个选项——不知道如何/在哪里。
  • @jakeblues 想要了解更多信息。我在网络服务方面没那么狡猾。
  • 这与您的other similar question 有何不同?

标签: java rest tomcat servlets jersey


【解决方案1】:

根据您想要实现的目标,是的,可以在服务“正在使用”时拒绝其他请求。我不知道在 servlet 级别是否可行; servlet 旨在为尽可能多的请求启动进程,例如,如果一个用户请求简单的内容,而另一个用户请求困难的内容,则可以在处理困难的请求时处理简单的请求。

您可能不想仅仅因为服务正在使用而返回 HTTP 错误代码的主要原因是服务没有出错;它只是在使用中。想象一下,尝试使用其他人正在使用的洗手间,而不是“正在使用”,而洗手间却说“故障”。

另一个在处理任何其他请求时拒绝请求的服务要三思而后行的另一个原因是它不会扩展。时期。您将有一些用户的请求被接受,而另一些用户的请求被拒绝,这似乎是随机的,并且该比率将倾向于服务拥有的用户越多,拒绝的次数就越多。想想打电话到广播电台,尝试成为第 9 个来电者,听到忙音,然后一次又一次地回拨,直到你打通为止。这适用于试图赢得音乐会的免费门票,但不适用于您作为客户的企业。

也就是说,我可能会采用一些方法来处理昂贵的、可能重复的请求。

如果您试图避免来自不耐烦的用户的多个相同/同时请求,您很可能会遇到 UX 问题(例如,由于处理滞后,单击 Web 按钮时似乎没有响应)。我会实现一个加载掩码或类似的东西来防止多次点击并传达用户的请求已被接收并正在处理。加载/处理掩码还有一个额外的好处,就是给用户一种抽象的轻松感和对服务确实按预期工作的信心。

如果由于某种原因无法控制为什么多个相同的请求可能会从同一来源触发,我会选择一个缓存,将处理后的结果返回给所有请求,但只处理第一个请求(并检索所有其他请求的缓存响应)。

如果您真的想返回错误,请实现一个单例服务,该服务会记住一些请求的缓存、检测重复项并适当地处理它们。

请记住,如果您的用例确实是来自浏览器的多次点击,您可能希望响应最后发送的请求,而不是第一个请求。如果用户点击了两次,浏览器将首先注册错误响应(它会立即返回作为对最后一次点击的响应)。这会进一步破坏用户体验:单击会导致延迟,但单击两次会导致错误。

但在实现返回错误的服务之前,请考虑以下问题:如果两个不同的用户同时请求相同的资源怎么办?真的应该得到错误响应吗?如果请求的数量在某些时候增加了怎么办?您是否真的希望将错误返回到服务消费者的随机选择?

【讨论】:

    猜你喜欢
    • 2023-03-31
    • 2022-06-25
    • 2020-08-30
    • 2015-09-01
    • 2011-09-16
    • 1970-01-01
    • 1970-01-01
    • 2012-02-20
    • 2019-04-03
    相关资源
    最近更新 更多