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

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 版本中的工作方式而言,它也已过时。

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

这真的与异步无关,这是一个基础架构问题。

长运算有两种方式:

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

  2. 廉价的方法:在网络服务器上旋转一个不同的线程(或任务),让它执行操作,并从javascript轮询这个线程的进度。然而,这可能会随时关闭(网络服务器回收)并且您丢失了操作(如果您对此没问题),那么您需要拿起操作并继续。一种粗略的方法是立即用 Task.Run 和 return 包装你所有的东西,然后从 Javascript 查询进度,但正如我上面所说,这很容易被中断.