我正在尝试找到一个发送电子邮件操作的解决方案,这可能需要很长时间和时间在Rackspace上的负载均衡器。我能找到的与此特定问题相关的唯一问题是:
keep load balancer from timing out during long operation
据我所知,我需要再做一个动作,而主要的慢动作正在完成,不断轮询和返回,以保持活力。我的电子邮件操作包含以下内容:
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);
}
因此创建一个列表,然后通过发送给列表中每个人的电子邮件循环。在上面的问题中的Async方法答案似乎可以做到这一点,但在评论中我可以看到这被认为是一个坏主意。在最新的MVC版本中,async的工作方式也已过时。
我的问题是什么是保持此操作在完成时超时负载均衡器的最佳方法?
答案 0 :(得分:3)
这与异步无关,这是一个基础设施问题。
执行长操作有两种方法:
正确的方法:有一个后端服务器和一个在那里运行的进程+通过排队(或数据库轮询)与该后端进程通信,然后客户端根据进度更新(存储在某个数据库中)并更新Web服务器上的UI。您还需要跟踪后端的进度,以便在意外关闭时继续。
便宜的方式:在Web服务器上旋转不同的线程(或任务),并让它执行操作,并从javascript轮询此线程的进度。然而,这可能会在任何时候关闭(网络服务器回收)并且您将失去操作(如果您对此感到满意),那么您需要接受操作并继续。粗略的方法是用Task.Run包装你所拥有的全部内容,然后立即返回,然后从Javascript中查询进度,但正如我上面所说,这很容易中断。