Skip to content

Commit 19f43d1

Browse files
committed
feat: add SQS integration and Docker Compose setup for local development
1 parent 936eb13 commit 19f43d1

11 files changed

Lines changed: 384 additions & 18 deletions

File tree

.env.example

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
# Service Configuration
2+
SERVICE_API_PORT=8080
3+
SERVICE_ENVIRONMENT=local
4+
5+
# Valkey Configuration
6+
VALKEY_HOST=valkey
7+
VALKEY_PORT=6379
8+
9+
# ElasticMQ/SQS Configuration
10+
SQS_ENDPOINT=http://elasticmq:9324
11+
SQS_QUEUE_URL=http://elasticmq:9324/000000000000/events
12+
SQS_REGION=eu-central-1
13+
14+
# ClickHouse Configuration
15+
CLICKHOUSE_HOST=clickhouse
16+
CLICKHOUSE_PORT=9000
17+
CLICKHOUSE_DB=events
18+
CLICKHOUSE_USER=default

cmd/api/main.go

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,36 @@
11
package main
22

33
import (
4+
"context"
5+
"fmt"
46
"log"
57
"net/http"
68

79
"github.com/BarkinBalci/event-analytics-service/internal/api"
10+
"github.com/BarkinBalci/event-analytics-service/internal/clients"
811
"github.com/BarkinBalci/event-analytics-service/internal/config"
12+
"github.com/BarkinBalci/event-analytics-service/internal/service"
913
)
1014

1115
func main() {
12-
_ = config.Load()
16+
cfg, err := config.Load()
17+
if err != nil {
18+
log.Fatalf("Failed to load config: %v", err)
19+
}
20+
21+
// Initialize SQS client
22+
sqsClient, err := clients.NewSQSClient(context.Background(), cfg.SQSEndpoint, cfg.SQSQueueURL, cfg.SQSRegion)
23+
if err != nil {
24+
log.Fatalf("Failed to create SQS client: %v", err)
25+
}
26+
27+
// Initialize event service
28+
eventService := service.NewEventService(sqsClient)
1329

14-
handler := api.NewHandler()
30+
// Initialize handler
31+
handler := api.NewHandler(eventService)
1532

16-
addr := ":8080"
33+
addr := fmt.Sprintf(":%s", cfg.ServiceAPIPort)
1734
log.Printf("API starting on %s", addr)
1835

1936
if err := http.ListenAndServe(addr, handler); err != nil {

cmd/consumer/main.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,10 @@ import (
1212
)
1313

1414
func main() {
15-
cfg := config.Load()
15+
cfg, err := config.Load()
16+
if err != nil {
17+
log.Fatalf("Failed to load config: %v", err)
18+
}
1619

1720
ctx, cancel := context.WithCancel(context.Background())
1821
defer cancel()

docker-compose.yml

Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
services:
2+
api:
3+
build:
4+
context: .
5+
dockerfile: deployments/docker/api.Dockerfile
6+
container_name: event-analytics-api
7+
ports:
8+
- "8080:8080"
9+
environment:
10+
- VALKEY_HOST=valkey
11+
- VALKEY_PORT=6379
12+
- CLICKHOUSE_HOST=clickhouse
13+
- CLICKHOUSE_PORT=9000
14+
- CLICKHOUSE_DB=events
15+
- SQS_ENDPOINT=http://elasticmq:9324
16+
- SQS_QUEUE_URL=http://elasticmq:9324/000000000000/events
17+
depends_on:
18+
valkey:
19+
condition: service_started
20+
clickhouse:
21+
condition: service_started
22+
elasticmq:
23+
condition: service_started
24+
networks:
25+
- event-analytics-network
26+
restart: unless-stopped
27+
28+
consumer:
29+
build:
30+
context: .
31+
dockerfile: deployments/docker/consumer.Dockerfile
32+
container_name: event-analytics-consumer
33+
environment:
34+
- VALKEY_HOST=valkey
35+
- VALKEY_PORT=6379
36+
- CLICKHOUSE_HOST=clickhouse
37+
- CLICKHOUSE_PORT=9000
38+
- CLICKHOUSE_DB=events
39+
- SQS_ENDPOINT=http://elasticmq:9324
40+
- SQS_QUEUE_URL=http://elasticmq:9324/000000000000/events
41+
depends_on:
42+
valkey:
43+
condition: service_healthy
44+
clickhouse:
45+
condition: service_healthy
46+
elasticmq:
47+
condition: service_healthy
48+
networks:
49+
- event-analytics-network
50+
restart: unless-stopped
51+
52+
valkey:
53+
image: valkey/valkey:latest
54+
container_name: event-analytics-valkey
55+
ports:
56+
- "6379:6379"
57+
command: valkey-server --appendonly yes
58+
volumes:
59+
- valkey-data:/data
60+
networks:
61+
- event-analytics-network
62+
restart: unless-stopped
63+
64+
clickhouse:
65+
image: clickhouse/clickhouse-server:latest
66+
container_name: event-analytics-clickhouse
67+
ports:
68+
- "8123:8123" # HTTP interface
69+
- "9000:9000" # Native client
70+
environment:
71+
- CLICKHOUSE_DB=events
72+
- CLICKHOUSE_USER=default
73+
- CLICKHOUSE_PASSWORD=
74+
volumes:
75+
- clickhouse-data:/var/lib/clickhouse
76+
- clickhouse-logs:/var/log/clickhouse-server
77+
ulimits:
78+
nofile:
79+
soft: 262144
80+
hard: 262144
81+
networks:
82+
- event-analytics-network
83+
restart: unless-stopped
84+
85+
elasticmq:
86+
image: softwaremill/elasticmq:latest
87+
container_name: event-analytics-elasticmq
88+
ports:
89+
- "9324:9324" # API Server
90+
- "9325:9325" # Web UI
91+
volumes:
92+
- ./elasticmq.conf:/opt/elasticmq.conf:ro
93+
networks:
94+
- event-analytics-network
95+
restart: unless-stopped
96+
97+
networks:
98+
event-analytics-network:
99+
driver: bridge
100+
101+
volumes:
102+
valkey-data:
103+
clickhouse-data:
104+
clickhouse-logs:

elasticmq.conf

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
include classpath("application.conf")
2+
3+
node-address {
4+
protocol = http
5+
host = "*"
6+
port = 9324
7+
context-path = ""
8+
}
9+
10+
rest-sqs {
11+
enabled = true
12+
bind-port = 9324
13+
bind-hostname = "0.0.0.0"
14+
sqs-limits = strict
15+
}
16+
17+
rest-stats {
18+
enabled = true
19+
bind-port = 9325
20+
bind-hostname = "0.0.0.0"
21+
}
22+
23+
queues {
24+
events {
25+
defaultVisibilityTimeout = 10 seconds
26+
delay = 0 seconds
27+
receiveMessageWait = 0 seconds
28+
deadLettersQueue {
29+
name = "events-dlq"
30+
maxReceiveCount = 3
31+
}
32+
}
33+
events-dlq {
34+
defaultVisibilityTimeout = 10 seconds
35+
delay = 0 seconds
36+
receiveMessageWait = 0 seconds
37+
}
38+
}
39+
40+
queues-path = "/data"

go.mod

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,28 @@ module github.com/BarkinBalci/event-analytics-service
22

33
go 1.25.5
44

5-
require github.com/gin-gonic/gin v1.11.0
5+
require (
6+
github.com/BarkinBalci/envconfig v0.0.0-20251224144430-3f9701ee1dff
7+
github.com/aws/aws-sdk-go-v2 v1.41.0
8+
github.com/aws/aws-sdk-go-v2/config v1.32.6
9+
github.com/aws/aws-sdk-go-v2/credentials v1.19.6
10+
github.com/aws/aws-sdk-go-v2/service/sqs v1.42.20
11+
github.com/gin-gonic/gin v1.11.0
12+
github.com/google/uuid v1.6.0
13+
)
614

715
require (
16+
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.16 // indirect
17+
github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.16 // indirect
18+
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.16 // indirect
19+
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.4 // indirect
20+
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.4 // indirect
21+
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.16 // indirect
22+
github.com/aws/aws-sdk-go-v2/service/signin v1.0.4 // indirect
23+
github.com/aws/aws-sdk-go-v2/service/sso v1.30.8 // indirect
24+
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.12 // indirect
25+
github.com/aws/aws-sdk-go-v2/service/sts v1.41.5 // indirect
26+
github.com/aws/smithy-go v1.24.0 // indirect
827
github.com/bytedance/sonic v1.14.0 // indirect
928
github.com/bytedance/sonic/loader v0.3.0 // indirect
1029
github.com/cloudwego/base64x v0.1.6 // indirect

go.sum

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,35 @@
1+
github.com/BarkinBalci/envconfig v0.0.0-20251224144430-3f9701ee1dff h1:yuHwtcc4jHD5VkVplYFv6JeV/JjsOEXg1IcyoVzD7Ds=
2+
github.com/BarkinBalci/envconfig v0.0.0-20251224144430-3f9701ee1dff/go.mod h1:smM1iKKmJuYvPnc2uB8QdWmthSibrxfC4SGYTqUpEYE=
3+
github.com/aws/aws-sdk-go-v2 v1.41.0 h1:tNvqh1s+v0vFYdA1xq0aOJH+Y5cRyZ5upu6roPgPKd4=
4+
github.com/aws/aws-sdk-go-v2 v1.41.0/go.mod h1:MayyLB8y+buD9hZqkCW3kX1AKq07Y5pXxtgB+rRFhz0=
5+
github.com/aws/aws-sdk-go-v2/config v1.32.6 h1:hFLBGUKjmLAekvi1evLi5hVvFQtSo3GYwi+Bx4lpJf8=
6+
github.com/aws/aws-sdk-go-v2/config v1.32.6/go.mod h1:lcUL/gcd8WyjCrMnxez5OXkO3/rwcNmvfno62tnXNcI=
7+
github.com/aws/aws-sdk-go-v2/credentials v1.19.6 h1:F9vWao2TwjV2MyiyVS+duza0NIRtAslgLUM0vTA1ZaE=
8+
github.com/aws/aws-sdk-go-v2/credentials v1.19.6/go.mod h1:SgHzKjEVsdQr6Opor0ihgWtkWdfRAIwxYzSJ8O85VHY=
9+
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.16 h1:80+uETIWS1BqjnN9uJ0dBUaETh+P1XwFy5vwHwK5r9k=
10+
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.16/go.mod h1:wOOsYuxYuB/7FlnVtzeBYRcjSRtQpAW0hCP7tIULMwo=
11+
github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.16 h1:rgGwPzb82iBYSvHMHXc8h9mRoOUBZIGFgKb9qniaZZc=
12+
github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.16/go.mod h1:L/UxsGeKpGoIj6DxfhOWHWQ/kGKcd4I1VncE4++IyKA=
13+
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.16 h1:1jtGzuV7c82xnqOVfx2F0xmJcOw5374L7N6juGW6x6U=
14+
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.16/go.mod h1:M2E5OQf+XLe+SZGmmpaI2yy+J326aFf6/+54PoxSANc=
15+
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.4 h1:WKuaxf++XKWlHWu9ECbMlha8WOEGm0OUEZqm4K/Gcfk=
16+
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.4/go.mod h1:ZWy7j6v1vWGmPReu0iSGvRiise4YI5SkR3OHKTZ6Wuc=
17+
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.4 h1:0ryTNEdJbzUCEWkVXEXoqlXV72J5keC1GvILMOuD00E=
18+
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.4/go.mod h1:HQ4qwNZh32C3CBeO6iJLQlgtMzqeG17ziAA/3KDJFow=
19+
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.16 h1:oHjJHeUy0ImIV0bsrX0X91GkV5nJAyv1l1CC9lnO0TI=
20+
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.16/go.mod h1:iRSNGgOYmiYwSCXxXaKb9HfOEj40+oTKn8pTxMlYkRM=
21+
github.com/aws/aws-sdk-go-v2/service/signin v1.0.4 h1:HpI7aMmJ+mm1wkSHIA2t5EaFFv5EFYXePW30p1EIrbQ=
22+
github.com/aws/aws-sdk-go-v2/service/signin v1.0.4/go.mod h1:C5RdGMYGlfM0gYq/tifqgn4EbyX99V15P2V3R+VHbQU=
23+
github.com/aws/aws-sdk-go-v2/service/sqs v1.42.20 h1:qa+1W+Kon3WDwO+8ugco4D9KvO0Pf0KBTn1hN7opIFw=
24+
github.com/aws/aws-sdk-go-v2/service/sqs v1.42.20/go.mod h1:OG0Y3TgC+IeM++ngh+IcEkN24ruGsmRiAP8GUsOhMW8=
25+
github.com/aws/aws-sdk-go-v2/service/sso v1.30.8 h1:aM/Q24rIlS3bRAhTyFurowU8A0SMyGDtEOY/l/s/1Uw=
26+
github.com/aws/aws-sdk-go-v2/service/sso v1.30.8/go.mod h1:+fWt2UHSb4kS7Pu8y+BMBvJF0EWx+4H0hzNwtDNRTrg=
27+
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.12 h1:AHDr0DaHIAo8c9t1emrzAlVDFp+iMMKnPdYy6XO4MCE=
28+
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.12/go.mod h1:GQ73XawFFiWxyWXMHWfhiomvP3tXtdNar/fi8z18sx0=
29+
github.com/aws/aws-sdk-go-v2/service/sts v1.41.5 h1:SciGFVNZ4mHdm7gpD1dgZYnCuVdX1s+lFTg4+4DOy70=
30+
github.com/aws/aws-sdk-go-v2/service/sts v1.41.5/go.mod h1:iW40X4QBmUxdP+fZNOpfmkdMZqsovezbAeO+Ubiv2pk=
31+
github.com/aws/smithy-go v1.24.0 h1:LpilSUItNPFr1eY85RYgTIg5eIEPtvFbskaFcmmIUnk=
32+
github.com/aws/smithy-go v1.24.0/go.mod h1:LEj2LM3rBRQJxPZTB4KuzZkaZYnZPnvgIhb4pu07mx0=
133
github.com/bytedance/sonic v1.14.0 h1:/OfKt8HFw0kh2rj8N0F6C/qPGRESq0BbaNZgcNXXzQQ=
234
github.com/bytedance/sonic v1.14.0/go.mod h1:WoEbx8WTcFJfzCe0hbmyTGrfjt8PzNEBdxlNUO24NhA=
335
github.com/bytedance/sonic/loader v0.3.0 h1:dskwH8edlzNMctoruo8FPTJDF3vLtDT0sXZwvZJyqeA=
@@ -28,6 +60,8 @@ github.com/goccy/go-yaml v1.18.0/go.mod h1:XBurs7gK8ATbW4ZPGKgcbrY1Br56PdM69F7Lk
2860
github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
2961
github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=
3062
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
63+
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
64+
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
3165
github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=
3266
github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
3367
github.com/klauspost/cpuid/v2 v2.3.0 h1:S4CRMLnYUhGeDFDqkGriYKdfoFlDnMtqTiI/sFzhA9Y=

internal/api/handler.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,9 @@ type Handler struct {
1414
router *gin.Engine
1515
}
1616

17-
func NewHandler() *Handler {
17+
func NewHandler(eventService *service.EventService) *Handler {
1818
h := &Handler{
19-
eventService: service.NewEventService(),
19+
eventService: eventService,
2020
router: gin.Default(),
2121
}
2222

0 commit comments

Comments
 (0)