停止需要很长时间的动作超时负载均衡器
Stop action that takes a long time timing out load balancer
我正在尝试找到发送电子邮件操作的解决方案,该操作可能需要很长时间,并且会导致 Rackspace 上的负载均衡器超时。我能找到的与此特定问题相关的唯一问题是:
keep load balancer from timing out during long operation
据我了解,我需要 运行 另一个动作,同时主要的缓慢动作正在完成以不断轮询和 return 以保持活动状态。我的电子邮件操作包含以下内容:
var sendto = db.Users
.Where(b => b.Id == model.SentTo |
((model.SelectedRoles.Any(s => b.Roles.Select(h => h.RoleId).Contains(s)))
&& ((b.enrollment.Any(h => h.cohort.CourseID == model.CourseID) | model.CourseID == null))
&& (b.OrgID == model.OrgID | model.OrgID == null))).ToList();
foreach (var address in sendto)
{
string Body = "message goes here";
EmailConfig.SendMessageViaMailGun(filestoattach, address.Email, null, email.Subject, Body);
}
因此创建了一个列表,然后循环发送电子邮件给列表中的每个人。上面问题中的异步方法答案似乎可以解决问题,但在评论中我可以看到这被认为是一个坏主意。就异步在最新 MVC 版本中的工作方式而言,它也已过时。
我的问题是防止此操作在负载均衡器完成时超时的最佳方法是什么?
这真的与异步无关,这是一个基础架构问题。
长运算有两种方式:
正确的方法:有一个后端服务器和一个进程运行+通过排队(或数据库轮询)与这个后端进程通信,然后客户端根据进度更新(存储在某些数据库中)并更新 Web 服务器上的 UI。您还需要跟踪后端的进度以在意外关闭的情况下继续。
廉价的方法:在网络服务器上旋转一个不同的线程(或任务),让它执行操作,并从javascript轮询这个线程的进度。然而,这可能会随时关闭(网络服务器回收)并且您丢失了操作(如果您对此没问题),那么您需要拿起操作并继续。一种粗略的方法是立即用 Task.Run 和 return 包装你所有的东西,然后从 Javascript 查询进度,但正如我上面所说,这很容易被中断.
我正在尝试找到发送电子邮件操作的解决方案,该操作可能需要很长时间,并且会导致 Rackspace 上的负载均衡器超时。我能找到的与此特定问题相关的唯一问题是:
keep load balancer from timing out during long operation
据我了解,我需要 运行 另一个动作,同时主要的缓慢动作正在完成以不断轮询和 return 以保持活动状态。我的电子邮件操作包含以下内容:
var sendto = db.Users
.Where(b => b.Id == model.SentTo |
((model.SelectedRoles.Any(s => b.Roles.Select(h => h.RoleId).Contains(s)))
&& ((b.enrollment.Any(h => h.cohort.CourseID == model.CourseID) | model.CourseID == null))
&& (b.OrgID == model.OrgID | model.OrgID == null))).ToList();
foreach (var address in sendto)
{
string Body = "message goes here";
EmailConfig.SendMessageViaMailGun(filestoattach, address.Email, null, email.Subject, Body);
}
因此创建了一个列表,然后循环发送电子邮件给列表中的每个人。上面问题中的异步方法答案似乎可以解决问题,但在评论中我可以看到这被认为是一个坏主意。就异步在最新 MVC 版本中的工作方式而言,它也已过时。
我的问题是防止此操作在负载均衡器完成时超时的最佳方法是什么?
这真的与异步无关,这是一个基础架构问题。
长运算有两种方式:
正确的方法:有一个后端服务器和一个进程运行+通过排队(或数据库轮询)与这个后端进程通信,然后客户端根据进度更新(存储在某些数据库中)并更新 Web 服务器上的 UI。您还需要跟踪后端的进度以在意外关闭的情况下继续。
廉价的方法:在网络服务器上旋转一个不同的线程(或任务),让它执行操作,并从javascript轮询这个线程的进度。然而,这可能会随时关闭(网络服务器回收)并且您丢失了操作(如果您对此没问题),那么您需要拿起操作并继续。一种粗略的方法是立即用 Task.Run 和 return 包装你所有的东西,然后从 Javascript 查询进度,但正如我上面所说,这很容易被中断.