ホームページ データベース mysql チュートリアル 如何解决秒杀的性能问题和超卖的讨论

如何解决秒杀的性能问题和超卖的讨论

Jun 01, 2016 pm 01:16 PM
どうやって タオバオ 電子商取引 フラッシュセール 解決

最近业务试水电商,接了一个秒杀的活。之前经常看到淘宝的同行们讨论秒杀,讨论电商,这次终于轮到我们自己理论结合实际一次了。

ps:进入正文前先说一点个人感受,之前看淘宝的ppt感觉都懂了,等到自己出解决方案的时候发现还是有很多想不到的地方其实都没懂,再次验证了“细节是魔鬼”的理论。并且一个人的能力有限,只有大家一起讨论才能想的更周全,更细致。好了,闲话少说,下面进入正文。

一、秒杀带来了什么?


秒杀或抢购活动一般会经过【预约】【抢订单】【支付】这3个大环节,而其中【抢订单】这个环节是最考验业务提供方的抗压能力的。

抢订单环节一般会带来2个问题:

1、高并发

比较火热的秒杀在线人数都是10w起的,如此之高的在线人数对于网站架构从前到后都是一种考验。

2、超卖

任何商品都会有数量上限,如何避免成功下订单买到商品的人数不超过商品数量的上限,这是每个抢购活动都要面临的难题。

二、如何解决?


首先,产品解决方案我们就不予讨论了。我们只讨论技术解决方案

1、前端

面对高并发的抢购活动,前端常用的三板斧是【扩容】【静态化】【限流】

A:扩容

加机器,这是最简单的方法,通过增加前端池的整体承载量来抗峰值。

B:静态化

将活动页面上的所有可以静态的元素全部静态化,并尽量减少动态元素。通过CDN来抗峰值。

C:限流

一般都会采用IP级别的限流,即针对某一个IP,限制单位时间内发起请求数量。

或者活动入口的时候增加游戏或者问题环节进行消峰操作。

D:有损服务

最后一招,在接近前端池承载能力的水位上限的时候,随机拒绝部分请求来保护活动整体的可用性。

2、后端

那么后端的数据库在高并发和超卖下会遇到什么问题呢?主要会有如下3个问题:(主要讨论写的问题,读的问题通过增加cache可以很容易的解决)

I: 首先MySQL自身对于高并发的处理性能就会出现问题,一般来说,MySQL的处理性能会随着并发thread上升而上升,但是到了一定的并发度之后会出现明显的拐点,之后一路下降,最终甚至会比单thread的性能还要差。

II: 其次,超卖的根结在于减库存操作是一个事务操作,需要先select,然后insert,最后update -1。最后这个-1操作是不能出现负数的,但是当多用户在有库存的情况下并发操作,出现负数这是无法避免的。

III:最后,当减库存和高并发碰到一起的时候,由于操作的库存数目在同一行,就会出现争抢InnoDB行锁的问题,导致出现互相等待甚至死锁,从而大大降低MySQL的处理性能,最终导致前端页面出现超时异常。

针对上述问题,如何解决呢? 我们先看眼淘宝的高大上解决方案:

I:  关闭死锁检测,提高并发处理性能。

II:修改源代码,将排队提到进入引擎层前,降低引擎层面的并发度。

III:组提交,降低server和引擎的交互次数,降低IO消耗。

以上内容可以参考丁奇在DTCC2013上分享的《秒杀场景下MySQL的低效》一文。在文中所有优化都使用后,TPS在高并发下,从原始的150飙升到8.5w,提升近566倍,非常吓人!!!

不过结合我们的实际,改源码这种高大上的解决方案显然有那么一点不切实际。于是小伙伴们需要讨论出一种适合我们实际情况的解决方案。以下就是我们讨论的解决方案:

首先设定一个前提,为了防止超卖现象,所有减库存操作都需要进行一次减后检查,保证减完不能等于负数。(由于MySQL事务的特性,这种方法只能降低超卖的数量,但是不可能完全避免超卖)

1

update number set x=x-1 where (x -1 ) >= 0;

ログイン後にコピー

解决方案1:

将存库从MySQL前移到Redis中,所有的写操作放到内存中,由于Redis中不存在锁故不会出现互相等待,并且由于Redis的写性能和读性能都远高于MySQL,这就解决了高并发下的性能问题。然后通过队列等异步手段,将变化的数据异步写入到DB中。

优点:解决性能问题

缺点:没有解决超卖问题,同时由于异步写入DB,存在某一时刻DB和Redis中数据不一致的风险。

解决方案2:

引入队列,然后将所有写DB操作在单队列中排队,完全串行处理。当达到库存阀值的时候就不在消费队列,并关闭购买功能。这就解决了超卖问题。

优点:解决超卖问题,略微提升性能。

缺点:性能受限于队列处理机处理性能和DB的写入性能中最短的那个,另外多商品同时抢购的时候需要准备多条队列。

解决方案3:

将写操作前移到MC中,同时利用MC的轻量级的锁机制CAS来实现减库存操作。

优点:读写在内存中,操作性能快,引入轻量级锁之后可以保证同一时刻只有一个写入成功,解决减库存问题。

缺点:没有实测,基于CAS的特性不知道高并发下是否会出现大量更新失败?不过加锁之后肯定对并发性能会有影响。

解决方案4:

将提交操作变成两段式,先申请后确认。然后利用Redis的原子自增操作(相比较MySQL的自增来说没有空洞),同时利用Redis的事务特性来发号,保证拿到小于等于库存阀值的号的人都可以成功提交订单。然后数据异步更新到DB中。

优点:解决超卖问题,库存读写都在内存中,故同时解决性能问题。

缺点:由于异步写入DB,可能存在数据不一致。另可能存在少买,也就是如果拿到号的人不真正下订单,可能库存减为0,但是订单数并没有达到库存阀值。

三、总结


1、前端三板斧【扩容】【限流】【静态化】

2、后端两条路【内存】+【排队】

四、非技术感想


1、团队的力量是无穷的,各种各样的解决方案(先不谈可行性)都是在小伙伴们七嘴八舌中讨论出来的。我们需要让所有人都发出自己的声音,不要着急去否定。

2、优化需要从整体层面去思考,不要只纠结于自己负责的部分,如果只盯着一个点思考,最后很可能就走进死胡同中了。

3、有很多东西以为读过了就懂了,其实不然。依然还是需要实践,否则别人的知识永远不可能变成自己的。

4、多思考为什么,会发生什么,不要想当然。只有这样才能深入进去,而不是留在表面。

ps:以上仅仅是我们讨论的一些方案设想,欢迎大家一起讨论各种可行方案。 

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

タオバオの無料赤い封筒 2024 を入手する方法 タオバオの無料赤い封筒 2024 を入手する方法 May 09, 2024 pm 03:22 PM

2024年のタオバオ無料注文イベントは1日3回開催され、誰もが対応する時間に対応する量の商品を注文し、支払う必要があります。無料注文金額は同額の赤い封筒の形で配布されます。次に、2024 年に淘宝網の無料注文の赤い封筒を受け取る方法を紹介します。それを入手します。無料のユーザーの場合、赤い封筒の資格は、アクティベーション状態にあるカードとクーポンのパッケージに発行されます。タオバオのウェブ版には現在カードとクーポンのパッケージがなく、無料注文イベントの当選記録のみが表示されます。カードとクーポンのパッケージは [淘宝網 APP - 私の淘宝網 - 私の権利 - 赤い封筒] にあります。淘宝網の無料赤い封筒を入手する方法 20241. 無料の注文を獲得したユーザーには、有効化を待機している状態のカードとクーポン パッケージに赤い封筒の資格が配布されます。 2. 現在、淘宝網の Web バージョンでは、カードとクーポンのパッケージがあり、無料注文アクティビティの当選記録のみが表示されます。 ;3. カード クーポン パッケージは [淘宝網 APP - 私の淘宝網 - 私の権利 - 赤い封筒] にあります。

タオバオで名前を変更する方法 タオバオで名前を変更する方法 Mar 24, 2024 pm 03:31 PM

名前変更機能を使用すると、ユーザーはタオバオで自分の名前とニックネームを自由に変更できます。一部のユーザーはタオバオで名前を変更する方法がわかりません。マイ タオバオの設定でアバターのタオバオ アカウントをクリックするだけで変更できます。次に、編集者がお届けします 名前とニックネームの変更方法を紹介しますので、まだご存じない方はぜひダウンロードして試してみてください。タオバオの使い方チュートリアル タオバオの名前変更方法 答え: マイ タオバオの設定でアバターのタオバオ アカウントをクリックして変更します 詳細: 1. タオバオに入り、右下の[マイ タオバオ]をクリックします。 2. 右上の[設定]アイコンをクリックします。 3. アバターをクリックします。 4. もう一度[タオバオアカウント]をクリックします。 5. [アカウント名の変更]をクリックし、入力・変更します。

タオバオで赤い封筒のリマインダーをオフにする方法 タオバオで赤い封筒のリマインダーをオフにする方法 Apr 01, 2024 pm 06:25 PM

タオバオは、多くの友人がよく使用するオンライン ショッピング ソフトウェアです。あなたは通常、タオバオで注文したり、さまざまなものを購入したりします。ユーザーに赤い封筒のリマインダー機能を提供します。これをオフにしたいという友人もいます。急いで PHP 中国語をチェックしてください。ウェブサイトをご覧ください。タオバオで赤い封筒のリマインダーをオフにする手順のリスト 1. タオバオ APP のパーソナルセンターを開き、[設定] ボタンを選択してページに入ります。 2. [メッセージ通知] オプションを見つけて、メッセージプッシュスイッチを選択し、赤い封筒のメッセージを見つけてスイッチをオフにします。 3. または、携帯電話の設定ページから淘宝アプリの通知許可をオフにすることもできます。これにより、淘宝網からのすべてのメッセージはプッシュされず、通知許可をオンにした後にのみ表示されます。 4. 受信するメッセージの種類をユーザーが設定できるため、使いやすくなります。

「タオバオ」の無料紅包の返金は返ってくるのでしょうか? 「タオバオ」の無料紅包の返金は返ってくるのでしょうか? May 08, 2024 am 08:16 AM

タオバオで買い物をするとき、割引を受けるために無料の赤い封筒をよく使います。しかし、返金が必要な場合、この無料の赤い封筒は返却されるのでしょうか?この質問に対する答えを見てみましょう。タオバオの無料の赤い封筒は返金されますか? 状況によっては、赤い封筒を受け取ったときに、製品を引き換える前に赤い封筒がアクティブ化保留状態になっているため、アクティブ化される赤い封筒は使用できません。購入した製品の受領が確認されるまで一時的に待機し、アクティベートする必要がある赤い封筒を使用できます。無料の赤い封筒を使用した後に製品に問題があり、返品する必要がある場合、赤い封筒の返却は実際の状況に応じて判断する必要があります。 1. 返金ルール 11. 返品後に返金が発生した場合赤い封筒を使用した場合、赤い封筒は比例して返却されます。 2. 返却期限を過ぎていない場合は、返却された赤い封筒の使用期間が本来の使用期限となります。期限を過ぎた場合は7日以内に発行されます。

「タオバオ」510無料紅封筒の使い方 「タオバオ」510無料紅封筒の使い方 May 08, 2024 pm 10:00 PM

タオバオ510の無料赤い封筒の使い方は?タオバオは最近、510周年を記念して無料注文イベントを開始しました。このイベントでは、多くの特典があり、このイベントに参加したいと考えている友人もいます。ですが、具体的な使い方がわかっている場合は、今日の関連する紹介を見てみましょう。タオバオの 510 周年記念無料注文レッド パックの使用手順: 無料注文レッド パックは、推測質問のためのすべての注文が確認され受信された後に使用できます。 1. ユーザーはウェブ版淘宝網を通じて無料の赤い封筒を発行および回収することができます。現在、カードとクーポンのパッケージはありませんが、[淘宝網 APP - 私の淘宝網 - 私の権利 - 赤い封筒] で見ることができます。無料の注文を取得したユーザーには、赤い封筒の資格がカードとクーポンのパッケージに配布され、カードとクーポンのパッケージは賞品獲得のために有効化されています。

C++ での機械学習アルゴリズムの実装: 一般的な課題と解決策 C++ での機械学習アルゴリズムの実装: 一般的な課題と解決策 Jun 03, 2024 pm 01:25 PM

C++ の機械学習アルゴリズムが直面する一般的な課題には、メモリ管理、マルチスレッド、パフォーマンスの最適化、保守性などがあります。解決策には、スマート ポインター、最新のスレッド ライブラリ、SIMD 命令、サードパーティ ライブラリの使用、コーディング スタイル ガイドラインの遵守、自動化ツールの使用が含まれます。実践的な事例では、Eigen ライブラリを使用して線形回帰アルゴリズムを実装し、メモリを効果的に管理し、高性能の行列演算を使用する方法を示します。

タオバオストアの登録プロセス タオバオストアの登録プロセス Mar 25, 2024 pm 01:37 PM

1.タオバオアプリを開き、右下の[マイタオバオ]をクリックし、右上の[設定]をクリックします。 2. [加盟店決済]を選択し、[タオバオストアを開く]をクリックし、[一般加盟店]を選択します。 3. [無料出店]画面では、[個人加盟店]出店の具体的なプロセスを確認することができます。 4. ストア名を入力し、[ストアを開く] をクリックし、3 つの項目すべてにチェックを入れて、[0 元でストアを開く] をクリックします。 5. 最後に【本人認証】を完了し、【店舗基本情報】を入力すると無事出店できます。

Black Shark 携帯電話が充電中に自動的にシャットダウンしてオンになる理由の分析と解決策 Black Shark 携帯電話が充電中に自動的にシャットダウンしてオンになる理由の分析と解決策 Mar 24, 2024 pm 02:09 PM

Black Shark携帯電話は、若者を中心に人気のゲーミングフォンであり、優れた性能とユニークなデザインで多くのプレイヤーに支持されています。しかし、日常的な使用において、一部のユーザーは、Black Shark 携帯電話が充電中に自動的にシャットダウンしたり、充電器に接続した後に起動できなかったりして、ユーザーに迷惑をかけたと報告しました。この記事では、Black Shark 携帯電話の自動シャットダウンと起動の問題について、原因分析と、ユーザーがこの問題をより適切に解決できるようにするための解決策の側面から説明します。 1. 充電器の品質問題の原因分析: 低品質の充電器は電圧が不安定になる可能性があります。

See all articles