【问题标题】:Synchronised requests enforced from ServiceStack 3 configuration从 ServiceStack 3 配置强制执行的同步请求
【发布时间】:2017-07-20 15:50:04
【问题描述】:

我有一个 ASP.NET 应用程序,使用 NGINX 作为服务器和 Servicestack 3。

当涉及到 PUT 请求时,我希望它们在从 NGINX 服务器进入 Servicestack 时得到同步处理(永远不要同时处理多个请求,因为这可能会导致它们在与他们被召唤的顺序不同)。据我了解,可以控制用于传入请求的线程数 - 如果我能够将该数字限制为 1,我想我会得到我想要的结果。

我将如何从 ServiceStack 配置级别实现这一点(如果可能的话 - the accepted response from this question is making me think it isn't;但如果这是真的,我应该如何强制同步)?

【问题讨论】:

    标签: asp.net concurrency synchronization httprequest servicestack


    【解决方案1】:

    您不太可能希望阻止整个 HTTP 服务器,这可能会导致所有其他请求失败。

    您是否尝试过使用单例锁?例如您可以为此使用您的服务类型:

    lock (typeof(MyService))
    {
    }
    

    但是像这样锁定 Web 服务器通常是个坏主意,您应该考虑使用某种乐观并发控制,在尝试更新陈旧记录时它会引发错误。例如在 OrmLite 中,您可以使用它的 RowVersion feature for optimistic concurrency 客户端发送 RowVersion 代表他们拥有的记录的状态,如果它已更新,因为 OrmLite 将抛出 OptimisticConcurrencyException 在 ServiceStack 中自动转换为 409 Conflict HTTP 错误响应。

    【讨论】:

    • 是的,单例锁是可行的;不过,我希望通过配置 Servicestack 来使其正常工作。谢谢你告诉我乐观并发,我去研究一下;问题是我不希望抛出错误。我想要做的是让我的 PUT 请求按照它们进来的顺序得到服务,在队列中互相等待。
    • @Claudiu 锁定 HTTP 服务器请求是一个非常糟糕的主意,如上所述锁定可以队列请求,但是当队列请求对修改/陈旧数据进行操作时,这无济于事,这就是为什么乐观并发是重要的。听起来您真正想要的是使用 MQ,其中请求执行 FIFO,您可以将其配置为使用单个线程,以便一次执行一个线程,而不会锁定基础设施资源并严重损害您的系统性能/吞吐量。
    • 是的,现在事情变得更清楚了;我认为RedisMQ 是我的问题的解决方案!它甚至在Servicestack's Concurrency Model chapter 上这么说。 Redis 的一些比较不错的解释here。非常感谢,@mythz!
    • 最后只是坚持使用单例锁。
    猜你喜欢
    • 1970-01-01
    • 2011-10-04
    • 1970-01-01
    • 2017-12-20
    • 2015-02-10
    • 1970-01-01
    • 1970-01-01
    • 2019-09-24
    • 2020-03-04
    相关资源
    最近更新 更多