最近一年,有幸架构一个CRM Saas 系统,上线了几个月来,各方面都比满意。整个系统创建过程,踩了很多坑,收获也比较多。总结一下Saas系统架构一些特点;
1.分层设计Saas系统分层大概是:
租户识别;应用层;数据访问层;缓存层;数据库业务代码都是写在应用层。租户识别可以用Spring拦截器实现,然后使用ThreadLocal传递给后端数据库和缓存层对应用层应该是透明的。程序员在写代码的时候,只关心业务逻辑,不应该担心多租户的问题。
2.数据隔离要透明Saas系统说起来很简单,任何系统似乎加个tenantid(租户id)就变成Saas系统了。比如原来的用户登录是:
对于复杂业务的saas系统,这样做法非常危险,而且开发效率很低。你想想如果那个程序员写sql时候忘了加 “ and tenant_id =1” . 结果不堪设想。比较好做法是在数据库访问层对SQL进行改写。在连接池根据TenatnContext改写Sql. 这样做好处是,一来程序猿最多把系统搞down了,也不至于信息串了互相泄露。二来将来做分表分库也很方便,上层应用不用修改。
3. 租户识别方案比较好做法是通过url识别租户。系统是给租户生成一个随机的三级域名,比如 abc.crm.baidu.com. 如果客户想使用自己的域名,可以在cname到我们生成的三级域名,并在管理系统里面做绑定。这样一个租户可以有两个域名,访问Saas,一个随机生成的三级域名,另外一个租户自己的域名.代码里面可以根据过来的域名,判断是那个租户然后初始化TenantContext.如果不想通过域名来做,也可以通过登录名来判断。这种方式要涉及到租户切换问题。
4. 智能DNS智能DNS其实就是现在很类似的CDN的概念,同时也会根据用户不同的网络运营商,返回响应的线路IP。
5. 租户管理系统(计费,订购,定制,充值,催缴)Saas系统是必须考虑计费系统和租户控制系统。这个系统需要都是独立设计。比如那个租户购买了那些模块,一个月多少钱。租户可以创建最多的用户数。计费到期邮件提醒等功能。计费方式一般有两种,周期性计费,类似月租方案,和使用量计费,用多少付多少。 周期性计费比较简单。也可以两者结合起来。
6. 定制化开发Saas的优势在于一套系统多人使用,似乎和定制化开发有冲突。比如A客户想要A功能,B客户不想要。但定制化开发是无法避免的,比如CRM系统这样复杂的系统,不可能一套系统满足所有公司的要求。定制化开发尽可能分系统,分模块去做。然后通过控制台中配置不同租户订购不同模块,那些模块可以在前端页面上显示。不同的子系统需要分开部署。前端可通过nginx根据url分发,比如 abc.crm.baidu.com/bi/xxx/xx这个地址,就分发到BI子系统。不要尝试OSGI去搞模块化,这个是个大坑。还有开发和产品,现有需求一定要分析清楚,不要一上线发现后患无穷。新功能尽量做的独立可以配置。
7. 灰度升级Saas付费企业客户对系统问题都特别敏感。 为了减少升级可能出现问题的影响范围,一般都采用灰度升级策略。如果使用了url来区分不同租户,灰度升级配置就会很方便。可以配置nginx 来根据域名做分发,比如租户A(aaa.com)到实例1(版本1.0),租户B(bbb.com)到实例2(版本). 当需要域名配置非常多的时候,nginx配置文档会乱。这块时候可以考虑使用nignx_lua来写一些扩展模块。
5年SaaS运营总结的5点经验:
不是“高科技公司”而是“让顾客感觉真棒”的公司
顾客不会因为你有精湛的编程水平、会做Nginx配置等而掏腰包购买产品,但如果你卖给他们的产品能为他们节约时间、金钱、精力,那么他们将会很乐意支付购买。你的工作就是为了让客户的生活和工作变得令人刮目相看,所以对于产品和业务的每一个决定都应该紧紧围绕这一目的。
不要承诺特性的发布时间
在这一点上请相信我,不要对产品某项特性的发布承诺发布时间。当某个特性准备好时,人们会问你所有的时间表。回答这种问题最好的途径就是(如果你准备回答的话):“在未来的版本里我们会考虑这样的功能特性,但我目前给不出一个确切的时间点什么时候准备好。”也就是说对消费者要诚实——如果你自己都不知道什么时候“Ready”。
在能帮你保持高效的方面投资
这方面指的是能明显看出收效的一些投资,比如一台好用的笔记本电脑(经常升级)、舒适的桌子和座椅等,以及其他一些看起来似乎没那么明显能带来高效的投资,包括一些软件,能让你集中精力开发应用程序功能而不是单纯地只做服务器配置。
切勿工作过载
让自己过载工作其实是业务向失败迈出的第一步,因为满负荷的时候你不会有好的状态。比如晚上就坚决不要去查收邮件,如果你的团队只有1~2人,那也不需要提供7×24的支持,客户会理解的。你开公司不是为了力竭而亡的,你的健康、家庭和社会生活比起5分钟的支持响应、100%的运行正常应该更重要。
不要相信炒作
人们很容易变得兴奋,也很擅长对新技术、架构、编程语言以及配置方式进行天花乱坠的宣传,可能会告诉你该做什么、怎么计划,其实你应该扩展到百万用户来评估。事实是应该务实些——你的目标是经营业务,用相对成熟的技术。而且你需要做必要的优化,这包括编写少的代码、更广的测试覆盖以及集中精力做事,才能做好企业的长期盈利。