2017-10-13 42 views
2

我试图找到一个解决方案,可能需要很长的时间和时我们的负载均衡是在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); 
        } 

所以创建一个列表,然后通过循环用电子邮件发送给每个人名单上。在上面的问题中的异步方法答案似乎它会做的伎俩,但在评论中,我可以看到这被认为是一个坏主意。就最近的MVC版本中的异步工作而言,它也过时了。

我的问题是什么是保持从超时负载平衡器,而它完成这个动作最好的方法是什么?

+2

你应该将这个逻辑Web服务器之外。基本上你的网络服务器应该排队请求(例如给RabbitMQ),然后一个运行在其他地方的独立服务应该将它出队并发送邮件。 – mjwills

回答

3

这有什么好做异步真的,这是一个基础设施问题。

有两种方式来执行长操作:

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

  2. 的廉价的方式:旋Web服务器在不同的线程(或任务),并把它进行操作,并从该线程JavaScript的进展民意调查。然而,这可能会在任何时候关闭(网络服务器回收),并且你失去了操作(如果你对此有好处),那么你需要拿起操作并继续。一个简单的方法就是用Task.Run包装所有的东西,然后马上返回,然后从Javascript中查询进度,但正如我上面所说的,这很容易中断。

+0

你好,谢谢你的回答。所以,如果我例如设置的东西,以便电子邮件列表放入表,然后将其更新为电子邮件被发送出去,当行动开始我用signalR检查这每5秒,并发送回一个消息到页在停止运营之前更新进展情况,一旦它看到没有消息可以结束这一点,这实际上就是你正在谈论的1?这也会使负载均衡器不能超时? – Rob

+0

是的,这应该工作。 – albattran