mysql-当变乱轮回正在守候数据库操纵时,如那里理赏罚对nodejs处事器
我的API中有一条路由,譬喻,可以将其称为/ users /:userId / updateBalance.此路由将获取用户当前余额,添加来自哀求的任何内容,然后行使新计较的余额更新余额.这样的哀求每隔30分钟就会针对特定用户进入处事器,因此直到最近,我还以为并发题目是不行能的. 最终产生的环境是,某个处所的已发送哀求失败,而且仅在30分钟后(约莫在另一个哀求的一秒钟之内)再次发送.功效是,正如我在数据库中看到的那样,这两个哀求都从数据库中获取了沟通的余额,而且都添加了各自的金额.本质上,第二个哀求现实上读取了一个过期的余额,由于凡是它应该在哀求1执行后执行. 为了更清晰地给出一个数值示例,假设哀求1将2美元添加到余额中,哀求2则添加5美元,而用户的余额为10美元.假如哀求并行执行,则按照哀求1或哀求2起首完成,用户余额将别离为$12或$15,由于两个哀求都从DB提取了$10的余额.可是,显然预期的举动是我们但愿执行哀求1,将用户余额更新为$12,然后哀求2执行并将余额从$12更新为$17. 为了更好地相识此进程的整体执行环境:吸取了哀求,挪用了一个函数,该函数必需守候DB的余额,然后该函数计较新的余额并更新db,然后执行完成了. 因此,我对此有一些疑问.第一个是,节点在守候异步哀求(如MySQL数据库读取)时如那里理赏罚传入的哀求.按照我调查到的功效,我假设当第一个哀求守候数据库时,第二个哀求可以开始处理赏罚吗?不然,我不确定在节点等单线程情形中怎样经验这种异步举动. 其次,我该怎样节制和提防它.我本想行使带有forUpdate锁的MySQL事宜,但究竟证明,因为当前编写代码的方法,这好像是不行能的.有没有步伐汇报节点某个代码块不能“并行”执行?照旧其他选择? 最佳谜底 没错,当节点守候数据库查询返回时,它将处理赏罚全部传入哀求,并在第一个哀求完成之前启动哀求数据库挪用.防备此IMO的最简朴要领是行使行列.该路由处理赏罚措施可以直接将变乱推送到行列(在Redis中,在AWS SQS中,在RabbitMQ等中)以及应用措施中其他处所(乃至在完全差异的处事中),而不是直接在路由处理赏罚措施中处理赏罚余额更新.会有一个斲丧者监听该行列中的新变乱.假如更新失败,请将其从头添加到行列的开头,添加一些守候时刻,然后重试. 这样,无论您的第一个哀求失败几多次,您的余额都将是正确的,而且对该余额的未决变动将以正确的次序举办.万一行列中的变乱重复失败,您乃至可以向或人发送电子邮件或关照以举办查察,而题目已办理的同时,余额的变动将添加到行列中,而且一旦牢靠,统统城市正确处理赏罚. 您乃至可以读取该行列并向您的用户表现信息,汇报用户余额有待更新,因此也许禁绝确. 但愿这可以辅佐! (编辑:湖南网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |