Skip to content

Tenant-scoped sharding

Use manual capacity when you already know the number of shards and want every write to carry a tenant key.

Terminal window
import { backend } from "@layeron/core"
import { db, table, text, integer, rawSql } from "@layeron/modules"
const app = backend()
const database = db({
name: "main",
capacity: {
mode: "manual",
targetShardCount: 4,
},
sharding: {
tables: [
{ name: "posts", keyColumn: "tenantId" },
{ name: "comments", keyColumn: "tenantId" },
],
},
schema: {
posts: table({
id: text().primaryKey(),
tenantId: text().notNull().index(),
title: text().notNull(),
createdAt: integer().notNull().default(rawSql("(unixepoch())")),
}),
},
})
app.use(database)
app.post("/tenants/:tenantId/posts", async (request) => {
const pathSegments = new URL(request.url).pathname.split("/")
const tenantId = pathSegments[2]
const input = await request.json() as { title: string }
const id = crypto.randomUUID()
await database.sql({
statement: "insert into posts (id, tenantId, title) values (?, ?, ?)",
params: [id, tenantId, input.title],
shard: { table: "posts", key: tenantId },
}).run()
return Response.json({ id }, { status: 201 })
})