Azure WebJob 不处理所有 Blob
Azure WebJob not processing all Blobs
我将 gzip 文件上传到 Azure 存储容器(输入)。然后我有一个 WebJob 应该拾取 Blob,解压缩它们并将它们放入另一个容器(输出)。两个容器使用相同的存储帐户。
我的问题是它无法处理所有 Blob。它似乎总是错过 1。今天早上我将 11 个 blob 上传到输入容器,只有 10 个被处理并转储到输出容器中。如果我上传 4 个,那么将处理 3 个。仪表板将显示 10 个调用,即使已上传 11 个 blob。它看起来不像是为第 11 个 blob 触发的。如果我只上传 1 个,它似乎会处理它。
我在标准模式下运行网站,并将 Always On 设置为 true。
我试过:
- 像 Azure 示例一样编写代码 (https://github.com/Azure/azure-webjobs-sdk-samples)。
- 像本文中的代码一样编写代码(http://azure.microsoft.com/en-us/documentation/articles/websites-dotnet-webjobs-sdk-get-started)。
- 为输入和输出使用流而不是 CloudBlockBlob。
- 关闭输入、输出和Gzip流的各种组合。
- 在 Unzip 方法中有 UnzipData 代码。
这是我的最新代码。我做错了什么吗?
public class Functions
{
public static void Unzip(
[BlobTrigger("input/{name}.gz")] CloudBlockBlob inputBlob,
[Blob("output/{name}")] CloudBlockBlob outputBlob)
{
using (Stream input = inputBlob.OpenRead())
{
using (Stream output = outputBlob.OpenWrite())
{
UnzipData(input, output);
}
}
}
public static void UnzipData(Stream input, Stream output)
{
GZipStream gzippedStream = null;
gzippedStream = new GZipStream(input, CompressionMode.Decompress);
gzippedStream.CopyTo(output);
}
}
作为一种解决方法,如果您不直接侦听 Blob 而是在中间引入一个队列,当您写入输入 Blob 容器时,还要在队列中写入一条关于新 Blob 的消息,让 WebJob 监听这个 Queue,一旦消息到达 Queue,WebJob 函数就会从 Input Blob Container 中读取文件并复制到 Output Blob Container 中。
这个模型适合你吗?
根据上面 Victor 的评论,它看起来像是 Microsoft 端的错误。
编辑:我没有得到反对票。出现问题,Microsoft 将修复它。这就是为什么我的一些斑点被忽略的答案...
"There is a known issue about some Storage log events being ignored. Those events are usually generated for large files. We have a fix for it but it is not public yet. Sorry for the inconvenience. – Victor Hurdugaci Jan 9 at 12:23"
我将 gzip 文件上传到 Azure 存储容器(输入)。然后我有一个 WebJob 应该拾取 Blob,解压缩它们并将它们放入另一个容器(输出)。两个容器使用相同的存储帐户。
我的问题是它无法处理所有 Blob。它似乎总是错过 1。今天早上我将 11 个 blob 上传到输入容器,只有 10 个被处理并转储到输出容器中。如果我上传 4 个,那么将处理 3 个。仪表板将显示 10 个调用,即使已上传 11 个 blob。它看起来不像是为第 11 个 blob 触发的。如果我只上传 1 个,它似乎会处理它。
我在标准模式下运行网站,并将 Always On 设置为 true。
我试过:
- 像 Azure 示例一样编写代码 (https://github.com/Azure/azure-webjobs-sdk-samples)。
- 像本文中的代码一样编写代码(http://azure.microsoft.com/en-us/documentation/articles/websites-dotnet-webjobs-sdk-get-started)。
- 为输入和输出使用流而不是 CloudBlockBlob。
- 关闭输入、输出和Gzip流的各种组合。
- 在 Unzip 方法中有 UnzipData 代码。
这是我的最新代码。我做错了什么吗?
public class Functions
{
public static void Unzip(
[BlobTrigger("input/{name}.gz")] CloudBlockBlob inputBlob,
[Blob("output/{name}")] CloudBlockBlob outputBlob)
{
using (Stream input = inputBlob.OpenRead())
{
using (Stream output = outputBlob.OpenWrite())
{
UnzipData(input, output);
}
}
}
public static void UnzipData(Stream input, Stream output)
{
GZipStream gzippedStream = null;
gzippedStream = new GZipStream(input, CompressionMode.Decompress);
gzippedStream.CopyTo(output);
}
}
作为一种解决方法,如果您不直接侦听 Blob 而是在中间引入一个队列,当您写入输入 Blob 容器时,还要在队列中写入一条关于新 Blob 的消息,让 WebJob 监听这个 Queue,一旦消息到达 Queue,WebJob 函数就会从 Input Blob Container 中读取文件并复制到 Output Blob Container 中。 这个模型适合你吗?
根据上面 Victor 的评论,它看起来像是 Microsoft 端的错误。
编辑:我没有得到反对票。出现问题,Microsoft 将修复它。这就是为什么我的一些斑点被忽略的答案...
"There is a known issue about some Storage log events being ignored. Those events are usually generated for large files. We have a fix for it but it is not public yet. Sorry for the inconvenience. – Victor Hurdugaci Jan 9 at 12:23"