kinda slow, even with an unlogged consumer group table
parent
24de57aba0
commit
c16f222e84
|
|
@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue