V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
int64ago
V2EX  ›  程序员

Web 后台,有些数据需要每月更新(或者特定时机更新),你们是主动更新还是被动更新?具体如何实现会比较优雅?

  •  1
     
  •   int64ago ·
    int64ago · 2016-01-15 11:48:10 +08:00 · 2462 次点击
    这是一个创建于 3217 天前的主题,其中的信息可能已经有所发展或是发生改变。

    简单例子,比如用户每个月有固定次数的免费电话可打,月初的时候重新恢复到那个次数

    这个恢复的动作是自己写脚本定时任务搞?还是用户请求的时候,顺便更新了(传说中懒操作?!)

    这两种模式对程序设计来说会有一定的差异,目前遇到一些困扰,不知道主流优雅的方式是如何的?

    先谢谢了

    17 条回复    2016-01-17 11:09:24 +08:00
    abelyao
        1
    abelyao  
       2016-01-15 11:57:16 +08:00 via iPhone
    偏向 定时任务自动更新。
    感觉这是服务本身的业务逻辑,而不应该有用户行为来左右,另外从技术上说,难道用户每次登录,都要判断一次是否为本月第一次登录?
    ethego
        2
    ethego  
       2016-01-15 11:58:04 +08:00
    crontab 或者 celery 异步更新
    SourceMan
        3
    SourceMan  
       2016-01-15 12:03:10 +08:00
    crontab 跑定时任务
    int64ago
        4
    int64ago  
    OP
       2016-01-15 12:10:36 +08:00
    @abelyao 嗯,不是判断登陆,比如可以记录上次更新的月份,这次请求的如果不是上次更新的月份,则把次数加满,然后把上次月份更新为本月月份……只是举个例子,方法肯定有的

    @ethego
    @SourceMan
    定时任务我也是有些顾虑的,比如批量更新出错了怎么办?或者部分出错了,感觉可靠性很难保证,请问你们是如何解决这个问题的呢?
    cevincheung
        5
    cevincheung  
       2016-01-15 12:12:23 +08:00
    @int64ago
    登录的时候加钱加错了怎么办……
    loading
        6
    loading  
       2016-01-15 12:14:35 +08:00 via iPhone   ❤️ 1
    都是计划任务,关于出错~
    定时备份,重要操作前备份。


    数据在进去数据库前都是验证过的,程序都是全覆盖测试,基本不会出错。
    int64ago
        7
    int64ago  
    OP
       2016-01-15 12:15:36 +08:00 via Android
    @cevincheung 没太看懂你的描述
    abelyao
        8
    abelyao  
       2016-01-15 12:18:17 +08:00 via iPhone   ❤️ 1
    @int64ago 定时批量恢复这个数据,可能不了解你的业务吧,只是觉得这个操作的风险已经很低了,如果连这个都没法保证,其它业务逻辑无法想象啊…

    楼上 @cevincheung 应该也是这个意思,既然担心批量恢复会出错,那其它操作也有可能出错
    clino
        9
    clino  
       2016-01-15 12:20:50 +08:00 via Android
    ci 类软件如 jenkins buildbot
    int64ago
        10
    int64ago  
    OP
       2016-01-15 12:39:39 +08:00
    @abelyao 我倒不是担心逻辑出错,我担心的是系统抖动,导致进行的过程中出错,然后出现大面积数据畸形,关键是,这种情况出现的时候需要花大力气去定位

    考虑到这种情况,那么确实单个用户也会出错,但是无论从影响还是定位,都可能要好点……

    之所以开贴问这个问题,是因为,我遇到了性能瓶颈,所以看看大家主流的处理方式,我也大概猜到可能是定时任务,所以很想把这个里的坑一起问清楚了
    BOYPT
        11
    BOYPT  
       2016-01-15 13:07:40 +08:00
    数据库本身可以写 scheduled procedure ,不需要业务代码支持。
    oott123
        12
    oott123  
       2016-01-15 13:20:00 +08:00
    呃,为啥都偏向主动更新,只有我喜欢被动更新吗……

    个人觉得主动更新压力太集中,而且对一些很久没用过的垃圾数据去做更新也是一个很浪费的事情,所以如果我做的话基本都是被动更新的。

    当然楼主说遇到了瓶颈,可以考虑做个异步更新就是了……
    int64ago
        13
    int64ago  
    OP
       2016-01-15 13:23:48 +08:00
    madshaw
        14
    madshaw  
       2016-01-15 13:40:20 +08:00 via Android
    昨天刚看的,实现的时候翘起小拇指比较优雅
    neo2015
        15
    neo2015  
       2016-01-15 13:55:18 +08:00
    我自己用的 mysql 的定时任务,如果只是数据上的事情
    cevincheung
        16
    cevincheung  
       2016-01-16 16:02:35 +08:00
    @int64ago

    这是代码逻辑的问题。

    记录运行中 trace 信息,定时人工查看,程序记录任务开始时间,执行任务成功更新时间,执行任务不成功,后台看 trace 定位。

    数据库的事物, redis 做队列。有很多方法可以避免可能出现的潜在问题。
    SmiteChow
        17
    SmiteChow  
       2016-01-17 11:09:24 +08:00
    定时任务 celery
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3411 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 00:42 · PVG 08:42 · LAX 16:42 · JFK 19:42
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.