ToB企服应用市场:ToB评测及商务社交产业平台

标题: fasthttp + `page partial gziped cache`: 页面输出服务性能提升20% [打印本页]

作者: 十念    时间: 2023-10-22 12:34
标题: fasthttp + `page partial gziped cache`: 页面输出服务性能提升20%
作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢!
接上一篇:http 中使用 gzip 输出内容时,如何预先压缩前一半页面?
经过实测,对线上一个输出 html 的服务进行了改造,通过预先压缩页面前半部分的方法,此接口的性能提升了 20%.
对比项无 gzip 压缩gzip 压缩+前半部分预压缩输出字节数43992246每核 qps14052.6316924.75具体的写法如下:
1.获取改造后的库
  1. go get github.com/ahfuzhang/compress@v1.17.2
复制代码
2.在 go.mod 中修改:
  1. replace (
  2.         github.com/klauspost/compress => github.com/ahfuzhang/compress v1.17.2
  3. )
  4. require (
  5.         github.com/klauspost/compress v1.16.3
  6.     github.com/valyala/bytebufferpool v1.0.0
  7.         github.com/valyala/fasthttp v1.50.0
  8. )
复制代码
3.代码:
  1. package main
  2. import (
  3.         "bytes"
  4.         _ "embed"
  5.         "fmt"
  6.         "log"
  7.         "os"
  8.         "github.com/klauspost/compress/gzip"
  9.         "github.com/valyala/bytebufferpool"
  10.         "github.com/valyala/fasthttp"
  11. )
  12. //go:embed raw.html
  13. var html string
  14. //go:embed raw.js
  15. var js string
  16. func testGzipedHttp() {
  17.     topHalf, digest := gzip.GetGzipedData([]byte(html))  // cache 页面的前一半, digest 是这些内容的 crc32 的校验和
  18.         requestHandler := func(ctx *fasthttp.RequestCtx) {
  19.                 ctx.Response.Header.Add("Content-Type", "text/plain")
  20.                 ctx.Response.Header.Add("Content-Encoding", "gzip")
  21.                 switch string(ctx.Request.URI().RequestURI()) {
  22.                 case "/1":   // direct output
  23.                         w, _ := gzip.NewWriterLevel(ctx, gzip.BestCompression)
  24.                         w.Write([]byte(html))
  25.                         w.Write([]byte(js))
  26.                         w.Close()
  27.                 case "/2":
  28.                         w := gzip.GetWriter(ctx)  // 使用对象池
  29.                     w.WriteHeader()  // 写 gzip 的头部信息,10 字节
  30.             w.WriteGzipedData([]byte(html), topHalf, digest)  
  31.             // 当这个缓存是第一次输出的时候,可以传入 digest 值,这样可以少算一次  crc32
  32.             // 当不是第一次输出的时候, 第三个参数 digest 填  0
  33.             w.Write([]byte(js))
  34.             gzip.PutWriter(w)  // 必须调用,写入尾部信息,并放回对象池
  35.                 }
  36.         }
  37.         s := &fasthttp.Server{
  38.                 Handler: requestHandler,
  39.         }
  40.         if err := s.ListenAndServe(":8080"); err != nil {
  41.                 log.Fatalf("error in ListenAndServe: %v", err)
  42.         }
  43. }
  44. func main() {
  45.         testGzipedHttp()
  46. }
复制代码
希望对你有用
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4