停止需要长时间超时负载均衡器的操作

时间:2017-10-13 11:45:05

标签: c# asp.net-mvc asp.net-mvc-4 async-await polling

我正在尝试找到一个发送电子邮件操作的解决方案,这可能需要很长时间和时间在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的工作方式也已过时。

我的问题是什么是保持此操作在完成时超时负载均衡器的最佳方法?

1 个答案:

答案 0 :(得分:3)

这与异步无关,这是一个基础设施问题。

执行长操作有两种方法:

  1. 正确的方法:有一个后端服务器和一个在那里运行的进程+通过排队(或数据库轮询)与该后端进程通信,然后客户端根据进度更新(存储在某个数据库中)并更新Web服务器上的UI。您还需要跟踪后端的进度,以便在意外关闭时继续。

  2. 便宜的方式:在Web服务器上旋转不同的线程(或任务),并让它执行操作,并从javascript轮询此线程的进度。然而,这可能会在任何时候关闭(网络服务器回收)并且您将失去操作(如果您对此感到满意),那么您需要接受操作并继续。粗略的方法是用Task.Run包装你所拥有的全部内容,然后立即返回,然后从Javascript中查询进度,但正如我上面所说,这很容易中断。