• 请不要在回答技术问题时复制粘贴 AI 生成的内容
rizon
V2EX  ›  程序员

前端保存数据到后台时请求数据太大该怎么处理?

  •  
  •   rizon ·
    othorizon · Aug 28, 2019 · 4714 views
    This topic created in 2473 days ago, the information mentioned may be changed or developed.

    前端有个文本输入框可以输入大量文本,后端 nodejs 接受数据限制了请求 body 最大 xMB, 不知道该怎么处理这种场景。求支招。

    现在想的一个方法是,把数据切片后,分片上传,后台合并分片后保存。

    但我更想的是后台直接保存分片的数据,存储是 mongodb 的,把分片数据保存到一个 map 里,key 就是分片的 index。 这样每次只要更新指定 index 的数据就好了。但是有个问题就是,如果前台输入框的文本内容做了删除操作,那么分片就会减少,也就是 index 的范围就要变小,比如从过去的 1-10 十个分片变成了 1-5 五个分片,那么我就要删除 6-10 这几个 key 的数据,mongodb 有什么办法可以根据 key 的值的范围批量删除吗?

    18 replies    2019-09-03 16:50:45 +08:00
    chendy
        1
    chendy  
       Aug 28, 2019
    个人的不成熟想法:
    1,把”修改“传给后端,比如删掉了从 index1 到 index2 之间的内容,在 index1 后面添加了什么内容这样子
    2,后端把修改重现到数据库中的数据上
    于是新的问题来了
    1,巨大的数据频繁往返于数据库和应用,对内存和网络都是不小的压力,于是要考虑做应用级的缓存,应用级的缓存是本地的不是分布式的…不想了
    2,还要处理修改本号,数据版本号之类的问题,防止数据乱掉…不想了
    rizon
        2
    rizon  
    OP
       Aug 28, 2019
    @chendy #1 这个方案我也想过因为太麻烦,而且变化量的块太多了则需要一些方案来保证数据的一致性。太费劲了。
    Sparetire
        3
    Sparetire  
       Aug 28, 2019
    一般这种大小限制都是框架限制的吧, 那就直接修改框架选项调大一点就好了吧, 但是总归是要限制一个大小的
    Vegetable
        4
    Vegetable  
       Aug 28, 2019
    建议不要因为一个配置问题而去修改逻辑。
    singerll
        5
    singerll  
       Aug 28, 2019 via Android
    你把数据库改了,万一其他业务以后需要这一部分数据咋办
    limuyan44
        6
    limuyan44  
       Aug 28, 2019 via Android
    既然服务端做了限制为什么客户端可以传这么大既然客户端传这么大为什么服务端做了限制,既然你一定要传这么大为什么不去修改服务端限制跑去修改逻辑
    loudefa
        7
    loudefa  
       Aug 28, 2019
    这种还是服务端改限制好,分片得改代码。。麻烦
    mikoshu
        8
    mikoshu  
       Aug 28, 2019
    文本输入框也不至于输入超过限制的文本大小吧.. 那得写多少东西 ... 是不是有图片类的文件被转成了 base64 导致文本大小变大 如果过是 应该考虑图片或者文件改成链接
    murmur
        9
    murmur  
       Aug 28, 2019
    分 trunk 上传啊,有 fileupload 组件支持前端分 trunk 得
    chairuosen
        10
    chairuosen  
       Aug 28, 2019
    当技术实现不了的时候:这个需求有问题
    enjoyCoding
        11
    enjoyCoding  
       Aug 28, 2019
    ??? 诛仙正本小说才 1.5M
    Augi
        12
    Augi  
       Aug 28, 2019 via iPhone
    互相矛盾,建议修改服务端限制,node 本身有啥限制,你说的是 http 的 body 体积吧,这个都是可以配置的。
    vanishcode
        13
    vanishcode  
       Aug 28, 2019 via Android
    需求不知道,方案设计肯定有问题,这种 MB 级的文本应该搞成文件上传
    flyingghost
        14
    flyingghost  
       Aug 28, 2019
    1,大文件分片上传没错。但存储分片更多的带来麻烦不会带来多少收益。一般不分片存储。比如跨分片搜索、匹配、解码、修改等各种操作。
    2,如果非要分片存储,可以把每个分片做 hash。无论初次还是后续上传,按分片做 hash 来判断是否可以“秒传”。然后传输那些 hash 无法匹配的分片即可。
    3,新的分片们到达服务器,依然按 hash/id 做存储。文件元数据本身会保存拥有的所有分片的索引。
    4,每个分片有引用计数,定期删除没有引用的分片。

    以上都是脑洞。
    我们的做法是直传阿里云等各种云存储,自带 SDK 支持秒传、分片等信息。云存储后给业务层传个最终结果 key 就可以了。这样存储子系统和业务子系统可以独立,业务子系统不用修改巨大的 body 体积上限,也不用占用巨大的带宽和连接时长。
    Sapp
        15
    Sapp  
       Aug 28, 2019
    你直接把限制放大不就行了... 真有这个需求,为什么不放开限制呢,而且你究竟是传了多大的文字...
    shakaraka
        16
    shakaraka  
    PRO
       Aug 28, 2019
    文字转 blob,分片上传
    red2dog
        17
    red2dog  
       Aug 29, 2019
    你这是有多大啊 上传视频吗
    songjiaxin2008
        18
    songjiaxin2008  
       Sep 3, 2019
    @flyingghost #14 正解,前端直传,云存储提供商 callback 后端。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   5688 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 84ms · UTC 03:07 · PVG 11:07 · LAX 20:07 · JFK 23:07
    ♥ Do have faith in what you're doing.