prefect server in zig
1# services
2
3background workers managed by `services.zig`.
4
5## registry
6
7simple array of function pointers:
8
9```zig
10pub const Service = struct {
11 name: []const u8,
12 start: *const fn () anyerror!void,
13 stop: *const fn () void,
14};
15
16const all = [_]Service{
17 .{ .name = "event_persister", .start = event_persister.start, .stop = event_persister.stop },
18 .{ .name = "event_broadcaster", .start = event_broadcaster.start, .stop = event_broadcaster.stop },
19};
20```
21
22`startAll()` iterates forward, `stopAll()` iterates reverse.
23
24## event_persister
25
26subscribes to broker topic "events" with consumer group "event-persister".
27
28- batch size: 100 events
29- flush interval: 1 second
30- deduplication: `INSERT OR IGNORE` by event id
31- retention: 7 days, trimmed hourly
32
33lifecycle: spawns worker thread on `start()`, signals and joins on `stop()`.
34
35## event_broadcaster
36
37subscribes to broker topic "events" with ephemeral consumer group (unique per server).
38fans out events to connected WS subscribers on `/api/events/out`.
39
40- subscriber capacity: 256 connections
41- filter support: event prefix, resource_id (parsed with std.json)
42- drop policy: non-blocking writes, slow clients get disconnected
43
44see `src/services/CLAUDE.md` for event flow details.