设想以“模型”为中心构建系统

184 阅读3分钟

Nextjs

深度使用nextjs后的感悟,发现nextjs这种以serverless为中心的设计复用的,以路由即页面

这样的问题是由于serverless缺少模型的信息,导致在业务逻辑就只能在前端UI的逻辑里面处理,同时在设计时,需要区分前端的状态和模型的字段

这导致的一个问题,设计书写一个完整功能是被分割成了3个地方:ER模型,serverless或前端处理逻辑,UI

在架构上就处于3横多纵的模式,这样的好处是相同层容易互相复用逻辑(耦合),局部的横向造成了耦合,但却无法整体导出

如果以模型为中心,只构建纵向,横向的建联通过直接的引用。

// module2.jsx
import { useApi: useApi1, Component } from 'module1.jsx'

export function useApi () {
  const use1 = useApi1()
  return {
    findFoo () {    
      use1.findAndDoSomething('')
    }
  }
}

export function Component () {
  return (
    <newDialog>
      <Component />
    </newDialog>
  )
}

这样的模型,severless,UI为组合,那就像之前的MVC架构, M -> C -> V -> C -> M的流程

这里有个问题,当M -> C -> V之后,其实在V层面已经收到了来自于C层经过计算之后得到的状态,为什么当状态修改的时候,还需要显示的调用 V -> C -> M 把数据再还原回去呢,为什么不能逆向计算后,直接 V -> M?

  • 不是所有的计算都是可逆的,那哪些计算可逆?
  • 也不是所有的V都需要直接到M,有些是临时状态需要缓存,如何显示的区分这些状态

发散

http server 是无状态的或者只缓存状态,模型里只保存最原始的数据或者为了性能考虑保存需要大量计算的数据或索引

  • 怎么判断哪些状态字段需要持久到模型中?
  • 如状态不存在模型中,那么模型到状态之间总是需要一个计算,好像是serverless不可缺少?
  • “状态”如何在 server/website 中同步 ?

前后一体化单元

实现一个功能最小单位至少包含:UI,serverless或useHook,Model ,(其中UI和model至少有1个)

另外的场景:单独的后端很少会讲到复用,但当说到复用的时候,系统负责的领域足够大时,这就成了“中台”

  • 没有Model
    • 静态站点,博客
    • Sketch,PS工具(广义来说,ps文件作为输入,也应视作Model)
  • 没有UI
    • API gateway(这种是中间件,这个好像Model也没有,但这个不够广泛
    • CDN服务,Open API服务,各种后端服务系统

在不考虑“用户”的情况:Model最重要,数据是资产

在考虑“用户”的情况下:UI最重要,能用和好用

一体化单元之间的互相组合有2种形式:

  • 静态,需要版本管理

    • 就像类库的引入,之后2个单元就是相同的工程,
    • 问题:model层是一个大集合,同时无法拆分,存储成本
  • 动态,需要运行时

    • 就像微服务或中台,引入的其实是SDK,2个单元不能算是一个有机的整体,只是允许互相调用的服务
      • 问题:model层会成为单点
      • 一旦动态之后就需要:服务的发现,注册,订阅,销毁等生命周期,

一体化单元要暴露的是:

  • Serverless或hook
  • UI

微服务

  • 持久层隔离
    • 底层Model之间的关系的引用和处理,跨数据库,这个怎么索引和建联?
  • 公用Model
    • 单点问题
    • 大表索引问题