我有一个队列,其上放置了待处理的傅立叶变换请求(相对耗时的操作) - 在某些情况下,我们每秒可以获得数千个变换请求,因此它必须快速.
我正在升级旧代码以使用.net 4,以及移植到TPL.我想知道处理这个队列的最有效(最快的吞吐量)方式是什么样的.我想使用所有可用的核心.
目前我正在尝试使用BlockingCollection.我创建了一个队列处理程序类,它产生4个任务,阻塞BlockingCollection并等待传入的工作.然后他们处理挂起的转换.码:
public class IncomingPacketQueue : IDisposable
{
BlockingCollection<IncomingPacket> _packetQ = new BlockingCollection<IncomingPacket>();
public IncomingPacketQueue(int workerCount)
{
for (int i = 0; i < workerCount; i++)
{
Task.Factory.StartNew(Consume);
}
}
public void EnqueueSweep(IncomingPacket incoming)
{
_packetQ.Add(incoming);
}
private void Consume()
{
foreach (var sweep in _packetQ.GetConsumingEnumerable())
{
//do stuff
var worker = new IfftWorker();
Trace.WriteLine(" Thread {0} picking up a pending ifft".With(Thread.CurrentThread.ManagedThreadId));
worker.DoIfft(sweep);
}
}
public int QueueCount
{
get
{
return _packetQ.Count;
}
}
#region …Run Code Online (Sandbox Code Playgroud) 我已经为shopify创建了一个mvc web api 2 webhook:
public class ShopifyController : ApiController
{
// PUT: api/Afilliate/SaveOrder
[ResponseType(typeof(string))]
public IHttpActionResult WebHook(ShopifyOrder order)
{
// need to return 202 response otherwise webhook is deleted
return Ok(ProcessOrder(order));
}
}
Run Code Online (Sandbox Code Playgroud)
其中ProcessOrder循环遍历订单并将详细信息保存到我们的内部数据库.
但是,如果进程花费的时间太长,那么webhook会再次调用api,因为它认为它已经失败了.有没有办法先返回ok响应,然后再进行处理?
有点像在mvc控制器中返回重定向并且可以选择在重定向后继续处理其余操作.
请注意,我总是需要以Shopify的形式返回ok响应,如果它失败了19次,那么智慧决定删除webhook(并且处理时间过长会被视为失败)
我读过自己的蓝色,希望有一个简单的答案。
我有一个 Web API 可以处理来自各种“野外”应用程序的遥测 在我的一个控制器中,我想接收一个请求,将错误记录到我的中央监控数据库并尽可能立即返回响应(我没有真正的了解调用者端性能可能有多重要的方式,并且已经有一个对初始 Web 服务请求的重大影响)。
基本上,我正在寻找的是这样的:
public IHttpActionResult Submit() {
try {
var model = MyModel.Parse(Request.Content.ReadAsStringAsync().Result);
// ok, I've got content, now log it but don't wait
// around to see the results of the logging, just return
// an Accepted result and begone
repository.SaveSubmission(model); // <-- fire and forget, don't wait
return Accepted();
} catch (Exception)
return InternalServerError();
}
}
Run Code Online (Sandbox Code Playgroud)
看起来它应该是直截了当的,但显然不是。我已经阅读了许多不同的帖子,从是的,只是使用 Task.Run()到这是一个可怕的错误,你永远无法实现你想要的!
我的场景中的问题似乎是这个进程可能会在进程中终止,因为它运行在 ASP.NET 工作进程上,而不管调用异步方法的不同方法的泥潭(我已经用了最后两个几个小时左右阅读各种SO问题和Stephen Cleary博客......哇)。
如果在这种情况下的潜在问题是我“触发并忘记”的方法绑定到 http 上下文并受到 ASP.NET 工作进程的提前终止,那么我的问题就变成了......
有没有办法从那个 ASP.NET …