线下活动 [Ruby Summit 2018 话题分享] 基于 Rails 的 SaaS 应用实践:Schemaless 和 Multi-Tenancy

flankerfc · 2018年10月25日 · 最后由 jasl 回复于 2018年10月25日 · 6632 次阅读

10 月 14 日参加了 @rocLv 组织的 Ruby Summit China 2018(郑州),并分享了这个话题。

Slides 发布到了这个: https://speakerdeck.com/fengzhichao/rails-based-saas-applications-schemaless-and-multi-tenancy-zhong-wen

视频在这里:https://ruby-china.org/topics/37647

本次分享本来是想总结一下金数据这几年来,使用 Ruby on Rails 在开发 SaaS 应用中,遇到的问题以及我们的解决方案。但是这样子 topic 太大了,并且会和其他讲师冲突(性能、运维、安全这些其他讲师有分享)。

所以最后集中到了两个点:

1,如何使用 Schemaless 模型,创建一个通用的动态表单/数据系统。

这个 其实 @jaslhttps://ruby-china.org/topics/33098 分享了类似的话题,有兴趣的同学可以两个结合着看 :)

2,如何使用 Multiple Tenancy 模型,将现有个人版升级为企业版。

Multi-Tenancy 大家可能都熟悉,这里主要会分享金数据当时遇到的挑战以及我们如何解决的。

~~~分割线~~~

金数据(https://jinshuju.net)在 @西安@成都 招聘 Ruby/Rails 工程师 以及 DevOps 工程师。有兴趣的同学可以和我们联系~

具体信息可见:

最近正好看到 salesforce 的架构介绍,估计 multi tenancy 的实现都是类似的

https://developer.salesforce.com/page/Multi_Tenant_Architecture

nouse 回复

只扫了眼图,感觉是通过数据库中间件或者是做在数据库层面上了,现在多租户有多数据库、数据库的内建做租户功能、应用层隔离。应用层隔离的轮子间也有实现差异。金数据这套应该是应用层面的多租户,可控性最好,缺点就是涉及数据库相关的操作代码要写对,不然会发生泄漏。其他层面的方案都有坑,太底层了解决起来麻烦

动态表单的数据库定义这块应该做法没太大差异,这块创新的空间感觉不大。

FormCore 主要集中在改善动态表单的开发体验上,没看视频,讲稿中对数据验证、嵌套表单(我觉得这个是一个比较麻烦的部分)似乎没涉及到

另外金数据使用 MongoDB,在存储上优势很大,不过持久化和索引也是个大话题

BTW:话说我看到有人 fork 了 FormCore 把 backend 改成 MongoDB,金数据要不要试试 😂

jasl 回复

是,应用层隔离比较灵活。通过 default_scope 保证隔离,任何 query 都会 merge 上 tenant filter。同时,重写了 unscoped 使得 tenant 无法被 scope 掉。 而且,应用层隔离后,和底层数据库隔离也不冲突。

flankerfc 回复

我有一个试验用的项目是需要租户的部分显式调 with_tenant(tenant) scope,控制器层的做法一样,写起来麻烦一些。

default_scope 就怕有的 gem 比如软删除,会覆盖 default_scope 的行为,出现泄露很难调试

jasl 回复

对于 Form 和 Entry(表单提交的数据),使用 MongoDB 确实优势很大。你的 Form#to_virtual_model 实现很赞。但是如果业务特别复杂的情况下,个人有感觉,实际用不用 virtual_model 其实差别并不是非常大,Ruby 本身的元编程能力要实现数据验证,方法会比较多。 话说回来,你的几个轮子合起来,几乎就是 SaaS 全家桶了。 :)

flankerfc 回复

对呀~~ 所以后来的几个轮子的标题就是“SaaS 快速开发套件” 😃

还差界面和部署

需要 登录 后方可回复, 如果你还没有账号请 注册新账号