<Home>
← JournalEngineering · 3 min read

A small platform needs limits

Queues, log windows and background work all consume the server you brought. Bounded work is part of the product.

AN ORIGINAL HAKOPOD ILLUSTRATION

A log collector uses the same memory, disk and CPU that your applications need. Without limits on collection and retention, a burst of traffic can exhaust the server. Notification queues and other background tasks need limits for the same reason.

Add a workflow before adding a system

Hakopod keeps its Go API and reconciler together by default, with PostgreSQL holding accepted operations and history. Newer features follow that existing shape where it fits.

Deployment notifications use a durable outbox: pending messages are stored in the database until a worker attempts delivery. Requests collects managed ingress logs into PostgreSQL. These choices avoid introducing a separate queue service or logging database just to support the first version of a workflow.

Fewer processes do not automatically mean low resource use. Queries, buffers, retained records and concurrency still need limits. “It runs in the existing process” is an architectural fact, not a memory benchmark.

Make the bounds visible

Requests retains at most 24 hours and the newest 100,000 records across an installation. Collection has work and time limits. Notifications have bounded retry attempts, a delivery deadline and a capped pending queue.

Those boundaries have consequences. A busy request log can have a shorter history. Bursts or downtime can leave collection gaps. A full notification queue can skip delivery work instead of blocking the rollout.

An interface should expose these limits where they change the meaning of the data. A count on one page is not the installation’s traffic rate. An empty recent log is not proof that no requests arrived. A queued notification is not proof of delivery.

Decide what you need to retain elsewhere

A bounded operational view is often enough to answer “what just failed?” It is not automatically enough for long-term analysis, compliance or billing.

If your work requires a complete archive, design and verify that separately. Decide the retention period, failure behavior and recovery path before relying on it. Keep billing and audit records in a system designed to retain them.

The same restraint applies to capacity claims. We can describe the processes and the limits they enforce. We should not promise an idle memory footprint for your server without measuring the configuration you actually run.

Read the Requests limits and notification behavior when sizing an installation.

Have a use case we should understand?Share it on GitHub ↗

Keep exploring.

All stories↗
Engineering / 7 min read

How we made our Next.js Docker build about 40% faster

Our Next.js production image built in 8m43s on a fresh spot VM runner. Three workflow changes brought it to 5m18s. Here is what we changed, with the YAML.

Read the story↗
Engineering / 4 min read

What MyDuck’s two SQL protocols actually mean

How one DuckDB database serves MySQL and PostgreSQL clients, where compatibility stops, and what the managed release does and does not provide.

Read the story↗