All articles
Contents

    Multitenancy in CUBA with Citus

    @TenantId
    @Column(name = "TENANT_ID")

    protected String tenantId;
    @NotNull
    @Column(name = "IDENTIFICATION_NUMBER", nullable = false)
    protected String identificationNumber;

    @OneToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "TYPE_ID")
    protected PetType petType;

    SELECT * from master_add_node('localhost', 9701);
    SELECT * from master_add_node('localhost', 9702);

    SET citus.replication_model = 'streaming';

    The good thing is that you can develop an application on the local “ordinary” PostgreSQL most of the time and add Citus-specific table creation scripts only before deploying to the staging or production (if you are brave enough not to use staging) environment. The only thing that changes is the database address - instead of the dev local database, you need to specify the Citus cluster coordinator database address.

    As for the database creation and update, you need to specify distributed tables explicitly (table name and partition column) like this:

    SELECT create_distributed_table('petclinic_vet', 'tenant_id');
    SELECT create_distributed_table('petclinic_owner', 'tenant_id');
    SELECT create_distributed_table('petclinic_pet', 'tenant_id');
    SELECT create_distributed_table('petclinic_visit', 'tenant_id');
    

    And a similar process should be applied for the reference tables:

    SELECT create_reference_table('petclinic_specialty');
    SELECT create_reference_table('petclinic_vet_specialty_link');
    SELECT create_reference_table('petclinic_pet_type');
    

    In order to improve performance, you can add table colocation in addition to partitioning. But from the CUBA side - you don’t need to change anything, multi-tenancy is an absolutely transparent process.

    That’s it. With the minimum efforts, we can scale the PetClinic application horizontally and use multi-tenancy on the database level, too. All the complexity is hidden in the framework and Citus plugin.

    Conclusion

    Creating multi-tenant applications might be a challenging job. You should consider all options before starting implementing such an approach. And technology is only one part of the equation: you need to consider license costs, cloud services tariffs, maintainability, scalability, etc. Nowadays, the PaaS model along with containerization and proper DevOps processes looks more appealing than “traditional” multi-tenant architecture, but demand on such applications is still noticeable.

    If you decide to go forward with multi-tenancy, ensure that your application meets all security requirements, e.g. GDPR, HIPAA, etc. Some of them may explicitly prohibit storing data in the same database, so you’ll need to use a “separate database” approach to satisfy those requirements.

    And remember that tools matter. Proper development frameworks and data management systems that support multi-tenancy architecture out of the box may greatly simplify development and prevent a lot of typical issues connected with multi-tenancy architecture.

    Jmix is an open-source platform for building enterprise applications in Java