我第一次认真地使用 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 存储通信的大延迟?
我对 DevExpress 库不熟悉,而且我已经有一段时间没有使用 Blazor 了,所以这将是从纯粹的 Azure 和一般 Web 开发角度来看的答案。 😀
首先,对于下载,您应该考虑使用 CDN,例如 Azure CDN。这有助于缓存离用户更近的 blob(从用户第二次请求开始),从而加快下载速度。
对于更新,你的方法听起来不错。这通常称为“悲观更新”。至于 URL,由于它是新的更新,因此理想情况下应该是不同的 URL,并且在使用 CDN 时,这可以确保缓存新的 blob。
但如果这是不可接受的,您也可以将查询字符串与 CDN 一起使用。
来到
DxRichEdit
组件,考虑到他们的API支持流对象,我猜它应该支持你的用例,但我想你必须尝试和/或直接询问DevExpress。
最后,您应该能够同时启动两者,但确保您正在处理其中任何一个失败的情况,并且不会让您的系统在没有恢复选项的情况下进入不一致的状态。
此外,一般来说,SDK 为您提供了许多用于“调整上传/下载性能”的旋钮,您可以根据自己的场景进行参考。由于您有一个 Web 应用程序,因此您必须注意,根据每个用户的情况(例如互联网带宽、与存储帐户部署的接近程度、网络条件等),性能预计会有所不同。 在这些问题中,您要解决的问题是与存储帐户的接近程度,这需要根据用户的上传位置部署多个存储帐户。 CDN 已经可以帮助进行地理定位下载。