ASP.NET Core + SaasKit + PostgreSQL + Citus 的多租户应用程序架构示例

本文介绍了如何使用ASP.NET Core、SaasKit和PostgreSQL+Citus构建一个多租户应用程序。首先,文章展示了如何设置数据库架构,包括创建`domains`和`questions`表,并对租户ID进行分片。然后,通过安装Npgsql.EntityFrameworkCore.PostgreSQL包,为ASP.NET Core项目添加Postgres支持。接着,引入SaasKit中间件以实现租户感知的请求管道。最后,通过更新视图和控制器,展示如何查询和显示特定租户的数据。
摘要由CSDN通过智能技术生成

image

确定分布策略 中,
我们讨论了在多租户用例中使用 Citus 所需的与框架无关的数据库更改。
当前部分研究如何构建与 Citus 存储后端一起使用的多租户 ASP.NET 应用程序。

示例应用

为了使这个迁移部分具体化,
让我们考虑一个简化版本的 StackExchange。
供参考,最终结果存在于 Github 上。

Schema

我们将从两张表开始:

CREATE TABLE tenants (
        id uuid NOT NULL,
        domain text NOT NULL,
        name text NOT NULL,
        description text NOT NULL,
        created_at timestamptz NOT NULL,
        updated_at timestamptz NOT NULL
    );

    CREATE TABLE questions (
        id uuid NOT NULL,
        tenant_id uuid NOT NULL,
        title text NOT NULL,
        votes int NOT NULL,
        created_at timestamptz NOT NULL,
        updated_at timestamptz NOT NULL
    );

    ALTER TABLE tenants ADD PRIMARY KEY (id);
    ALTER TABLE questions ADD PRIMARY KEY (id, tenant_id);

我们 demo 应用程序的每个租户都将通过不同的域名进行连接。
ASP.NET Core 将检查传入请求并在 tenants 表中查找域。
您还可以按子域(或您想要的任何其他 scheme)查找租户。

注意 tenant_id 是如何存储在 questions 表中的。
这将使 :ref:colocate <colocation> 数据成为可能。
创建表后,使用 create_distributed table 告诉 Citus 对租户 ID 进行分片:

SELECT create_distributed_table('tenants', 'id');
    SELECT create_distributed_table('questions', 'tenant_id');

接下来包括一些测试数据。

INSERT INTO tenants VALUES (
        'c620f7ec-6b49-41e0-9913-08cfe81199af', 
        'bufferoverflow.local',
        'Buffer Overflow',
        'Ask anything code-related!',
        now(),
        now());

    INSERT INTO tenants VALUES (
        'b8a83a82-bb41-4bb3-bfaa-e923faab2ca4', 
        'dboverflow.local',
        'Database Questions',
        'Figure out why your connection string is broken.',
        now(),
        now());

    INSERT INTO questions VALUES (
        '347b7041-b421-4dc9-9e10-c64b8847fedf',
        'c620f7ec-6b49-41e0-9913-08cfe81199af',
        'How do you build apps in ASP.NET Core?',
        1,
        now(),
        now());

    INSERT INTO questions VALUES (
        'a47ffcd2-635a-496e-8c65-c1cab53702a7',
        'b8a83a82-bb41-4bb3-bfaa-e923faab2ca4',
        'Using postgresql for multitenant data?',
        2,
        now(),
        now());

这样就完成了数据库结构和示例数据。 我们现在可以继续设置 ASP.NET Core。

ASP.NET Core 项目

如果您没有安装 ASP.NET Core,请安装

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值