gpt4 book ai didi

c# - 如何在 Web API 中维护请求的状态或队列

转载 作者:行者123 更新时间:2023-12-02 00:13:35 25 4
gpt4 key购买 nike

我遇到的情况是,我必须通过 Web API 方法接收请求,对这些请求进行排队,然后将批量发送到数据库(Solr 实例)。

我不太确定如何维护来自多个来源的一批请求。现在我正在将每个请求数据以json格式写入磁盘上的文件,稍后我将有一个Windows服务,通过文件夹读取所有文件,更新数据库并删除这些文件。

这是我在 Web API 中所做的事情

public void Post(LogEntry value)
{
value.EventID = Guid.NewGuid();
value.ServerTime = DateTime.UtcNow;
string json = JsonConvert.SerializeObject(value);
using(StreamWriter sw = new StreamWriter(value.EventID.ToString()))
{
sw.Write(json);
}
}

(这里 EventID 是 GUID)

这个过程看起来不对,必须有一种方法来维护请求队列,但我不太确定如何在多个请求期间维护队列。

我这样做的原因是,在 solr 实例中批量插入比通过 SolrNet 插入单个记录要快。我预计 Web API 每秒至少收到 100 个请求。我想创建一批 1000 个请求并每 10 秒更新一次 solr 实例。请不要认为我需要代码,只需要知道我应该采取什么策略来维护请求/状态队列。

最佳答案

如果您使用的是 .NET 4.0 或更高版本,则可以使用并发队列:

Concurrent Queue (MSDN)

这是使用队列的线程安全方式,然后可以在所需的时间访问队列。

编辑:

示例:

这将是队列的包装:

public static class RequestQueue
{
private static ConcurrentQueue<int> _queue;

public static ConcurrentQueue<int> Queue
{
get
{
if (_queue == null)
{
_queue = new ConcurrentQueue<int>();
}

return _queue;
}
}

}

然后您可以像这样设置您的 Web api(为了简洁起见,本示例存储整数):

public class ValuesController : ApiController
{
public string Get()
{
var sb = new StringBuilder();
foreach (var item in RequestQueue.Queue)
{
sb.Append(item.ToString());
}

return sb.ToString();
}

public void Post(int id)
{
RequestQueue.Queue.Enqueue(id);
}
}

如果您使用此示例,您将看到队列保存多个请求中的值。但是,由于它存在于内存中,如果应用程序池被回收(例如),这些排队的项目将会消失。

现在,您可以构建检查队列何时保存 10 个项目,然后将它们保存到数据库,同时创建另一个队列来存储传入值。

像这样:

public static class RequestQueue
{
private static ConcurrentQueue<int> _queue;

public static ConcurrentQueue<int> Queue
{
get
{
if (_queue == null)
{
_queue = new ConcurrentQueue<int>();
}

if (_queue.Count >= 10)
{
SaveToDB(_queue);
_queue = new ConcurrentQueue<int>();
}

return _queue;
}
}

public static void SaveToDB(ConcurrentQueue<int> queue)
{
foreach (var item in queue)
{
SaveItemToDB(item);
}
}
}

您需要稍微清理一下,但此设置应该可以工作。此外,您可能需要一些锁定机制来将队列转储到数据库并创建新实例。我将编写一个具有多个线程的控制台应用程序来访问此队列以对其进行测试。

关于c# - 如何在 Web API 中维护请求的状态或队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19452881/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com