1. 程式人生 > >高頻熱點賬戶(和庫存類似但稍有不同)如何解決高併發餘額計數問題?

高頻熱點賬戶(和庫存類似但稍有不同)如何解決高併發餘額計數問題?

這個問題和秒殺,庫存問題是類似的.

https://yq.aliyun.com/edu/lesson/play/270


write.blog.csdn.net/postedit/47340675?ticket=ST-202343-fYu0bMCATjor1YrOjMgM-passport.csdn.net


【阿里線上技術峰會】何登成:AliSQL效能優化與功能突破的演進之路


1. 去併發--排隊是解決這個問題的核心.

n個執行緒. 被分層n組. 通過庫,表,行逐級hash,智慧擴容縮https://yq.aliyun.com/edu/lesson/play/270 .

如果庫層級不排序,那麼就業務方通過redis分散式鎖處理,做到mq通知. mq會是瓶頸.

   何登成-mysql庫存最大500併發量.--- 4k --併發提交後4w

2. 批量提交 -登哥使用了這個技術

3. 切分帳戶,庫存欄位. 分別搶購. 會導致獲取總量較複雜.

並且要循環扣(每次扣1個),或者可能導致餘額不足但不保證有少量餘額.

(需要動態的縮減帳戶數量.鎖帳戶然後操作轉移錢款 ( 分散式鎖,最好一條儲存過程搞定,少一次網路互動.).  select num from update   set num-num where account_id=1;然後 update set id2.num+=id1.num where id=2;

4. 特殊場景,前端業務自行攔截(下沉到資料庫服務端會導致無效邏輯判斷過多. 功能越複雜,自然cpu計算就多.例如B+樹降級為hash索引).總量就是4,那麼一旦排隊大於4*x (或者手動定死控制)個後就設定標誌位攔截所有請求. (這個和客戶端執行緒池有異曲同工之妙)

  支付寶需要有個賬戶記賬,現在很多業務已經出現了很多熱點賬戶。比如網際網路大商家,\\\

      賬號有餘額,主要用於不能扣成負數。 大併發交易下餘額快速變化,導致資料庫競爭等待。

      原則: 不同的業務要求,不同的設計,同時會影響業務需求. 

三大需求,是否都容易滿足:

1.減款

2.加款

3.讀取總金額

最簡單設計: 帳戶表+流水錶. 每次帳戶加減款都需要增加流水,和帳戶變動.

業務需求: 高併發帳戶.

技術選擇 1. 悲觀鎖(高併發帳戶), 樂觀鎖(普通併發帳戶).  3. 順序化 同步轉非同步,mq 降低峰值.

儲存選擇: redis 還是 資料庫. redis本身併發能力就是比資料庫要好. 但是單機支援的資料量不如資料庫大. 只存放account的值的話到還好.

賬戶轉賬分兩個介面,一個可扣成負數,一個不能扣成負數.

 1 如何消除餘額競爭呢?

   方案一:變成兩個賬戶   模仿 擔保交易,設定兩個賬戶    1. 扣款賬戶  2. 加款賬戶

  1.1.  商家都是頻繁加款 ,加款賬戶只記流水,不計算餘額. 避免頻繁競爭

  1.2.  加款帳戶的流水定時彙總到扣款帳戶上.

  1.3   扣款賬戶用於退款和提現, 因為頻率不高.  即保證餘額控制,也沒有併發問題.  退款有些業務能扣成負數,有些業務不能.

  缺點: 進入的錢不一定能時時能用. (對小商家不適用,比較計較)

  優點: 這樣就避免了熱點賬戶的餘額計算。

  方案二: 賬戶分普通賬戶加頻賬戶減頻賬戶雙頻賬戶

型別為加錢頻繁賬戶,加錢不改變餘額,定時任務收集改變。 撿錢操作時時進行。

減頻賬戶,拆分子賬戶。

扣款只賬戶會有個問題,前面扣掉了,但是最後不夠扣。

最佳方案,回滾,即逆操作,加款。

次佳方案, 使用只能扣成一次負數

雙頻賬戶:加款依然如此,減款同上。

 延遲提現問題:即2天內收入只允許某種業務扣款(內部消費,代駕現金抵扣),但不允許提現扣款。

        採用普通賬戶,但是要滿足提現延遲方案?

        小商家加的錢必須時時能用. 又要求延遲提現怎麼辦?

 只能通過訂單維度,目前這個訂單現在有多少錢凍結中(已退款的錢不應該凍結). 展現哪些訂單是凍結的,凍結金額是多少.

              一旦錢被消費了, 賬戶餘額可能少於訂單的凍結的金額,可提現餘額可能為負數. 

       客戶可能來投訴, 因為他自己意識不到錢被消費了(抵扣資訊費)和提現金額變少有關聯.

相關推薦

高頻熱點賬戶(庫存類似不同)如何解決併發餘額計數問題?

這個問題和秒殺,庫存問題是類似的. https://yq.aliyun.com/edu/lesson/play/270 write.blog.csdn.net/postedit/47340675?ticket=ST-202343-fYu0bMCATjor1YrOj

併發場景系列(一) 利用redis實現分散式事務鎖,解決併發環境下減庫存

問題描述:某電商平臺,首發一款新品手機,每人限購2臺,預計會有10W的併發,在該情況下,如果扣減庫存,保證不會超賣 方案一 利用資料庫鎖機制,對記錄進行鎖定,再進行操作  SELECT * from goods where ID =1 for updat

python 如何解決併發下的庫存問題

        一個簡單的使用場景:一件商品的庫存只有5件,同時A使用者買了5個,B使用者買了5個,都提交資料,照成庫存不足的問題。        邏輯:根據一般電商商品的模型類,生成訂單一般包括訂單類(Order)和訂單詳情類(DetailOrder),這兩張表根據外來鍵o

PHP(結合redis,事物鎖)解決併發下搶購

<?php/** 搶購模組*/class seckill extends common { private $_orderModel = null; private $_goodsModel = null; private $_redis = null; pro

redis解決併發定時秒殺”庫存誤差問題

前言:高併發的秒殺活動中,通過查詢資料庫判斷是否還有庫存,然後對庫存欄位進行增減,極易出現庫存超出或者庫存為負的情況,一般來說有3中解決辦法(資料庫表加鎖,memche快取,redis佇列);我們這裡使用redis來解決問題:1、思路:  1)觸發開始開團的同時,把庫存數量更

利用redis實現分散式事務鎖,解決併發環境下減庫存

http://download.redis.io/releases/ 安裝: sudo make test 測試編譯 sudo make install 啟動: redis-servre cd “安裝目錄” redis-server ./redis-3.2.9/redis

利用epoll多程序解決併發問題

1、服務端程式碼,開啟8個工作程序 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <signal.h> #include <sy

分頁優化+表鎖庫存優化+數據庫的備份導入

應對 value 概念 參考 char int 讓我 博客 打開 一.分頁優化技術 代碼參看: php/classic.php 把50331651記錄進行分頁,每頁顯示2條記錄,於是我們用傳統php編碼方式,編寫分頁代碼如下: 上傳到/var/www/html下進行

postgresql數據庫設置遠程登陸賬戶密碼

postgresql數據庫設置遠程登陸賬戶和密碼1.本地登陸postgresql,建庫授權,設置密碼服務器本地登陸postgresql數據庫(默認是不需要密碼的)[email protected] ~]$ psqlpsql.bin (9.5.9)Type "help" for help.創建角色,並

用戶賬戶賬戶的的相關文件及文件權限介紹

用戶賬戶和組賬戶的的相關文件及文件權限介紹 與用戶賬戶和組賬戶相關的文件: /etc/passwd /etc/group /etc/shadow /etc/gshadow /etc/default/useradd /etc/login.defs /etc/skel(Directory) /etc

python筆記6-%u60A0u60a0類似unicode解碼

分享 unicode 返回 div images int es2017 mark 分享圖片 前言 有時候從接口的返回值裏面獲取到的是類似"%u4E0A%u6D77%u60A0%u60A0"這種格式的編碼,不是python裏面的unicode編碼。 pyt

Linux系統中管理用戶賬戶賬戶及其權限設置

系統 運維 用戶賬戶分為:超級用戶、系統用戶、普通用戶。 超級用戶: 用戶名:root ; UID:0; 系統用戶: 用戶名:由用戶自行設定; UID:1~499(Centos6及之前),1~999(Centos7); 普

自學Linux Shell7.1-linux用戶賬戶

blog 學linux 文件 linux 返回 ash linu 賬戶 腳本 點擊返回 自學Linux命令行與Shell腳本之路 7.1-linux用戶賬戶和組 linux安全系統的核心是用戶賬戶。每個能進入linux系統的用戶都會被分配唯一的用戶賬戶,用戶對系統中各對象的

賬戶權限管理

finger 新的 屬組 gdi 復制 破解 log -s chgrp 管理用戶和組賬號用戶和組賬號概述Linux基於用戶身份對資源訪問進行控制用戶帳號:超級用戶 root 超級用戶,即root用戶,類似於Windows系統中的Administrator用戶,非執行管理任

Shell開發批量創建Linux賬戶隨機8位數密碼

$? pts 用戶 test txt shell 要求 roo 批量 需求:批量創建10個系統賬號,如:test-01到test-10,並且為每一個用戶設置密碼為隨機8位數,同時將創建成功的賬號對應密碼保存在/tmp/user.txt裏,失敗則把失敗的賬號對應密碼保存到/t

區塊鏈入門教程eth的賬戶基本單位

重新 目前 進行 密碼 依次 action 單位 新建 兩個 我們在命令行輸入 eth.accounts 可以看到當前該區塊鏈中共有幾個賬號,以及每個賬號的公鑰地址。 在eth系統中,狀態是由被稱為“賬戶”(每個賬戶由一個20字節的地址)的對象和在兩個賬戶之間轉移價值和信息

以太坊的賬戶交易

5、賬戶 以太坊中有兩種賬戶1、外部擁有賬戶(EOA),一般指自然人擁有的賬戶。2、合約賬戶(CA),為智慧合約分配的賬戶。 看一下賬戶的原始碼定義: EOA特徵codeHash為空storageRoot為空通過私鑰控制發起交易(轉移以太幣或觸發合約程式碼) CA特徵不能發起交易,可以被觸

伺服器新增賬戶設定區域網遠端登入

新增賬戶 1)新增使用者並建立home設定shell sudo useradd -m -s /bin/bash userName #sudo useradd username -d /home/username -m #不要用第二條命令,因為沒有指定shell。在使用MobaXter

熱點賬戶衝扣設計方案

  前言:方案設計前提 一般賬務系統對賬戶的衝扣需要滿足以下兩點 1:更新賬戶表中的賬戶餘額。 2:記錄賬戶明細表中的賬戶更新前餘額,賬戶更新後餘額,操作金額。  其中對賬戶表中的餘額更新一般是直接update,對賬戶明細表中的操作前金額,操作後金額和操作金額就是對賬戶表upda

WPF中PopupContextMenu類無法以常規方式繫結資料命令,只能通過引數PlacementTarget獲得父控制元件

比如 <Window x:Name="window"> <ItemsControl Items="{Binding BookItems}"> <ItemsControl.ItemTemplate> <DataTemplate&g