chore: add ADR & client benchmarks

This commit is contained in:
Stefan Martinov 2025-01-16 15:16:56 +01:00
parent b0b85f2b4f
commit 9ee1a8d34c
4 changed files with 111 additions and 9 deletions

View File

@ -1,7 +1,6 @@
package gotsrpc
import (
"bufio"
"compress/gzip"
"context"
"fmt"
@ -155,7 +154,7 @@ func (c *BufferedClient) Call(ctx context.Context, url string, endpoint string,
encodeWriter = snappyWriter
defer snappyWriter.Close()
case CompressorNone:
encodeWriter = bufio.NewWriterSize(writer, 1024)
encodeWriter = writer
default:
encodeWriter = writer
}
@ -180,6 +179,8 @@ func (c *BufferedClient) Call(ctx context.Context, url string, endpoint string,
req.Header.Set("Content-Encoding", "gzip")
case CompressorSnappy:
req.Header.Set("Content-Encoding", "snappy")
case CompressorNone:
// uncompressed, nothing to do
default:
// uncompressed, nothing to do
}

View File

@ -97,7 +97,6 @@ func TestNewBufferedClient(t *testing.T) {
}
func BenchmarkBufferedClient(b *testing.B) {
var testRequestData []interface{}
data, err := os.ReadFile("testdata/request.json")
require.NoError(b, err)
@ -106,22 +105,33 @@ func BenchmarkBufferedClient(b *testing.B) {
require.NoError(b, err)
benchClient := func(b *testing.B, client Client) {
server := httptest.NewServer(http.HandlerFunc(func(writer http.ResponseWriter, request *http.Request) {
writer.Write([]byte("[]"))
}))
defer server.Close()
b.ReportAllocs()
client.(*BufferedClient).client = server.Client()
b.ResetTimer()
if bc, ok := client.(*BufferedClient); ok {
bc.client = server.Client()
}
for i := 0; i < b.N; i++ {
err := client.Call(context.Background(), server.URL, "/test", "test", testRequestData, nil)
require.NoError(b, err)
}
}
benchmarks := map[string]Compressor{
"none": CompressorNone,
"gzip": CompressorGZIP,
"snappy": CompressorSnappy,
}
runs := 5
b.Run("uncompressed", func(b *testing.B) { benchClient(b, NewBufferedClient(WithCompressor(CompressorNone))) })
b.Run("gzip", func(b *testing.B) { benchClient(b, NewBufferedClient(WithCompressor(CompressorGZIP))) })
b.Run("snappy", func(b *testing.B) { benchClient(b, NewBufferedClient(WithCompressor(CompressorSnappy))) })
for name, compressor := range benchmarks {
b.Run(name, func(b *testing.B) {
for index := 0; index < runs; index++ {
b.Run(fmt.Sprintf("%d", index), func(b *testing.B) { benchClient(b, NewBufferedClient(WithCompressor(compressor))) })
}
})
}
}

View File

@ -0,0 +1,19 @@
# 1. Record architecture decisions
Date: 2025-01-16
## Status
Accepted
## Context
We need to record the architectural decisions made on this project.
## Decision
We will use Architecture Decision Records, as [described by Michael Nygard](http://thinkrelevance.com/blog/2011/11/15/documenting-architecture-decisions).
## Consequences
See Michael Nygard's article, linked above. For a lightweight ADR toolset, see Nat Pryce's [adr-tools](https://github.com/npryce/adr-tools).

View File

@ -0,0 +1,72 @@
# 2. streaming and compression
Date: 2025-01-16
## Status
Accepted
## Context
We need to allow streaming and compression of the data.
## Decision
We will use the `io.Pipe` interface to allow streaming of the data, and pipe the data through the compression algorithm.
For
## Consequences
Benchmarking shows that the compression is not noticeable for snappy, but the streaming is in comparison to the old method.
```text
goos: darwin
goarch: arm64
pkg: github.com/foomo/gotsrpc/v2
cpu: Apple M1 Max
BenchmarkBufferedClient
BenchmarkBufferedClient/deprecated
BenchmarkBufferedClient/deprecated/0
BenchmarkBufferedClient/deprecated/0-10 20712 54428 ns/op 26135 B/op 108 allocs/op
BenchmarkBufferedClient/deprecated/1
BenchmarkBufferedClient/deprecated/1-10 22180 52320 ns/op 26170 B/op 108 allocs/op
BenchmarkBufferedClient/deprecated/2
BenchmarkBufferedClient/deprecated/2-10 22329 49323 ns/op 26236 B/op 108 allocs/op
BenchmarkBufferedClient/deprecated/3
BenchmarkBufferedClient/deprecated/3-10 24580 48177 ns/op 26138 B/op 108 allocs/op
BenchmarkBufferedClient/deprecated/4
BenchmarkBufferedClient/deprecated/4-10 24999 57772 ns/op 26154 B/op 108 allocs/op
BenchmarkBufferedClient/snappy
BenchmarkBufferedClient/snappy/0
BenchmarkBufferedClient/snappy/0-10 16392 69553 ns/op 15282 B/op 114 allocs/op
BenchmarkBufferedClient/snappy/1
BenchmarkBufferedClient/snappy/1-10 17702 72923 ns/op 14944 B/op 114 allocs/op
BenchmarkBufferedClient/snappy/2
BenchmarkBufferedClient/snappy/2-10 17932 67446 ns/op 14819 B/op 114 allocs/op
BenchmarkBufferedClient/snappy/3
BenchmarkBufferedClient/snappy/3-10 16640 69216 ns/op 15155 B/op 114 allocs/op
BenchmarkBufferedClient/snappy/4
BenchmarkBufferedClient/snappy/4-10 16767 66247 ns/op 15010 B/op 114 allocs/op
BenchmarkBufferedClient/none
BenchmarkBufferedClient/none/0
BenchmarkBufferedClient/none/0-10 17706 68516 ns/op 12280 B/op 112 allocs/op
BenchmarkBufferedClient/none/1
BenchmarkBufferedClient/none/1-10 17593 68580 ns/op 12308 B/op 112 allocs/op
BenchmarkBufferedClient/none/2
BenchmarkBufferedClient/none/2-10 17292 67673 ns/op 12208 B/op 112 allocs/op
BenchmarkBufferedClient/none/3
BenchmarkBufferedClient/none/3-10 17086 71715 ns/op 12285 B/op 112 allocs/op
BenchmarkBufferedClient/none/4
BenchmarkBufferedClient/none/4-10 17067 68955 ns/op 12295 B/op 112 allocs/op
BenchmarkBufferedClient/gzip
BenchmarkBufferedClient/gzip/0
BenchmarkBufferedClient/gzip/0-10 7190 153284 ns/op 22024 B/op 113 allocs/op
BenchmarkBufferedClient/gzip/1
BenchmarkBufferedClient/gzip/1-10 6808 158344 ns/op 20757 B/op 113 allocs/op
BenchmarkBufferedClient/gzip/2
BenchmarkBufferedClient/gzip/2-10 6889 156492 ns/op 19680 B/op 113 allocs/op
BenchmarkBufferedClient/gzip/3
BenchmarkBufferedClient/gzip/3-10 6927 148146 ns/op 18912 B/op 113 allocs/op
BenchmarkBufferedClient/gzip/4
BenchmarkBufferedClient/gzip/4-10 8340 146697 ns/op 20207 B/op 113 allocs/op
```