使用 Azure BLOB 而不等待它们返回

问题描述 投票:0回答:1

我第一次认真地使用 Azure BLOB。我已经将它快速用作 CDN,我记得的一件事是它有时会有很大的延迟。因此,我想避免延迟影响页面的响应能力。

这是我的用例以及我对如何处理它们的猜测。关于减少用户遇到的任何延迟的方法有什么建议吗?这是针对 Blazor(服务器端)应用程序的。

显示他们的头像。我提供位图的网址,然后浏览器在获取它时就会获取它。我知道尺寸,因此我可以用尺寸编写

<img>
标签,以便浏览器可以为其保留正确的空间。

更新他们的头像。当他们上传它时,它与我覆盖现有位图的 URI 相同。我认为这里的方法是在调用 BlobContainerClient.UploadBlobAsync() 后立即将控制权返回给用户。然后在该任务完成时收到通知,切换到 UI 线程,然后通知 Blazor 渲染器

<img>
标签已更改。

这种方法有意义吗?当

Task
完成后,如果浏览器立即再次请求UIR,它会是新值吗?我是否应该在 url 中添加
?fubar=1234
,使其成为 different 值(对于 Azure BLOB 服务器以及浏览器)?

初始化DxRichEdit组件。我使用DevExpress DxRichEdit来提供丰富的编辑控件。其内容是保存为 BLOB 的 DOCX 文件(在内容中放入几张图片,它很快就会变得很大)。这可能更像是一个 DevExpress 问题,但我问的是一般方法。我可以调用 DxRichEdit.LoadDocumentAsync() 并且不等待其返回吗?我向它传递了一个 Stream(blobUri) ,因此我需要保存该流,并在它返回的任务完成时再次处理它。这样可以吗?

更重要的是,在

await OnInitializedAsync()
可能尚未完成的情况下,让
LoadDocumentAsync()
完成渲染是否可以?我可以向 DevExpress 询问这个具体情况,但总的来说,这是自找麻烦吗?或者这样可以吗?

如果我做不到这一点,我是否应该将此调用作为

OnInitializedAsync()
中的最后一件事,以便之前的所有内容都呈现出来并对用户可见?或者做一些事情,这样
OnParameterSetAsync()
就会被调用并加载它?

这是将内容传递给 LoadDocumentAsync 的最佳方式吗:

HttpClient client = new HttpClient();
HttpResponseMessage response = await client.GetAsync(url);
Stream stream = await response.Content.ReadAsStreamAsync();
await richEditor.LoadDocumentAsync(stream)

或者这个:

blobClient = container.GetBlobClient("thumbnail.png");
response = await blobClient.DownloadAsync();
await richEditor.LoadDocumentAsync(response.Content);

调用

HandleValidSubmitAsync()
时写入新的 RichEdit/Avatar。 因此用户完成并单击提交。
BlobClient.UploadAsync()
需要一些时间才能完成。我假设一切都需要在该方法完成之前完成。抛开其他一切不谈,如果有错误必须处理并通常显示给用户。

但是我可以触发每个 UploadAsync() 以及数据库 SaveChangesAsync() 然后等待该任务集合吗?或者类似的东西?

我错过了什么吗?有什么常见做法可以最好地处理与 BLOB 存储通信的大延迟?

azure-blob-storage blob blazor-server-side blobstore
1个回答
0
投票

我对 DevExpress 库不熟悉,而且我已经有一段时间没有使用 Blazor 了,所以这将是从纯粹的 Azure 和一般 Web 开发角度来看的答案。 😀

  • 首先,对于下载,您应该考虑使用 CDN,例如 Azure CDN。这有助于缓存离用户更近的 blob(从用户第二次请求开始),从而加快下载速度。

  • 对于更新,你的方法听起来不错。这通常称为“悲观更新”。至于 URL,由于它是新的更新,因此理想情况下应该是不同的 URL,并且在使用 CDN 时,这可以确保缓存新的 blob。

    但如果这是不可接受的,您也可以将查询字符串与 CDN 一起使用

  • 来到

    DxRichEdit
    组件,考虑到他们的API支持流对象,我猜它应该支持你的用例,但我想你必须尝试和/或直接询问DevExpress。

  • 最后,您应该能够同时启动两者,但确保您正在处理其中任何一个失败的情况,并且不会让您的系统在没有恢复选项的情况下进入不一致的状态。

此外,一般来说,SDK 为您提供了许多用于“调整上传/下载性能”的旋钮,您可以根据自己的场景进行参考。由于您有一个 Web 应用程序,因此您必须注意,根据每个用户的情况(例如互联网带宽、与存储帐户部署的接近程度、网络条件等),性能预计会有所不同。 在这些问题中,您要解决的问题是与存储帐户的接近程度,这需要根据用户的上传位置部署多个存储帐户。 CDN 已经可以帮助进行地理定位下载。

© www.soinside.com 2019 - 2024. All rights reserved.