满足个性化需求
随着系统的深度使用,产品进行快速迭代以满足租户新的需求,随之会出现与产品规划不一致的需求,甚至会出现不同租户对同一场景提出不同解决方案的情况。这些需求有的差异较小,有的差异很大,有的可能存在全面个性化的情况。下面我们来分别讨论一下相关的设计。
使用特性开关
对于差异较少的需求,可以使用针对租户的特性开关来满足。这种场景下,业务模型、数据模型是一致的,但交互流程或业务流程不一样,可能会影响到前后端的设计。
特性开关和业务参数有时候难以界定,建议从配置影响的层面来判断,如果配置影响的是业务流程中的计算或逻辑,对业务处理来说不可或缺,则为业务参数,例如“折扣比例”;如果配置影响的是同一业务场景的不同处理流程,可以只保留其中一种流程的,则为特性开关,例如“使用折扣模板”。
-
特性开关按租户进行配置,比如有A、B两种模式,租户1使用A模式、租户2使用B模式,需要特别注意新租户默认值的设计。
-
需要处理好性能和异常,随着特性开关的增多,需要考虑开关的缓存,避免开关的查询成为瓶颈;同时需要考虑查询特性开关异常时,是使用默认值进行处理,还是提示系统不可用。
-
针对特性开关进行高内聚设计,特性开关存在一定的生命周期,当需要收敛或去掉开关时,可以安全快速的进行代码调整。比如经过一段时间的验证,发现某个场景已形成了固定的方案,不需要其他的模式,则需要删除其他模式的代码以简化系统的逻辑,降低迭代成本。
后端高内聚设计可以考虑工厂/抽象工厂/模板方法等设计模式,尽量避免到处写if-else,便于代码理解和维护。
前端可以使用模块化的设计,根据开关加载不同的模块,或者使用不同的页面。
-
为特性开关制作管理界面,当服务人员(400)解答客户问题,或开发人员排查问题时,需要知道具体特性的开关情况。同时在按客户要求调整开关时,没有工具支撑时需要修改数据库(有的不仅是开关值,还有其他参数和数据调整)还要处理对应的缓存,不仅占用研发资源,而且容易出错,也不方便变更的追溯和审计;使用管理界面可以使用代码、操作日志较好的解决相关问题,服务人员可以直接根据客户要求进行调整。
-
探索性设计可基于特性开关进行灰度开放,某些探索性的设计,可以先开放给少量的租户进行验证,成功的话转为正式功能,否则删除灰度功能或者保留多种模式,其生命周期如下:
使用规则引擎
某些场景下可能存在多个条件的组合判断,不同的租户有不同的组合,此时需要转换为使用规则引擎。可以由租户自己设定规则条件,最后达到一个业务结论。在这种场景下,大的业务模型依然是一致的,只是某个业务逻辑的判断被参数化了。
零代码设计器
某些业务场景用户交互的个性化的需求特别复杂和强烈,例如产品展示、线上活动等场景,这时候需要支持前端界面布局、样式、交互等方面更灵活的设置。还有一类是在ToB行业中常见的需求扩展业务字段的场景,比如系统默认收集的用户信息字段对租户来说不够,但每个租户要的字段有差异,部分字段可能含义一样,但名称不一样或反之同名含义不同。这些情况一般可以使用零代码设计器来解决。
零代码设计器有很多实现方式,也有很多开源的项目。整体来说要支撑一个商用的零代码设计器,还是需要投入较大的成本的。所以在选型时需要充分考虑业务需求、团队情况、未来规划。零代码设计器在实现在有基于元数据的,也有基于代码生成的。对于SaaS的场景,建议使用基于元数据的方案(有的元数据方案最终也可生成代码),有利于通过解析引擎统一变更系统逻辑。
下面我们主要讨论一下不同的业务场景针对零代码设计器的要求,以及对应的方案建议:
- 界面个性化:业务需求主要是界面展示和交互的个性化,可以考虑以业务组件为主的解决方案。每个业务组件都有展示设计以及对应的业务参数设置,组件对应的数据处理逻辑是固定的。
- 界面个性化+业务规则设置:像活动类的场景,前端活动、小游戏的交互由设计器完成,后端则通过规则引擎来确定活动的规则(例如优惠券、积分发放等)
- 扩展字段:对于需要扩展字段的业务表,可以考虑在表中预留扩展字段,再加元数据进行解释的方法。元数据负责字段在前端的展示、数据的存取映射、数据清洗时的解释等功能,相关的设计网上也有较多的参考。另外还有使用行转列、非关系型数据库(如MongoDB)等方案,可以根据系统性能要求、自身技术情况进行考虑。
开放接口和事件
当租户需要将SaaS中运行的业务和其他业务进行集成时,就需要SaaS系统具有一定的开放能力。SaaS系统的开放有很强的平台特征,所以大体上可以参考微信公众平台的设计。如果有生态合作伙伴,也可以参考微信第三方平台的设计。在设计上我们需要强调以下几点:
- 注意租户隔离:不管开放接口和事件采用的是哪种访问验证方案,和多租户访问设计一样,需要在验证时绑定租户,避免租户通过接口访问或操作其他租户的数据;
- 对开放统一建设、统一管理:对于一个系统来说,对外需要具有统一的实现方式和文档提供方式,SaaS一般都会提供在线的开放文档,因此需要有一个统一的门户来呈现开放的内容。避免不同团队采用不同的认证方式,或提供不同的接入方式。因此开放从规范、开放基础代码、标准出入参格式、错误代码、对外SDK等方面都需要进行统一。
- 注意安全和性能:由于外部使用的不可控性,需要加强完全设计,避免认证、提权等漏洞。需要对接口进行必要的兜底限流策略。
- 为接口提供版本机制:由于租户主要是B端用户,其系统很可能是其他供应商提供的,在集成后如果接口有变更,需要预留较长的时间来进行版本切换。原则上接口需要向后兼容(兼容原来的调用),由于业务模型的变更等原因,确实没有办法兼容的,需要提前规则好切换周期,并和租户沟通。从这一点来说,
- 开放要保持克制:尽量只开放成熟,设计清晰的业务领域,避免业务模型变化导致接口不兼容,由于租户切换接口版本的周期影响整个系统的迭代速度。