Skip to content

Commit 9a792af

Browse files
committed
prepare for sns example integration test
1 parent 1c1c5d2 commit 9a792af

File tree

14 files changed

+399
-20
lines changed

14 files changed

+399
-20
lines changed

Makefile

+3-9
Original file line numberDiff line numberDiff line change
@@ -12,16 +12,14 @@ build:
1212
test:
1313
$(RYUK) go test $(PACKAGES) -v -race \;
1414

15-
cover:
16-
make cover-ci
15+
cover: cover-ci
1716
go tool cover -html=coverage.out -o coverage.html
1817
open -a "Google Chrome" coverage.html
1918

2019
cover-ci:
2120
$(RYUK) go test $(COVER_PACKAGES) -v -coverprofile=coverage.out
2221
go tool cover -func=coverage.out
2322

24-
2523
generate:
2624
go generate ./...
2725

@@ -33,11 +31,7 @@ fix-lint:
3331
go mod tidy
3432

3533

36-
lint:
37-
make generate
38-
make fix-lint
34+
lint: generate fix-lint
3935
golangci-lint run -v
4036

41-
push-check:
42-
make lint
43-
make test
37+
push-check: lint test

examples/01_sns/Makefile

+11
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
.PHONY: image-build docker-build
2+
3+
image-build:
4+
GOOS=linux GOARCH=amd64 go build -o ./writer/build/linux/writer ./writer
5+
GOOS=linux GOARCH=amd64 go build -o ./forwarder/build/linux/forwarder ./forwarder
6+
GOOS=linux GOARCH=amd64 go build -o ./sqs_reader/build/linux/sqs_reader ./sqs_reader
7+
8+
docker-build: image-build
9+
docker build -t nikolayk812/pgx-outbox-writer -f ./writer/Dockerfile ./writer
10+
docker build -t nikolayk812/pgx-outbox-forwarder -f ./forwarder/Dockerfile ./forwarder
11+
docker build -t nikolayk812/pgx-outbox-sqs-reader -f ./sqs_reader/Dockerfile ./sqs_reader

examples/01_sns/README.md

+3-2
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44

55
This example features three services: `Writer`, `Forwarder`, and `SQS reader`.
66

7+
Postgres and SNS/SQS are started in (Docker) containers using `docker-compose`. SNS/SQS run inside Localstack container, which is an emulation of AWS services.
8+
79
![Project Logo](diagram.jpg)
810

911
### Writer
@@ -16,13 +18,12 @@ In the real world, the `Writer` could be a business service: `user-service`.
1618
### Forwarder
1719

1820
Reads messages from the `outbox_messages` table, transforms and publishes them to the SNS topic.
19-
It is responsible for creating the SNS topic in the Localstack container, which is an emulation of the AWS services.
2021

2122
In the real world, the `Forwarder` could be a background job of the `user-service`, i.e. a cronjob in a Kubernetes cluster.
2223

2324
### SQS reader
2425

25-
Creates a SQS queue, subscribes it to the SNS topic, and reads messages from the queue.
26+
Reads messages from the queue.
2627

2728
In the real world, the `SQS reader` could be another business service, i.e. `cart-service` which is interested in the events of the `user-service`.
2829

examples/01_sns/forwarder/Dockerfile

+7
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
FROM alpine:3.21
2+
3+
COPY ./build/linux/forwarder /forwarder
4+
5+
RUN chmod +x /forwarder
6+
7+
ENTRYPOINT ["/forwarder"]

examples/01_sns/forwarder/build/linux/.gitkeep

Whitespace-only changes.

examples/01_sns/forwarder/main.go

+9-3
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
package main
22

33
import (
4+
"cmp"
45
"context"
56
"fmt"
7+
"github.com/spf13/viper"
68
"log/slog"
79
"os"
810
"time"
@@ -18,8 +20,8 @@ import (
1820

1921
const (
2022
// Postgres
21-
connStr = "postgres://user:password@localhost:5432/dbname"
22-
outboxTable = "outbox_messages"
23+
defaultConnStr = "postgres://user:password@localhost:5432/dbname"
24+
outboxTable = "outbox_messages"
2325

2426
// Localstack
2527
region = "eu-central-1"
@@ -39,9 +41,13 @@ func main() {
3941
os.Exit(0)
4042
}()
4143

44+
viper.AutomaticEnv()
45+
46+
dbURL := cmp.Or(viper.GetString("DB_URL"), defaultConnStr)
47+
4248
ctx := context.Background()
4349

44-
pool, err := pgxpool.New(ctx, connStr)
50+
pool, err := pgxpool.New(ctx, dbURL)
4551
if err != nil {
4652
gErr = fmt.Errorf("pgxpool.New: %w", err)
4753
return

examples/01_sns/go.mod

+66
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,17 @@ require (
1313
github.com/jackc/pgx/v5 v5.7.2
1414
github.com/nikolayk812/pgx-outbox v0.0.1
1515
github.com/nikolayk812/pgx-outbox/sns v0.0.0-20241226101704-85a5e4ad7eff
16+
github.com/spf13/viper v1.19.0
17+
github.com/stretchr/testify v1.10.0
18+
github.com/testcontainers/testcontainers-go v0.34.0
19+
github.com/testcontainers/testcontainers-go/modules/postgres v0.34.0
1620
)
1721

1822
require (
23+
dario.cat/mergo v1.0.1 // indirect
24+
github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 // indirect
1925
github.com/Masterminds/squirrel v1.5.4 // indirect
26+
github.com/Microsoft/go-winio v0.6.2 // indirect
2027
github.com/aws/aws-sdk-go-v2/credentials v1.17.48 // indirect
2128
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.22 // indirect
2229
github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.26 // indirect
@@ -28,19 +35,78 @@ require (
2835
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.7 // indirect
2936
github.com/aws/aws-sdk-go-v2/service/sts v1.33.3 // indirect
3037
github.com/aws/smithy-go v1.22.1 // indirect
38+
github.com/cenkalti/backoff/v4 v4.3.0 // indirect
39+
github.com/containerd/log v0.1.0 // indirect
40+
github.com/containerd/platforms v0.2.1 // indirect
41+
github.com/cpuguy83/dockercfg v0.3.2 // indirect
42+
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
43+
github.com/distribution/reference v0.6.0 // indirect
44+
github.com/docker/docker v27.4.1+incompatible // indirect
45+
github.com/docker/go-connections v0.5.0 // indirect
46+
github.com/docker/go-units v0.5.0 // indirect
47+
github.com/felixge/httpsnoop v1.0.4 // indirect
48+
github.com/fsnotify/fsnotify v1.7.0 // indirect
3149
github.com/gabriel-vasile/mimetype v1.4.7 // indirect
50+
github.com/go-logr/logr v1.4.2 // indirect
51+
github.com/go-logr/stdr v1.2.2 // indirect
52+
github.com/go-ole/go-ole v1.3.0 // indirect
3253
github.com/go-playground/locales v0.14.1 // indirect
3354
github.com/go-playground/universal-translator v0.18.1 // indirect
3455
github.com/go-playground/validator/v10 v10.23.0 // indirect
56+
github.com/gogo/protobuf v1.3.2 // indirect
57+
github.com/grpc-ecosystem/grpc-gateway/v2 v2.25.1 // indirect
58+
github.com/hashicorp/hcl v1.0.0 // indirect
3559
github.com/jackc/pgpassfile v1.0.0 // indirect
3660
github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 // indirect
3761
github.com/jackc/puddle/v2 v2.2.2 // indirect
62+
github.com/klauspost/compress v1.17.11 // indirect
3863
github.com/lann/builder v0.0.0-20180802200727-47ae307949d0 // indirect
3964
github.com/lann/ps v0.0.0-20150810152359-62de8c46ede0 // indirect
4065
github.com/leodido/go-urn v1.4.0 // indirect
66+
github.com/lufia/plan9stats v0.0.0-20240909124753-873cd0166683 // indirect
67+
github.com/magiconair/properties v1.8.9 // indirect
68+
github.com/mitchellh/mapstructure v1.5.0 // indirect
69+
github.com/moby/docker-image-spec v1.3.1 // indirect
70+
github.com/moby/patternmatcher v0.6.0 // indirect
71+
github.com/moby/sys/sequential v0.6.0 // indirect
72+
github.com/moby/sys/user v0.3.0 // indirect
73+
github.com/moby/sys/userns v0.1.0 // indirect
74+
github.com/moby/term v0.5.0 // indirect
75+
github.com/morikuni/aec v1.0.0 // indirect
76+
github.com/opencontainers/go-digest v1.0.0 // indirect
77+
github.com/opencontainers/image-spec v1.1.0 // indirect
78+
github.com/pelletier/go-toml/v2 v2.2.2 // indirect
79+
github.com/pkg/errors v0.9.1 // indirect
80+
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
81+
github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 // indirect
82+
github.com/sagikazarmark/locafero v0.4.0 // indirect
83+
github.com/sagikazarmark/slog-shim v0.1.0 // indirect
84+
github.com/shirou/gopsutil/v3 v3.24.5 // indirect
85+
github.com/shoenig/go-m1cpu v0.1.6 // indirect
86+
github.com/sirupsen/logrus v1.9.3 // indirect
87+
github.com/sourcegraph/conc v0.3.0 // indirect
88+
github.com/spf13/afero v1.11.0 // indirect
89+
github.com/spf13/cast v1.6.0 // indirect
90+
github.com/spf13/pflag v1.0.5 // indirect
91+
github.com/subosito/gotenv v1.6.0 // indirect
92+
github.com/tklauser/go-sysconf v0.3.14 // indirect
93+
github.com/tklauser/numcpus v0.9.0 // indirect
94+
github.com/yusufpapurcu/wmi v1.2.4 // indirect
95+
go.opentelemetry.io/auto/sdk v1.1.0 // indirect
96+
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.58.0 // indirect
97+
go.opentelemetry.io/otel v1.33.0 // indirect
98+
go.opentelemetry.io/otel/metric v1.33.0 // indirect
99+
go.opentelemetry.io/otel/trace v1.33.0 // indirect
100+
go.uber.org/atomic v1.9.0 // indirect
101+
go.uber.org/multierr v1.9.0 // indirect
41102
golang.org/x/crypto v0.31.0 // indirect
103+
golang.org/x/exp v0.0.0-20230905200255-921286631fa9 // indirect
42104
golang.org/x/net v0.33.0 // indirect
43105
golang.org/x/sync v0.10.0 // indirect
44106
golang.org/x/sys v0.28.0 // indirect
45107
golang.org/x/text v0.21.0 // indirect
108+
google.golang.org/grpc v1.69.2 // indirect
109+
google.golang.org/protobuf v1.36.0 // indirect
110+
gopkg.in/ini.v1 v1.67.0 // indirect
111+
gopkg.in/yaml.v3 v3.0.1 // indirect
46112
)

0 commit comments

Comments
 (0)