V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
yeqown
V2EX  ›  Go 编程语言

造了一个 protoc-gen-fieldmask 插件

  •  
  •   yeqown ·
    yeqown · 2022-01-25 16:46:16 +08:00 · 1216 次点击
    这是一个创建于 822 天前的主题,其中的信息可能已经有所发展或是发生改变。

    动手做一个 protoc-gen-fieldmask 插件来解决,gRPC 在服务侧的增量更新和屏蔽字段的场景问题;同时总结下使用 PG* 开发 protoc 插件的一些经验。

    https://yeqown.xyz/2022/01/25/protoc-gen-fieldmask%E6%8F%92%E4%BB%B6/

    7 条回复    2022-02-08 09:20:48 +08:00
    yeqown
        1
    yeqown  
    OP
       2022-01-26 09:19:59 +08:00
    mcfog
        2
    mcfog  
       2022-01-27 11:19:45 +08:00
    功能上是有很多应用场景的,但官方这个[]string 里面传字符串的定义其实挺臭的,兼容性的角度,性能的角度都不行
    yeqown
        3
    yeqown  
    OP
       2022-01-28 10:24:23 +08:00
    @mcfog 哈哈,是的,所以避免人为传 string 出错,我就想直接从 proto 生成近乎所有字段的 Mask_xxx 函数来使用。兼容性方面得看自己需求是什么,如果频繁变动的确实不太适合加这种功能;性能的话,我个人感觉是如果有要求的话,最好是自己去判断 “某些计算和调用” 相关字段是否需要返回,应该会降低某些场景下的延迟,但是这样势必侵入逻辑,有利有弊吧
    yongchiu
        4
    yongchiu  
       2022-01-28 13:01:32 +08:00
    问一个问题,我调用的其他后台提供的 RPC 接口,我和后台使用同一份 proto 协议进行交互,但是后台返回的结果里有一个多余的字段,我这边没有使用这个字段,可以你的这个插件屏蔽该字段吗?如果可以的话,应该怎么屏蔽呢?
    yeqown
        5
    yeqown  
    OP
       2022-01-28 18:01:49 +08:00
    @yongchiu 可以啊,就是客户端使用 FieldMask 而已,把屏蔽的处理过程放到了客户端而已(客户端获取到 response 之后,调用一下 XXX_FieldMask.Mask(resp) 就会屏蔽不需要的字段,客户端后续的处理中再获取这个字段时就是空值了)只是这样做几乎没有意义~
    yongchiu
        6
    yongchiu  
       2022-01-28 19:44:17 +08:00
    @yeqown 为啥没意义呢?
    yeqown
        7
    yeqown  
    OP
       2022-02-08 09:20:48 +08:00
    @yongchiu 从我的角度出发,mask response 字段是为了减少客户端的使用成本,同时节省带宽和减少不必要的计算(提升服务端性能)。但是,如果再客户端自己做的话,那么这两个目的都没有达到 ~ 所以我认为没有意义
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   982 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 50ms · UTC 20:08 · PVG 04:08 · LAX 13:08 · JFK 16:08
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.