Azure Worker在执行长时间运行操作时失败

时间:2015-11-04 15:19:57

标签: c# azure azure-worker-roles

我在我的网络应用中运行了一些角色。它们通过Azure Storage Queue消息进行通信。这意味着Web角色在该角色捕获并开始执行之后放置消息。

主要是,Worker角色使用文件。它删除xlsx文件中的所有空行。 Worker迭代每行中的所有行和单元格。因此,如果行中的所有单元格都为空,则删除行。

它适用于总行数小于100 000的文件,但我们的一个客户加载文件有1 100 000条记录(1 098 800为空)。因此,当工人处理它失败时。见附图。

我将调试器附加到此过程。我的断点在循环中首先开出30-40秒。但是在那个调试器分离之后我在azure portal中看到了这个消息,那个工人不健康。

我还尝试在单独的线程中执行文件处理方法。但是有相同的结果。

有什么想法吗?

enter image description here

更新:

My Run方法看起来像

public override void Run() {
    var queue = GetCloudQueue();
    int maxJobRetries = 10;
    while (true) {
        try {
            var msg = queue.GetMessage();

            if (msg != null) {
                if (msg.DequeueCount <= maxJobRetries) {
                    ImportCommand ic = JsonConvert.DeserializeObject < ImportCommand > (msg.AsString);
                    ProcessImport(queue, msg);
                } else {
                    queue.DeleteMessage();
                }
            } else {
                Thread.Sleep(100);
            }
        } catch (Exception ex) {
            //handle exception
        }
    }
}

我真的不认为可以抛出任何未处理的异常。我把所有代码放在try catch块中。

我认为值得一提的是我使用Gembox来解析xlsx文件。我的解析方法看起来:

    public IEnumerable < string[] > ReadLines(int sheetIndex) {
    string[] data = null;
    if (_file.Worksheets.Count > 0 && _file.Worksheets[sheetIndex].Rows.Count > 0) {
        if (_headerLength == 0) {
            _headerLength = _file.Worksheets[sheetIndex].Rows[0].AllocatedCells.Count;
        }
// I have great than 1 000 000 Rows
        foreach(ExcelRow row in _file.Worksheets[sheetIndex].Rows) {
            data = new string[_headerLength];
// I have 30 columns
            for (int j = 0; j < _headerLength ; j++) {
                ExcelCell cell = row.Cells[j];
                if (cell.Value != null) {
                    bool isDate = cell.Value is DateTime;
                    if (!isDate) {
                        data[j] = cell.Value.ToString();
                    } else {
                        //if locale is null then used CurrentCulture (.net feature)
                        data[j] = ((DateTime) cell.Value).ToString(_locale);
                    }
                } else {
                    data[j] = null;
                }
            }
            yield return data;
        }
    }
}

更新2:

感谢David Makogon。 我改变了两个尺寸(最多A2),它现在正在工作。但我的记忆花了一分钟。保持A2非常昂贵。任何想法如何减少我的代码以使其适用于小实例?

enter image description here

1 个答案:

答案 0 :(得分:0)

除了一个小细节之外,没有办法用您提供的一小部分信息来诊断您的问题:您的工作者角色实例是A0,最小的VM大小,具有768MB RAM(并共享CPU)。因此,您的应用很可能会遇到内存限制。

通常我会发布这个评论作为评论,但你正在处理百万行的xls文件,这听起来像是一个非常耗费内存的任务,而且它可以通过在更大的VM上运行来解决。