高頻熱點賬戶(和庫存類似但稍有不同)如何解決高併發餘額計數問題?
這個問題和秒殺,庫存問題是類似的.
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-%u60A0和u60a0類似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中Popup和ContextMenu類無法以常規方式繫結資料和命令,但只能通過引數PlacementTarget獲得父控制元件
比如 <Window x:Name="window"> <ItemsControl Items="{Binding BookItems}"> <ItemsControl.ItemTemplate> <DataTemplate&g