优化云存储服务以提高Web应用性能

在云计算时代,数据的存储和分发变得前所未有的便捷。但是,如果不加以优化,这些服务可能无法发挥其最大潜力。本文将介绍如何通过设置缓存和压缩来优化Azure存储服务,以提高Web应用性能。

Azure存储服务简介

Azure存储服务提供了一个简单易用的平台,可以将文件存储在云端,并可以内部服务于其他应用程序,或者允许公众远程访问。然而,对于公共访问的服务,内容通常不会被缓存,也不会被压缩,总体上感觉就像是一个没有现代Web所具备的一些特性的简单Web服务器。这将减少服务器的查询次数和传输内容所需的带宽。

在Azure存储中保存数据的基础

有一个后台进程,每30分钟运行一次,用于识别KlipTok上最受欢迎的剪辑,并将它们的数据缓存到Azure存储中,作为一个可以在首次访问网站时下载的JSON文件。以下是保存数据的代码示例:

var blobServiceClient = new BlobServiceClient(EnvironmentConfiguration.TableStorageConnectionString); var containerClient = blobServiceClient.GetBlobContainerClient("cache"); var client = containerClient.GetBlobClient("fileToCache.json"); await client.UploadAsync(myContentToCacheAsStream, true);

这段代码创建了一个blob客户端,连接到名为"cache"的容器,定义了一个名为"fileToCache.json"的文件,并上传了内容,同时打开了覆盖权限(最后一行中的true参数)。

添加缓存头

可以通过向BlobClient添加几行代码,轻松地为这个文件添加缓存头。希望这个文件在任何公共代理或服务器上缓存30分钟。让在UploadAsync调用后添加这些头:

await client.SetHttpHeadersAsync(new BlobHttpHeaders { CacheControl = "public, max-age=3600, must-revalidate", ContentType = "application/json, charset=utf-8" });

CacheControl头部有一个明确的定义,它已经存在很长时间了,并且接受以秒为单位的最大年龄。must-revalidate指令表明缓存服务器在缓存最大年龄到期时必须请求文件的新副本,并且不应该提供比最大年龄更老的文件。

压缩内容

Azure存储没有像大多数Web服务器那样自动进行gzip压缩或brotli压缩并提供内容的方式。在IIS中,有一个面板,可以通过勾选一个框来激活压缩。在其他Web服务器中,服务器的配置文件中有一个条目可以启用gzip压缩。

但是,Azure存储需要手动进行压缩,并添加适当的头部条目来指示内容被压缩。.NET BCL有一个GZipStream对象可用,可以使用标准的System.Text.JsonSerializer通过以下代码将内容路由到该对象:

var MyContent = GetClipsToCache().ToArray(); using var myContentToCacheAsStream = new MemoryStream(); using var compressor = new GZipStream(myContentToCacheAsStream, CompressionLevel.Optimal); await JsonSerializer.SerializeAsync(compressor, MyContent, options); compressor.Flush(); myContentToCacheAsStream.Position = 0;

使用GetClipsToCache()获取要缓存的数据,并将其作为数组放入MyContent变量中。分配了一个MemoryStream,它将接收压缩的内容,并且分配了一个GZipStream,它将将其压缩的输出放入myContentToCacheAsStream。最后,将数据序列化为JSON并写入compressor GZipStream,它将进行压缩并将其传递给myContentToCacheAsStream变量。GZipStream被刷新以确保所有数据都被压缩,目标流的位置被重置为0,以便它可以被写入到blob存储中。

更新头部以包括压缩指示

需要更新头部,以包括内容被GZip压缩的指示。很容易更新刚刚添加的缓存头部代码,以包括这一点:

await client.SetHttpHeadersAsync(new BlobHttpHeaders { CacheControl = "public, max-age=3600, must-revalidate", ContentType = "application/json, charset=utf-8", ContentEncoding = "gzip" });
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485