在 MongoDB 上模拟事务操作来实现支付

我们的产品叫「学海密探」,属于在线教育行业,产品需要有支付功能,然而支付最蛋疼是什么?有人会说是支付宝和微信等支付接口的接入开发!没错,但支付接口的开发算是比较简单的了,我觉得凡是跟钱有关系的操作最重要的是事务问题,这一点很重要,很重要,真的很重要!LeanCloud 官方文档中有提到 MongoDB 不支持事务,并建议对事务有强烈需求的开发者使用其他折中方式来实现。我们的支付必须用事务,我们经过 N 轮讨后论设计了一套基于 LeanCloud 的支付场景的通用解决方案,也许其他团队比我们做得好,在这里还是分享下我们的一些见解吧。

我们在用户表 _User 中加入了一个 paylogs 字段,类型是 Array,主要用于存放着每一次支付日志的 id,用它来判断用户的账户 account 的值,比如钱扣没扣,加没加等情况。因为在支付过程中不能保证每一次操作都成功,所以还要引入一个日志表 log 来做数据的一致性,保证用户资金变动与实际相符。log 表里有一个「状态」字段 state,它的取值为 0 ~ 5,主要是从发起支付开始,生成 order 表,生成 log 表等,并记录 log 的状态,后续所有的业务都要根据 state 的状态执行不同的业务操作,不管在哪个状态出问题都可以根据 log表的 state 状态重复执行相应的业务操作,从而保证支付过程的数据一致性!

比如在充值的时候,用户扣费成功后,修改用户的 account 值成功了,但在修改 state 字段时失败了,下一次再执行时又怎么判断用户的 account 值已经改变了呢?这个问题真是太重要了,这就要用到那个 paylogs 字段,判断 paylogs 字段是否有值,八戒影院有值说明刚才用户的 account 值已经操作过了,此时可以不用操作,如果没有再进行操作。这里利用了 LeanCloud 数据存储接口的按条件更新数据的功能(使用 query 参数)来保证操作的原子性,从而也解决了并发问题!这个 query 参数真得要夸一下,在 LeanCloud 还没提供这个功能之前,我们只能采用 log 表中的新旧值比对来解决数据一致问题,但无法避免并发问题,这样当用户数据错了,我们只能认为支付失败,然后进入人工干预环节,很是麻烦。

最后再说说我们和 LeanCloud 的相遇。最初是通过朋友圈知道了 LeanCloud,后来就一直关注着。也试过一些项目,发现开发应用真是方便许多。原本大量的后端需求都要自己研发,现在都省了,只需要专注于写应用端的代码,效率自然会提高一倍以上,开发迭代速度也上去了。当然也有过顾虑,生怕遇到一些特殊场景 LeanCloud 满足不了那我们就悲剧了!但后来看到一些知名的应用都在用 LeanCloud,心里也就安稳了,有前辈们踩过坑,有 LeanCloud 的技术支持做后盾,我们就这样选定了 LeanCloud。

随着项目的进行,我们从传统的后端服务接口开发变成了面向「Document」开发,服务端工作减轻了不少。虽然在数据设计中遇到一些复杂结构的问题,比如 Pointer 和 Relations 的问题。记得当时 Array 不支持 Pointer 的 include,所以考虑用 Relations,但在 LeanCloud 社区中又看到几个相关问题都推荐使用 Array 或者 Pointer,后来通读了相关文档对数据模型有了更深的理解,问题也就少了,所以说全面了解文档是至关重要的。

转载于:https://www.cnblogs.com/tianshifu/p/8127820.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/281524.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Zabbix server is not running

问题描述 Dashbord中提示Zabbix server is not running 分析过程 首先查看zabbix-server的运行状态 systemctl status zabbix-server 确定是否是active(running)状态,如果不是,重启zabbix-server查看log tail -f /var/log/zabbix/zabbix_server.log 导致…

android 把异常写入到文本里,尝试在Android中将文件写入sdcard时发生FileNotFoundException(权限被拒绝)...

从标题中可以看到,我在Android中将文件写入sdcard时遇到问题.我想写入将在sdcard上的公共空间中的文件,以便任何其他应用程序都可以读取它。首先,我检查sdcard是否已安装:Environment.getExternalStorageState();然后,…

.NET性能优化-使用ValueStringBuilder拼接字符串

前言这一次要和大家分享的一个Tips是在字符串拼接场景使用的,我们经常会遇到有很多短小的字符串需要拼接的场景,在这种场景下及其的不推荐使用String.Concat也就是使用运算符。 目前来说官方最推荐的方案就是使用StringBuilder来构建这些字符串&#xff…

Buildroot 龙芯1C支持指南

本文转载自:https://github.com/pengphei/smartloong-sphinx/blob/master/source/cn/loongson1c_buildroot_guide.rst Buildroot 龙芯1C支持指南 引子:从龙芯1C预订拿到板子已经很长一段时间了,因为各种事情,一直让它呆在角落的冷…

STOLUCK:经济下行的当下 ,STO或将帮助中小企业度过寒冬

2018年被称为创业阵亡率特别高的一年,相关报道称有近20%的创业团队面临“后续融资跟不上,可能死在春天来临之前”的窘境。经济不景气的当下,上下游资金不足,信贷机构没钱,风投业捉襟见肘。实际今年3月份开始&#xff0…

[ 转载 ] Java面试精选【Java基础第一部分】

http://www.cnblogs.com/hnlshzx/p/3491587.html 转载于:https://www.cnblogs.com/ILoke-Yang/p/8137326.html

html如何自动调整边框大小,html – Chrome与大小调整:显示中的边框:表格

我正在使用display:table做一个小的2窗格布局.对于间距(也来自背景图像),我使用填充.因为我需要孩子们有一个确切的宽度:50%来自可用空间(考虑到父div的填充),我使用Box-sizing:border-Box.这在Opera中运行良好,但在Chrome中,框大…

浅析C# Dictionary实现原理

一、前言二、理论知识1、Hash 算法2、Hash 桶算法3、解决冲突算法三、Dictionary 实现1. Entry 结构体2. 其它关键私有变量3. Dictionary - Add 操作4. Dictionary - Find 操作5. Dictionary - Remove 操作6. Dictionary - Resize 操作(扩容)7. Dictionary - 再谈 Add 操作8. C…

对特朗普获胜感到意外? 那你是被社交媒体迷惑了

北京时间11月10日消息,据外媒报道,昨天旷日持久的美国总统选战终于告一段落,特朗普的获胜让民调彻底成了一张废纸,而早就在Facebook上提前欢庆希拉里胜利的人则彻底蒙圈了,就连万里之外的中国吃瓜群众们也开始追着许多…

猫晚流量再创记录,阿里云直播方案护航优酷2500万用户体验

2019独角兽企业重金招聘Python工程师标准>>> 对“剁手党而言,天猫双11早已经超越了简单的“买买买”,更是一场边看边玩的狂欢盛宴。今年的天猫双11狂欢夜晚会(简称“猫晚”)在上海举办,这台兼具年轻潮流与国…

python实现二叉树和它的七种遍历

介绍: 树是数据结构中非常重要的一种,主要的用途是用来提高查找效率,对于要重复查找的情况效果更佳,如二叉排序树、FP-树。另外可以用来提高编码效率,如哈弗曼树。 代码: 用python实现树的构造和几种遍历算…

.NET性能系列文章二:Newtonsoft.Json vs System.Text.Json

微软终于追上了?图片来自 Glenn Carstens-Peters[1]Unsplash[2]欢迎来到.NET 性能系列的另一章。这个系列的特点是对.NET 世界中许多不同的主题进行研究、基准和比较。正如标题所说的那样,重点在于使用最新的.NET7 的性能。你将看到哪种方法是实现特定主…

android gpu平板 推荐,性能强的不像话,最强安卓平板华为平板M6上手

原标题:性能强的不像话,最强安卓平板华为平板M6上手你为什么买平板电脑?当这一问题问出以后,许多朋友的表情都很微妙,随后大概率的回答则相当统一:"我买平板干嘛?"。其实得到这样一个…

【Python】HackBack(获取暴力破解服务器密码的IP来源)

1、前言 又在0x00sec上翻到好东东。 https://0x00sec.org/t/python-hackback-updated/882 帖子里的脚本会得到那些暴力服务器密码失败的IP和用户名,并且使用shodan api做一个溯源定位。 #!/usr/bin/python3.4 import re import urllib.request import json log_path…

企业应用“数据优先”革命的下一个主战场:安全与运营

根据IDC发布的2015年全球CIO日程预测,80%的CIO将提供一个实现创新和改善业务决策的新体系架构。 大数据时代,企业软件市场正在经历一次大迁移,数以十亿计的企业IT支出预算将投向“数据优先”应用,而不是长久以来以业务流程和工作流…

给Web开发人员的以太坊入坑指南

以太坊现在各种学习资料数不胜数,但由于以太坊正处于飞速发展阶段,有些学习资料很快就过时了。所以想找到有价值的资料无异于大海捞针。我费了很大功夫,才建立起对以太坊的整体认识,搞清楚它的工作机制。我相信很多跃跃欲试的开发…

和硕看重物联网大势 程建中:从擅长领域出发

物联网(IoT)前景可期已是全球科技产业的共识,但是如何真正找出到位的商机,却考验产业链业者的智能。苹果iPhone代工厂和硕联合科技执行长程建中表示,物联网与大数据相关应用商机看俏,物联网筑的梦比网际网路还大,当年网…

html选择文本框后提示消失,两种方法实现文本框输入内容提示消失

第一种方法:基于HTML5 input标签的新特性 - placeholder 。另外,x-webkit-speech 属性可以实现语音输入功能。第二种方法:用span模拟,定位span,借助JS键盘事件判断输入,确定span里的内容显示隐藏。无标题文…

TensorFlow基本计算单元——变量

# -*- coding: utf-8 -*- import tensorflow as tf a 3 # 创建变量 w tf.Variable([[0.5, 1.0]]) #行向量 x tf.Variable([[2.0], [1.0]]) y tf.matmul(w, x) #矩阵相乘 print(y) # Tensor("MatMul:0", shape(1, 1), dtypefloat32)init_op tf.global_variables…

程序人生:织梦dedecms后台/会员验证码关闭

dedecms默认是所有的功能几乎只要用到验证码的地方我们都需要验证的,如果要关闭一些验证功能我们可以参考下面的教程,这里介绍了关闭后台,留言板,会员系统等验证码功能关闭了。提示:支持DedeCMS V5.6 以上的所有版本取…