V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
refresh
V2EX  ›  问与答

频繁写入数据且需要做计算, Go/Node.js/Ruby/C#/ Python 哪种更合适?

  •  
  •   refresh · 2020-03-15 20:25:03 +08:00 · 1805 次点击
    这是一个创建于 1712 天前的主题,其中的信息可能已经有所发展或是发生改变。
    需求是这样的,每写入一条数据,需要读取过去的 N ( N<500 )条数据进行重新计算并重新插入数据库,计算逻辑不复杂,就是加减乘除,尽可能支持并发高一些,什么语言更好一些,还是都可以?
    第 1 条附言  ·  2020-03-15 21:43:07 +08:00
    另外,考虑到开发效率+后期维护成本,哪个更好?
    14 条回复    2020-03-17 10:52:25 +08:00
    kxjhlele
        1
    kxjhlele  
       2020-03-15 20:45:15 +08:00 via Android
    直接 SQL 不行吗,merge
    refresh
        2
    refresh  
    OP
       2020-03-15 21:22:19 +08:00
    @kxjhlele 需要做计算,要对历史数据做各种计算
    keepeye
        3
    keepeye  
       2020-03-15 21:28:30 +08:00
    这种情况下瓶颈不是在数据库么?
    要选的话就 go 呗,可以支撑很大的并发,只要数据库能抗住
    opengps
        4
    opengps  
       2020-03-15 21:35:47 +08:00
    维护一个内存变量,存这 500 条数据应该占不了太多内存。真要落盘,那就多块 ssd
    opengps
        5
    opengps  
       2020-03-15 21:36:43 +08:00
    SQL 数据库有个内存表,好像没有锁的问题,可以考虑拿来做中转罗盘
    refresh
        6
    refresh  
    OP
       2020-03-15 21:40:33 +08:00
    @keepeye 讲道理不会在数据库,统一读取之后,然后锁住用户,更新数据再统一插入。不过这样的方式内存占用肯定是多的了,而且如果是分布式的话,锁住用户也比较麻烦,可能需要维护一个公共锁。
    ericls
        7
    ericls  
       2020-03-15 22:58:33 +08:00 via iPhone
    我也觉得可以用 sql 做计算
    sujin190
        8
    sujin190  
       2020-03-15 23:13:07 +08:00
    @refresh #6 为啥会锁住用户,合理的做法应该是分两步,每步都是可重入的,过去 500 条这只是个缓存问题,语言无所谓吧
    Xbluer
        9
    Xbluer  
       2020-03-15 23:13:33 +08:00
    @ericls #7 逻辑放在 sql 里面后期维护要崩溃的
    refresh
        10
    refresh  
    OP
       2020-03-16 10:49:24 +08:00
    @ericls sql 做计算比较难吧,每条数据的计算方法可能是不一样的,当然也可用存储过程来解决,不过这个存储过程可能会相当复杂

    @sujin190 肯定要锁用户的,不然上一次计算还没有完成,下次用户又提交一笔就完了。
    @Xbluer 是的
    sujin190
        11
    sujin190  
       2020-03-16 15:29:05 +08:00
    @refresh #10 难道不是基于用户提交的过去 500 条数据计算么,还有基于计算后的 500 条历史记录再计算的?啥场景这么奇怪的需求
    refresh
        12
    refresh  
    OP
       2020-03-16 19:35:39 +08:00
    @sujin190 用户可能只修改一条数据,但是有可能因为用户提交的其中一条数据,而需要修改所有的记录。举个例子,假如我现在有一个记帐系统,为用户提供两个功能:1. 每笔帐会有一个余额; 2. 会告诉用户总资产的变化。

    那么每笔记录就需要做两个事情:1. 计算余额; 2. 计算总资产的变化。如果改动了中间一笔,那么后面的余额都会发生变化,且每天的总资产也会发生变化。
    sujin190
        13
    sujin190  
       2020-03-16 22:53:24 +08:00
    @refresh #12 你举这个例子很不恰当,完全不符合现实情况,从现实来说,交易流水完全基于现实动作在时间维度产生,因为时间不可逆转,所以使资产或者余额发生变化的交易流水同样不可能存在需要修改的情况

    如果因为某些情况之前的交易存在歧义或者错误而发送交易纠纷解决,那么既然现实已经在新的时间维度上真实发生了一件交易纠正的行为,那么就应该真实的产生一条新的交易记录从而使余额或者资产发生变更,修改原交易记录是极其不恰当而且也不符合现实的

    关于系统异常导致的问题,下一条的交易变更应该完全基于上一条已提交完结的事务产生,在此种情况下不应该存在中间某条是错的情况
    refresh
        14
    refresh  
    OP
       2020-03-17 10:52:25 +08:00
    @sujin190 不是哦,交易流水确实不可改动。但如果是用户主动记账呢(例如像随手记这种),或者是一些仓库库存这种呢?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3038 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 13:16 · PVG 21:16 · LAX 05:16 · JFK 08:16
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.