繁体   English   中英

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

[英]Stop action that takes a long time timing out load balancer

我正在尝试找到一种发送电子邮件操作的解决方案,该解决方案可能会花费很长时间,并且会使Rackspace上的负载均衡器超时。 我能找到的与此特定问题有关的唯一问题是:

防止负载均衡器在长时间运行期间超时

据我了解,我需要在主要的慢速动作完成后继续执行另一项操作,以不断轮询并返回,以保持活动状态。 我的电子邮件操作包含以下内容:

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

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

这实际上与异步无关,这是一个基础结构问题。

有两种执行长时间操作的方法:

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

  2. 便宜的方法:在Web服务器上旋转一个不同的线程(或任务),并让它执行操作,然后从javascript中轮询该线程的进度。 但是,这有可能在任何时候关闭(Web服务器回收),并且您丢失了该操作(如果可以的话),那么您需要进行该操作并继续。 一种粗略的方法是使用Task.Run包装您拥有的所有东西,然后立即返回,然后从Javascript查询进度,但是正如我上面所说的那样,这很容易出现中断。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM