簡體   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