V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  tangkikodo  ›  全部回复第 2 页 / 共 3 页
回复总数  57
1  2  3  
2024-07-07 19:16:19 +08:00
回复了 tangkikodo 创建的主题 程序员 从前后端分工的利弊谈起,聊聊这套分工的未来方向
@jones2000
是的,数据库设计和合理的领域模型设计是核心, 这个应该是后端 service 层聚焦的东西。

独立的 bff 层或者 单体应用中的 controller 层聚焦的就是合理地组合 service

因此, 如果 service 层抽象的比较烂, 做的不稳定, 后面的人总归会比较惨
2024-07-07 08:38:38 +08:00
回复了 tangkikodo 创建的主题 程序员 从前后端分工的利弊谈起,聊聊这套分工的未来方向
@FYFX

bff/controller 层做的事情,以 V2EX 为
简单来描述是 1. 先获取主数据,以 blog 为例就是先获取 blogs, 2. 根据 schema 里面的扩展定义获取 comments ,浏览量等数据

如果会出性能问题, 一般是主数据的量太大了, 比如没有采用分页方案,blog 获取了 1w 条, 那么对应的 dataloader batch 查询 就要处理 1w 个 blog_id 的参数, 这种性能问题的优化就是按照实际需要取主数据, 控制数量。

batch 查询的接口也可以对热点数据做缓存。

另外 resolver 的优点是组合灵活, 新增关联不需要去考虑 model/entity 层,ORM 那边定义新的 relationship 。

但随着业务稳定下来以后, 性能优化的时候, 是可以逐步替换, 切换成 ORM 直接提供关联数据。

(这也是为什么强调 API 要互相独立, 这样才能纵向的, 互不影响地优化 API )
2024-07-07 07:30:37 +08:00
回复了 tangkikodo 创建的主题 程序员 从前后端分工的利弊谈起,聊聊这套分工的未来方向
@jones2000 是的, 所以抽新的层一定要有必要才做

bff 的模式已经在很多公司采用, 客观说明了这层的价值。

让后端专注在服务, 前端专注在拼接和展示。(避免了后端为了响应 UI 层需求频繁调整接口的情景)

不稳定的层一定要依赖于稳定的层, 因此后端的服务接口质量就尤为重要了
2024-07-07 06:40:37 +08:00
回复了 tangkikodo 创建的主题 程序员 从前后端分工的利弊谈起,聊聊这套分工的未来方向
@helbing 好巧~

没有最好的工具, 只有最适合的工具,graphql 现在就处在被人当成最好的工具的“光环”中, 近年来也开始有人来祛魅

在前后端开发中实践了 1 年 graphql 后, 我觉得 graphql 太重了, 而且向展示层暴露查询是一种危险的做法, 会反过来绑架后端的开发。

fastapi 中 pydantic 本身就能定义类型, 处理数据加载和校验, 所以动起了用 pydantic + resolve +dataloader 构建一个后端定义数据, 加载数据, 这样一套模式的脑筋。(阉割版本的 graphql, 笑)

实际使用体验非常不错。 当 schema 是固定的之后, 可以玩很多树状结构跨代的数据传输和收集, 在保持 service 提供数据不变的情况下, 满足各种展示层鬼畜的数据组合需求
2024-07-06 22:10:49 +08:00
回复了 iheeleme 创建的主题 职场话题 目前工作情况下的一点困扰和问题探讨
后端接口质量不过关,并且 leader 不重视, 前端只能遭罪了。

我们 team 也不大, 但是 service 层功能的 testcase 非常重视,单测,mock 数据的集成测试, 这是这两点就让接口质量稳定了许多。
2024-07-06 21:50:27 +08:00
回复了 BeiChuanAlex 创建的主题 程序员 rss 现在还有人用吗?现在写一个 rss 的开源项目怎么样?
rsshub yyds

其实做 feed 的持久化, 然后平时搜索搜索信息也挺有用的
@AloneHero

这段我没描述清晰, 这两个 comment count 是为了比喻某种前端视图需求, 拿到了数据之后需要做二次统计聚合, 或者干脆要自己转换一把。 “解决 gql 不擅长的后处理环节” 是 gql 不适合前后端紧耦合这个大问题下面的子问题。


------ “那是不是某个字段的逻辑有可能分散在很多字段里面?这样可维护性会不会很容易遭到破坏?”

你对 gql 很熟悉, 会想到这个问题,我猜是从 qgl 中 schema 是复用的情况下产生的疑问。在 resolve 的模式下,schema 是通过继承**核心数据**的结构, 来保证每个结构都有一套自己的描述。( pick 数据也能支持)
比如一个页面用到的 schema , 是在同级目录下按需申明出来的, 所以后处理的依赖关系挺清晰的。

比较真实的例子可以看

- https://github.com/allmonday/composition-oriented-development-pattern/blob/master/src/router/sample_1/schema.py 介绍了使用继承来“clone" schema 的做法。


我在“优势” 中说,gql 和 restuful 适合提供公共接口, 是因为公共接口往往设计合理,也不用考虑太多视图层数据的特殊展示需求。gql 根据查询来驱动的特性决定了这种后处理字段的依赖关系会造成混乱(单独查询 count 总不能暗搓搓去触发 blogs 吧),gql 构造业务向的数据,可能的后果是, 提供了 90%前端所要的结构, 但剩下 10% (不准确,比喻)涉及到后处理相关的,gql 做和前端做, 都挺麻烦的。 再加上前端需要随时跟着后端调整 query ,形成了迭代中的负担。

pydantic-resolve 的例子里面, 可以理解为, 前端描述的 query 直接固化在了后端 schema 上。

这时前端只要向 rpc 那样直接`getSiteData` 就能拿到视图数据, 如果迭代中出现需求, 需要在这个视图数据上添加额外数据,比如后处理按照层级统计 count , 或者把结构做转换, 后端都很容易,并且改完之后前端同步一下就能感知。

里面比较极端的例子就是文末彩蛋处理 tree 的层层聚合。

pydantic-resolve 的角色是扮演好防腐层, 提供各种功能来做好“数据获取和转换” 这个目的, 然后尽可能避免 service 做调整。
2024-03-12 11:42:25 +08:00
回复了 QWE321ASD 创建的主题 开源软件 这几天逛知乎发现 apijson 的作者还在暴力推荐自己的项目
@qwerasdf123 这份执着也真的只能佩服
2024-03-11 19:43:42 +08:00
回复了 QWE321ASD 创建的主题 开源软件 这几天逛知乎发现 apijson 的作者还在暴力推荐自己的项目
@StarkWhite 复杂度不能消灭, 只能控制。

从关注点分离的角度, 以及自己的体会来看, 这块复杂度我希望放在后端来管控
2024-03-11 18:33:40 +08:00
回复了 QWE321ASD 创建的主题 开源软件 这几天逛知乎发现 apijson 的作者还在暴力推荐自己的项目
而“前端自己要做数据转换”, 这件事在前后端分离的项目中, 就是容易积累“技术债” 和 “遗留代码” 的地方。
2024-03-11 18:32:28 +08:00
回复了 QWE321ASD 创建的主题 开源软件 这几天逛知乎发现 apijson 的作者还在暴力推荐自己的项目
@StarkWhite gql 本身没问题, 问题出在 gql 查询到的字段要转换成前端直接可用的结构, 往往是会有落差的。
因为后端结构相对固定, 但是前端视图数据却是各种天马行空。

如果不是具体专供的 gql 接口的话, 前端做转换的工作量一般都是存在的。
如果是专供接口的话, 那前端重写一遍 query 就有点多余。

这是我使用的一些感受~
2024-03-11 18:28:20 +08:00
回复了 QWE321ASD 创建的主题 开源软件 这几天逛知乎发现 apijson 的作者还在暴力推荐自己的项目
@qwerasdf123 在项目中体验过 gql 之后,得出了这个工具,要用也是应该放在后端代理查询, 用最简洁的形式和前端做沟通。 这样如果请求有性能问题, 后端也有足够的方案来优化, 代替。

以一个个功能明确的 API 的方式, 类似 gql 查询, 但是前端不同提供描述, 如果有 ts sdk 传递类型信息会更好。

如果是 python 后端的话, 推荐一把 pydantic-resolve ,面向前后端一同迭代的场景,通过构建前端恰好可用的视图数据, 让前端专注在展现和交互功能上。
2024-03-11 18:14:06 +08:00
回复了 QWE321ASD 创建的主题 开源软件 这几天逛知乎发现 apijson 的作者还在暴力推荐自己的项目
@qwerasdf123 是, 打着“不用对接” 的旗号, 其实挖了个深坑
2024-03-11 16:05:26 +08:00
回复了 QWE321ASD 创建的主题 开源软件 这几天逛知乎发现 apijson 的作者还在暴力推荐自己的项目
@StarkWhite

fix

```graphql
query {
MyBlogSite {
name
blogs {
id
title
comments {
id
content
}
comment_count # comments count for blog
}
comment_count # total comments
}
}
```
2024-03-11 16:04:29 +08:00
回复了 QWE321ASD 创建的主题 开源软件 这几天逛知乎发现 apijson 的作者还在暴力推荐自己的项目
@StarkWhite 两个都挺重要,sql join 负责 db 的查询,dataloader 负责 db 或者 其他远程调用。

这个 join-monster 看起来和 https://postgraphile.org/ 之类的概念很像, 从 gql 查询调用 db 查询

可是。。这不太适合直接给 client 用的, 太灵活了, 自己的项目用用倒是可以简化一些步骤。

graphql 对前端有个小麻烦,就是遇到数据层级聚合的场景, 前端要么依赖 gql-lodash, 要么自己手动拆了算。

感觉问题的本质还是,gql 或者 apijson 或者 orm 这些都是负责一层层找到数据, 不负责数据后续转换。

比如获取完数据之后做点后处理, 计算全部每个 blog comment 数量, 或者 site 所有 comment 数量

这种 gql 内部做的话, 相当于整个 node 要全部预计算完了。

query {
MyBlogSite {
name
blogs {
id
title
comments {
id
content
}
comment_count # comments count for blog
}
comment_count # total comments
}
}

当然,这些是属于某种深水区的使用困扰 :<
2024-03-11 15:31:45 +08:00
回复了 QWE321ASD 创建的主题 开源软件 这几天逛知乎发现 apijson 的作者还在暴力推荐自己的项目
@StarkWhite 说到 n+1 和 dataloader 感觉现有的 在 context 里面集中初始化的写法,维护起来稍嫌麻烦, 不能放开手脚随便定义
2024-03-11 14:55:17 +08:00
回复了 QWE321ASD 创建的主题 开源软件 这几天逛知乎发现 apijson 的作者还在暴力推荐自己的项目
@StarkWhite 确实,追写生成器帮助下,这个还是好解决的。
我感觉疼的还是 client 整的查询比较魔幻的时候的性能问题。 约等于丢失了慢查询的调优空间。
2024-03-11 13:07:34 +08:00
回复了 QWE321ASD 创建的主题 开源软件 这几天逛知乎发现 apijson 的作者还在暴力推荐自己的项目
@StarkWhite 看迭代的变化程度, 如果是增减字段还是 ok 的, 如果接口要做大变化的话, 我感觉维护 query 也是额外成本。

给 client 一种这么灵活的工具, 有时搞不好会玩出花最后不好维护。 比如本来可以通过一个新接口+过滤来获取的数据,client 为了图方便避免沟通, 走了一个绕路的查询, 而路径长的查询又可能引起性能问题。
2024-03-11 13:03:07 +08:00
回复了 chengdonghui 创建的主题 GraphQL 做前后端分离接口开发时,用 graphql 的多吗?
@Mithril 找到看法相同的了~ 握手

作为一个查询语言,gql 是个后端请求数据聚合的好帮手 (但也有问题, 比如做层级聚合)

但把这查询语言暴露给 client 就离大谱了 (除非做 github, jira 这种固定需求的 client )

这约等于后端把业务处理的控制权分散了出去,client 拼个夸张的 query 之后, 过来说功能交付了, 但是性能不行, 你帮我优化优化。 这可就刺激了。

gql 也好,orm 也好, 都只做了层层向下关联数据的事情, 并不负责从查询到的数据, 转换为前端所真正需要的视图这一块。

如果使用 python 的话, 可以尝试一下 pydantic-resolve. https://allmonday.github.io/pydantic-resolve/dataloader/

解决的就是这种,即负责关联数据的获取, 同时还能处理数据转换,然后再使用最朴素的传统接口返回。
2024-03-11 12:55:29 +08:00
回复了 QWE321ASD 创建的主题 开源软件 这几天逛知乎发现 apijson 的作者还在暴力推荐自己的项目
@StarkWhite gql 社区资源是真的丰富

不过 gql 拿来给 client 提供 api 是会有点问题的, 除非是 api 先行, 开发完了也不用调整的这种项目。

否则迭代也会疼
1  2  3  
关于   ·   帮助文档   ·   自助推广系统   ·   博客   ·   API   ·   FAQ   ·   Solana   ·   2671 人在线   最高记录 6679   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 18ms · UTC 09:11 · PVG 17:11 · LAX 02:11 · JFK 05:11
♥ Do have faith in what you're doing.