Search code examples
couchrest

Recommended use of couchrest model in a multi-tenant app


I'm looking for recommendations on how to implement multi-tenancy with couchrest model in a rails app. For my multi-tenant app, I'm thinking of two options:

{ edit - removed my ugly options because they'll only confuse future readers }

I would like this to work well with 10K users.

SOLUTION: Based on Sam's advice, here's what I did and it's working well - In my case, I needed to override the proxy_database method because the standard naming for proxy databases didn't match my naming.

created the master

class Site < CouchRest::Model::Base
  property :name
  property :slug

  proxy_for :users
  proxy_for ...(all the other multi-tenant models)

  # Databases are on same server in this example
  def proxy_database
    @db ||= self.server.database!(slug)
  end

end

Then in each multi-tenant model

class User < CouchRest::Model::Base
  ...
  proxied_by :site

In ApplicationHelper create a 'site' method that you can reuse in all your controllers.

  module ApplicationHelper

  def site
    db_name = current_user.db_name
    @site ||= Site.create(slug: "#{db_name}_#{Rails.env}" )
  end

Then controller might do something like:

 def show
    user = site.users.find(params[:id])
    render :json => user
  end

Solution

  • You might want to checkout the Proxying feature of CouchRest Model for this. More details can be found here:

    http://www.couchrest.info/model/proxying.html

    Although I have no personal experience, I understand that CouchDB handles >10k databases. Here is a good thread of ways of scaling the number of users:

    http://comments.gmane.org/gmane.comp.db.couchdb.user/13862

    A few considerations to take into account when dealing with lots of databases:

    • File system sub-directory count, not a problem with Ext4.
    • Namespace databases to split between sub-directories and/or servers.
    • System open file limit. Usually around 10k. Probably fine if not all databases are accessed at the same time.

    Hope that helps.