@elysiumjs/moirai-细雨
用于 @elysiumjs/moirai,通过 Drizzle ORM 和 @elysiumjs/mnemosyne-drizzle。他们在动作的交易中写入,所以一个一能记录,发包行和存储的事件都会与数据一起执行.
安装
bun add @elysiumjs/moirai @elysiumjs/moirai-drizzle @elysiumjs/mnemosyne-drizzle
表格
import { moiraiTables } from '@elysiumjs/moirai-drizzle';
// In the Drizzle schema, so that migration:generate creates them.
export const billing = moiraiTables('billing');
moiraiTables(schema?, options?) 构建 idempotency_keys, (中文(简体) ), outbox, (中文(简体) ), inbox, (中文(简体) ), events 财务报告和审定财务报表 projections 表格,在一个 Postgress 中,当给出(例如,每个域名的一组表格).
与 { partitioned: true }, (中文(简体) ), events 按区域分隔 occurred_at 财务报告和审定财务报表 outbox 按范围 created_at然后,它们的主要和独特的键包括该列,以及 migration:generate 以 PARTITION BY RANGE。分区由应用程序决定:在迁移钩中创建它们,或者将其添加到创建表格的迁移中 DrizzleTable.afterCreate() 从 @elysiumjs/mnemosyne-drizzle数字 :
import { DrizzleTable } from '@elysiumjs/mnemosyne-drizzle';
const tables = moiraiTables('billing', { partitioned: true });
export const billing = {
...tables,
events: DrizzleTable.define(
DrizzleTable.afterCreate(
({ qualified }) => `CREATE TABLE "billing"."events_default" PARTITION OF ${qualified} DEFAULT`
)
)(tables.events)
};
存储
import { MoiraiModule } from '@elysiumjs/moirai';
import {
DrizzleEventStore,
DrizzleIdempotencyStore,
DrizzleInboxStore,
DrizzleOutboxStore,
DrizzleProjectionStorage,
PgAdvisoryLock
} from '@elysiumjs/moirai-drizzle';
MoiraiModule.with({
idempotency: () => new DrizzleIdempotencyStore({ table: billing.idempotencyKeys }),
outbox: () => new DrizzleOutboxStore({ table: billing.outbox }),
inbox: () => new DrizzleInboxStore({ table: billing.inbox }),
lock: () => new PgAdvisoryLock(),
events: () => new DrizzleEventStore({ table: billing.events }),
projections: () => new DrizzleProjectionStorage({ table: billing.projections })
});
DrizzleIdempotencyStore保持每个键的一能动作的反应.DrizzleOutboxStore索赔到期行FOR UPDATE SKIP LOCKED,这样几个接力就永远不走同一行.DrizzleInboxStore记录消费者处理的信息.DrizzleEventStore保留集合的事件流。 一个附件锁定它用一个交易咨询锁所写的每条流,并检查该流在第一个附加版本之前就结束,所以一个 stale 写手得到一个ConcurrencyConflictError即使表格中唯一的密钥跨出更多的列,例如分区密钥。 Postgres 给每个事件position和写它的交易的id(transaction_id) (中文(简体) ).DrizzleProjectionStorage重排表格models预测DrizzleModels 或 Drizzle 表格)与DELETE在重建的交易中,所以读者可以看到行直到它承诺,并且保留每个投影都是用它构建的版本.PgAdvisoryLock序列化共享 a 的动作serializeBy键,带有交易咨询锁.
每家店都卖 connection,默认为 default一个商店 table 需要匹配表格中的列 moiraiTables,并可能添加: 它可以生活在一个域自己的 pgSchema 并有另一个主要钥匙,如复合钥匙. StoreTable<T> 是它接受的类型.