【问题标题】:How can I handle multiple users|data in an app?如何在一个应用程序中处理多个用户|数据?
【发布时间】:2016-01-23 02:32:56
【问题描述】:

如何处理寻求成为软件即服务的应用程序的实例?我想做一个可以处理医生病人,病人可以轻松咨询的应用程序。

我的问题是关于如何处理不同的医生和他们的客户,以便将来可以扩展应用程序,并且医生的客户不会与数据库中的其他医生客户混合。

有没有办法分离应用程序的实例来处理这个问题,由医生使用单独的数据库?

我可以用 ruby​​ on rails 完成这个吗?

最好的方法是什么?,我不知道,我对这个问题有点迷茫。

干杯

【问题讨论】:

标签: ruby-on-rails ruby


【解决方案1】:

第一步是不要担心。合理的数据库配置将允许您在考虑对数据或应用程序进行分片之前处理包含数百万行的表。在达到这一点之前,您将遇到许多其他限制您的规模的瓶颈。首先将时间和精力花在这些(以及与实际用户一起构建产品)上,避免过早优化以解决您没有的性能问题。

一旦您确实需要考虑分片,您绝对可以选择 Rails 应用程序(https://blog.engineyard.com/2009/a-quick-primer-on-sharding-for-ruby-on-rails 是一个很好的介绍)。在设计应用程序和数据模式时牢记分片也会有所帮助。寻找会阻止您将用户集群及其数据相互隔离的依赖关系。当您确实有共享依赖项时,请寻找机会提取可以独立于系统其余部分扩展的服务。

在数据库级别,我认为https://github.com/thiagopradi/octopus 是最流行的对 Active Record 模型进行分片的方法之一,但肯定不是 Rails 应用程序的唯一选择。

【讨论】:

  • 当前的问题不是共享,而是多租户。
  • @MichalSzyndel 多租户也可能是一个问题,但在我看来,这个问题是关于数据隔离和水平扩展的问题。考虑到问题的内容,我不清楚在这种情况下哪个更相关。如果您对多线程作为解决方案有想法,请添加答案。
【解决方案2】:

由于你的问题很广泛,我必须相应地回答。

--

你要问的是一个叫做"multi tenancy"的东西:

软件多租户是指一种软件架构,其中软件的单个实例在服务器上运行并为多个租户提供服务。租户是一组用户,他们共享对软件实例具有特定权限的公共访问权限。

这绝对是开发团队的领域;你需要几个组件才能让它工作,Rails 并没有真正配备。

话虽如此,有一种流行的方法可以通过ApartmentPGSQL schemas 实现它。

--

真正的多租户应该有独立的计算配置,有自己的资源和数据池; Rails 只能在一台服务器上运行 - 无需大规模黑客攻击 - 一个数据库。

如果您想创建一个单独处理医生的系统,您需要查看范围您的数据。这就是 PGSQL 模式的作用:

#config/routes.rb
scope constraints: SubDomain do
   resources :patients
end

#lib/sub_domain.rb
module SubDomain
    def initializer(router)
        @router = router
    end

    def self.matches?(request)
        Doctor.exists? request.subdomain
    end
end

以上为您提供subdomains(范围界定的最基本级别),这将允许您使用以下内容:

#app/models/doctor.rb
class Doctor < ActiveRecord::Base
   has_many :patients
end

#app/models/patient.rb
class Patient < ActiveRecord::Base
   belongs_to :doctor
end

#app/controllers/patients_controller.rb
class PatientsController < ApplicationController
   before_action :set_doctor

   def index
      @patients = @doctor.patients
   end

   def show
      @patient = @doctor.patients.find params[:id]
   end

   private

   def set_doctor
      @doctor = Doctor.find request.subdomain
   end
end 

以上将允许您访问http://1.doctor.com/patients 以查看该医生的所有患者

#app/views/patients/index.html.erb
<% @patients.each do |patient| %>
   <%= patient.name %>
<% end %>

--

当然,以上只是一个初步的例子,没有数据库或应用程序级别的安全性来维护data integrity

多租户(使用 Rails)的主要挑战是创建尽可能防水的系统。

【讨论】:

    猜你喜欢
    • 2012-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-21
    • 2022-01-01
    • 2019-12-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多