【问题标题】:Queuing for web api methods排队等待 web api 方法
【发布时间】:2019-07-29 04:19:38
【问题描述】:

我有一个 web api 方法:-

[POST]
public void SaveData()
{
}

我想以这样一种方式实现,如果 SaveData() 方法中的代码已经被执行,那么 SaveData 方法将不接受任何其他调用。

即我想在队列中保留对 savedata 方法的调用。 当一个呼叫结束时,另一个呼叫将发生。

注意:- 调用 SaveData() 方法不在我的范围内。我无法决定是同步还是异步调用这个 api 方法。

在我的范围内,唯一的事情就是为 SaveData 方法编写代码。它将被称为彻底的外部系统。

【问题讨论】:

  • 您使用的是网络农场还是网络花园?
  • 您是否在应用程序中使用队列系统(例如 RabbitMQ 或 SQS)?
  • 没有。不使用任何提到的
  • 在这种情况下,将static object bob = new object(); 放在你的类中,然后在SaveData 中使用lock (bob)。这是最简单的解决方案(尽管这意味着您的其他请求将被阻止)。探索的另一种方法是使用BlockedCollection(使用一个单独的线程一次读取一个)。
  • @mjwills 我不确定您的解决方案是否会将请求“排队”并且在释放锁定时它们将保持相同的顺序。此外,您对队列系统的想法在这里看起来像是一个答案。只需尽可能快地将任务放入SaveData 操作中的队列中。使用排队的任务 ID 立即响应也可能是一个好方法。

标签: c# .net asp.net-web-api


【解决方案1】:

我强烈建议您在应用程序中使用消息队列系统。 mjwills 在 cmets 部分提供了两个出色的消息代理软件解决方案:

在您的应用中使用这些解决方案之前,需要进行集成工作,但之后会很简单:

[POST]
public void SaveData()
{
    var msg = new SaveDataMessage();
    /* populate msg object... */

    this.queueClient.Publish(msg);
}

此伪代码向队列发布消息。在另一端,队列订阅者将按顺序接收和处理这些消息,例如:

public void OnMessage(SaveDataMessage msg)
{
    /* process message... */
}

额外的好处是i)订阅者可以在独立的进程中运行,这意味着您的 API 请求可以立即返回,并且后台工作人员将负责处理消息ii)随着您的应用扩展,此架构将与负载平衡 API 兼容。

在您的应用程序早期构建这种结构绝对值得。从长远来看,它将为您提供更大的灵活性和生产力。

我写了一篇关于这个主题的文章,其中包含对此答案的更详细、补充信息:Using queues to offload Web API

【讨论】:

    猜你喜欢
    • 2010-11-05
    • 2020-03-30
    • 2022-11-17
    • 1970-01-01
    • 1970-01-01
    • 2013-10-21
    • 2019-10-30
    • 2019-01-14
    • 1970-01-01
    相关资源
    最近更新 更多