在 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.pswp.cn/news/281524.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/281524.shtml
英文地址,請注明出處:http://en.pswp.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 以上的所有版本取…