kinda slow, even with an unlogged consumer group table

main
Bel LaPointe 2025-12-10 13:40:23 -07:00
parent 24de57aba0
commit c16f222e84
1 changed files with 51 additions and 11 deletions

View File

@ -8,6 +8,7 @@ import (
"fmt" "fmt"
"log" "log"
"os" "os"
"sync/atomic"
"time" "time"
"pg/src/with" "pg/src/with"
@ -31,8 +32,7 @@ func run(ctx context.Context) error {
return with.PSQL(ctx, *c, func(pg *sql.DB) error { return with.PSQL(ctx, *c, func(pg *sql.DB) error {
log.Println("setup...") log.Println("setup...")
if _, err := pg.ExecContext(ctx, ` if _, err := pg.ExecContext(ctx, `
DROP SCHEMA "pubsub" CASCADE; DROP SCHEMA IF EXISTS "pubsub" CASCADE;
CREATE SCHEMA IF NOT EXISTS "pubsub"; CREATE SCHEMA IF NOT EXISTS "pubsub";
CREATE TABLE IF NOT EXISTS "pubsub".topic ( CREATE TABLE IF NOT EXISTS "pubsub".topic (
@ -50,7 +50,7 @@ func run(ctx context.Context) error {
name TEXT UNIQUE name TEXT UNIQUE
); );
CREATE TABLE IF NOT EXISTS "pubsub".group_topic_partition_offset ( CREATE UNLOGGED TABLE IF NOT EXISTS "pubsub".group_topic_partition_offset (
group_name TEXT REFERENCES "pubsub".group(name) ON DELETE CASCADE, group_name TEXT REFERENCES "pubsub".group(name) ON DELETE CASCADE,
topic_name TEXT REFERENCES "pubsub".topic(name) ON DELETE CASCADE, topic_name TEXT REFERENCES "pubsub".topic(name) ON DELETE CASCADE,
partition INTEGER NOT NULL DEFAULT 0, partition INTEGER NOT NULL DEFAULT 0,
@ -68,13 +68,34 @@ func run(ctx context.Context) error {
CREATE TABLE IF NOT EXISTS "pubsub".data_0 CREATE TABLE IF NOT EXISTS "pubsub".data_0
PARTITION OF "pubsub".data PARTITION OF "pubsub".data
FOR VALUES WITH (modulus 3, remainder 0); FOR VALUES WITH (modulus 10, remainder 0);
CREATE TABLE IF NOT EXISTS "pubsub".data_1 CREATE TABLE IF NOT EXISTS "pubsub".data_1
PARTITION OF "pubsub".data PARTITION OF "pubsub".data
FOR VALUES WITH (modulus 3, remainder 1); FOR VALUES WITH (modulus 10, remainder 1);
CREATE TABLE IF NOT EXISTS "pubsub".data_2 CREATE TABLE IF NOT EXISTS "pubsub".data_2
PARTITION OF "pubsub".data PARTITION OF "pubsub".data
FOR VALUES WITH (modulus 3, remainder 2); FOR VALUES WITH (modulus 10, remainder 2);
CREATE TABLE IF NOT EXISTS "pubsub".data_3
PARTITION OF "pubsub".data
FOR VALUES WITH (modulus 10, remainder 3);
CREATE TABLE IF NOT EXISTS "pubsub".data_4
PARTITION OF "pubsub".data
FOR VALUES WITH (modulus 10, remainder 4);
CREATE TABLE IF NOT EXISTS "pubsub".data_5
PARTITION OF "pubsub".data
FOR VALUES WITH (modulus 10, remainder 5);
CREATE TABLE IF NOT EXISTS "pubsub".data_6
PARTITION OF "pubsub".data
FOR VALUES WITH (modulus 10, remainder 6);
CREATE TABLE IF NOT EXISTS "pubsub".data_7
PARTITION OF "pubsub".data
FOR VALUES WITH (modulus 10, remainder 7);
CREATE TABLE IF NOT EXISTS "pubsub".data_8
PARTITION OF "pubsub".data
FOR VALUES WITH (modulus 10, remainder 8);
CREATE TABLE IF NOT EXISTS "pubsub".data_9
PARTITION OF "pubsub".data
FOR VALUES WITH (modulus 10, remainder 9);
`); err != nil { `); err != nil {
return err return err
} }
@ -183,30 +204,49 @@ func run(ctx context.Context) error {
return err return err
} }
go with.Every(ctx, 100*time.Millisecond, func() { started := time.Now()
var pubs atomic.Uint64
var subs atomic.Uint64
var lastCommit string
go with.Every(ctx, 2*time.Second, func() {
pubs := pubs.Load()
subs := subs.Load()
seconds := uint64(time.Since(started).Seconds())
if seconds == 0 {
seconds = 1
}
log.Printf("pubbed %v per second (%v), subbed %v per second (%v) over %vs, last committed %s",
pubs/seconds, pubs,
subs/seconds, subs,
seconds, lastCommit,
)
})
go with.Every(ctx, 1, func() {
for i := 0; i < 2; i++ { for i := 0; i < 2; i++ {
topic := fmt.Sprintf("topic_%d", i) topic := fmt.Sprintf("topic_%d", i)
if err := pub(topic, 1); err != nil { if err := pub(topic, 1); err != nil {
log.Printf("failed pub: %v", err) log.Printf("failed pub: %v", err)
} else { } else {
log.Printf("pubbed") pubs.Add(1)
} }
} }
}) })
with.Every(ctx, time.Second, func() { with.Every(ctx, 1, func() {
if err := func() error { if err := func() error {
for i := 0; i < 2; i++ { for i := 0; i < 2; i++ {
topic := fmt.Sprintf("topic_%d", i) topic := fmt.Sprintf("topic_%d", i)
for j := 0; j < 2; j++ { for j := 0; j < 2; j++ {
group := fmt.Sprintf("group_%d", i) group := fmt.Sprintf("group_%d", i)
if partition, offset, v, err := sub(topic, group); err != nil { if partition, offset, _, err := sub(topic, group); err != nil {
return fmt.Errorf("failed sub: %w", err) return fmt.Errorf("failed sub: %w", err)
} else if partition == -1 { } else if partition == -1 {
} else if err := commit(topic, group, partition, offset); err != nil { } else if err := commit(topic, group, partition, offset); err != nil {
return fmt.Errorf("failed commit: %w", err) return fmt.Errorf("failed commit: %w", err)
} else { } else {
log.Printf("committed %s/%s/%d offset %d: %v", topic, group, partition, offset, v) subs.Add(1)
lastCommit = fmt.Sprintf("%s/%s/%d@%d", topic, group, partition, offset)
} }
} }
} }