iKonekt

面向集团与多品牌

多家公司,一套部署,客户互不共享

集团通常用两种糟糕的方式解决这个问题:要么五套独立部署、五套各自为政的一切,要么一套部署加上一个郑重承诺——应用程序永远会正确过滤。前者成本高昂。后者只是一个承诺,而承诺不是安全模型。

如果你经营着不止一家公司——一个拥有子公司的控股集团、一个特许经营体系、两个面向不同市场的品牌、一家代理机构和它孵化出的业务——你早已熟悉这个问题的模样。各品牌共享人员、工具和财务部门。它们不共享客户,而且绝不能看起来共享。

iKonekt 用一套部署运行所有公司,而公司之间的隔离由数据库而非代码来维持。这个区别听起来很学术,直到某一天它不再学术。

为什么这一层很重要

应用层的过滤只是查询里的一句话。它有效的前提是:今后写下的每一条查询都包含它——包括匆忙中写下的那条、新入职开发者写的那条,以及为一份只打算用一次的报告写的那条。

把边界推进数据库,算术就反转了。策略在每一次读写时运行,位于一切之下。一条忘记带公司条件的查询不会返回错误的行;它什么都不返回。故障模式变成一个空屏幕和一个困惑的开发者——这正是正确的故障模式。

空屏幕是一种特性。我们宁愿向自己的一位工程师解释一个空屏幕,也不愿向两位没料到会碰面的客户解释一份客户名单。

一套部署每家公司
  • 1客户 & 会话按公司隔离。品牌 A 的销售员无法触及品牌 B 的客户——这是由架构保证的,而不是靠配置。
  • 2对客户的认领“我们已经拥有这个账户”是一把按公司持有的锁——因此两个品牌可以在同一市场上各自运作而互不冲突。
  • 3提示词 & 设置每家公司编辑自己的。这里唯一一次被共享过的地方是个 bug,而这个系统最引以为豪的就是找到了它。
  • 4合作伙伴项目每家公司一个模块,而不是人人继承的全局模块。

边界在应用之下强制执行

集团真正能共享什么

隔离不是为了隔离而隔离。值得在集团内共享的东西是被有意共享的,而且大多是无趣的那些——这恰恰是对的,因为重复的成本正藏在这些无趣之处:

  • 一套部署,运行和更新。一次部署、一套需要保管的凭据、一件需要打补丁的东西。
  • 一支团队,戴着不同的帽子。一个人可以在多家公司工作;他不能做的,是通过一条忘记询问的查询同时看到两家。
  • 一套习惯。线索如何分配、备注如何书写、一项工作如何走到发票——学一次,处处适用,这让新员工上手缩短到大约一个上午。
  • 与家族其余部分的一种关系。底层是 castomAPI,同一个账户、同一批连接器——在重要的地方按公司分别配置。

集团总会问的第二个问题

“我们能跨所有公司做报表吗?”能——从集团自己的视角出发,有意且明确地进行,而不是作为边界泄漏的副作用。这个区别就是全部设计:跨越边界必须是一个人有意为之的行为,并且他拥有这样做的权限。它绝不能是一个游离的标识符偶然就能完成的事。

而他们问的第三个问题是:“如果我们卖掉其中一个品牌会怎样?”由数据库守护的边界,也是你能从中干净地取出一份副本的边界。这不是巧合——隔离与可移植性,是同一种性质在两场不同会议上的样子。

地板之下

具体是什么在守住这条线

不是一句宣称,而是一份清单。如果供应商拿不出关于自己产品的这份清单,那就值得留意。

26

数据表自带公司归属,校验是强制开启的,而不只是可用。

72

策略逐条写出,每一条都由真人读过,而不是循环批量生成。

942

测试:每次有任何变动,都在一个从零重建的数据库上运行。

0

默认公司。没有作用域的请求在触达数据之前就会抛出异常——不存在一个可能忘记关闭的回退机制。

隔离是如何构建的 →

“五家公司,五套安装,五张你的账单。”

一次安装。数据库为你守住的五道边界。

共享人员、共享习惯、共享平台——但没有一个共享的客户。跨越那条线必须是一个人有意的举动,绝不能是一个标识符被意外处理的结果。

隔离是如何构建的 →