高并發抽獎系統優化方案

在這里插入圖片描述

引子

最近接觸了一個抽獎的項目,由于用戶量比較大,而且第三方提供的認證接口并發量有限,為了保證服務的高可用性,所以對高并限制發有一定的要求。經過一系列研究和討論,做出了以下一些優化方案。

需求分析

  • 根據用戶量和日活情況,估算出并發值在100左右,所以該項目的并發量就當在100上以,初期目標定為600-800

  • 特定頁面的并發量不超過300,為了保證不對第三方服務造成訪問壓力,特將并發控制在150以內

  • 由于獎品數量有限,故得獎時,需要進行并發寫入控制,防止獎品超發

實施步驟

前端方面

減少客戶端訪問次數。
  • 使用CDN對網站的靜態資源進行優化,可以答復靜態請求次數。

  • 抽獎結果一次性生成。

每個用戶有有一次抽獎機會,但只能有一次中獎,其他兩次隨機彈出推薦產品。所以有一次抽獎中,只需要訪問一次服務器的抽獎接口。

  • 使用本地緩存。

將抽獎次數,是否中獎等信息記錄在本地,避免超次抽獎和多余的服務器請求。例如,一旦該用戶中過將,就不需要再訪問服務器抽獎接口。

服務端優化

使用緩存
  • 使用服務端緩存。

將頁面和相關數據查詢進行緩存,減少數據庫訪問次數。

部分業務邏輯異步處理

對于不需要實時處理的業務邏輯,壓入隊列,實現異步處理。例如優惠券的發放。

Nginx 優化
  • 提高 Nginx 處理性能

使用 worker_processesworker_cpu_affinityworker_rlimit_nofileworker_connectionsopen_file_cache等命令,提高nginx的處理性能。

  • Nginx 并發控制。

先看實例,如下:

    limit_req_zone $binary_remote_addr zone=req_ip:10m rate=40r/s; // #每個IP平均處理的請求頻率為每秒40次limit_conn_zone $binary_remote_addr zone=conn_ip:10m;limit_conn_zone $server_name zone=conn_server:10m;limit_conn conn_ip 5; // #限制某個IP來源的連接并發數,此處為5個limit_conn conn_server 600; //#限制某個虛擬服務器的總連接數,此處為600個limit_req zone=req_ip burst=5; //小為5的緩沖區, 當有大量請求過來時,超過了訪問頻次限制的請求可以先放到這個緩沖區內

在這里,限制了每個IP的請求頻率,限制了同一IP的并發連接數,限制了服務器的總連接數

  • 使用 Docker 實現負載均衡

配置 nginx, 使用負載均衡

    upstream icontact_pool {server  web:9000    weight=5    max_fails=3 fail_timeout=10s;server  web2:9000   weight=5    max_fails=3 fail_timeout=10s;server  web3:9000   weight=5    max_fails=3 fail_timeout=10s;...}

如上,通過 Docker 啟動多個處理請求的服務容器,在 nginx 中配置每個服務的地址,權重等信息,擴大請求的處理能力

  • 其他服務器環境優化

例如,增加服務器配置(CPU,內存,帶寬),如果是PHP, 開啟 opcache, 并使用較新版本(php7+), 各種依賴盡量使用最新版本。

zend_extension=opcache.so
opcache.enable=1
opcache.enable_cli=1

參考資料

  • Nginx限制IP并發連接數和請求數的研究

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/83116.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/83116.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/83116.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

STM32八股【10】-----stm32啟動流程

啟動流程 1.上電復位 2.系統初始化 3.跳轉到 main 函數 啟動入口: cpu被清空,程序從0x00000000開始運行0x00000000存放的是reset_handler的入口地址0x00000000的實際位置會變,根據不同的啟動模式決定啟動模式分為: flash啟動&a…

LLMTIME: 不用微調!如何用大模型玩轉時間序列預測?

今天是端午節,端午安康!值此傳統佳節之際,我想和大家分享一篇關于基于大語言模型的時序預測算法——LLMTIME。隨著人工智能技術的飛速發展,利用大型預訓練語言模型(LLM)進行時間序列預測成為一個新興且極具…

在VirtualBox中打造高效開發環境:CentOS虛擬機安裝與優化指南

🔥「炎碼工坊」技術彈藥已裝填! 點擊關注 → 解鎖工業級干貨【工具實測|項目避坑|源碼燃燒指南】 一、為何選擇VirtualBox CentOS組合? 對于程序員而言,構建隔離的開發測試環境是剛需。VirtualBox憑借其跨平臺支持(W…

LeeCode 98. 驗證二叉搜索樹

給你一個二叉樹的根節點 root ,判斷其是否是一個有效的二叉搜索樹。 有效 二叉搜索樹定義如下: 節點的左子樹只包含 小于 當前節點的數。節點的右子樹只包含 大于 當前節點的數。所有左子樹和右子樹自身必須也是二叉搜索樹。 提示: 樹中節…

Python簡易音樂播放器開發教程

📚 前言 編程基礎第一期《12-30》–音樂播放器是日常生活中常用的應用程序,使用Python和pygame庫可以輕松實現一個簡易的音樂播放器。本教程將詳細講解如何開發一個具有基本功能的音樂播放器,并解析其中涉及的Python編程知識點。 &#x1f6e…

ssh連接斷開,保持任務后臺執行——tmux

目錄 **核心用途****基礎使用方法**1. **安裝 tmux**2. **啟動新會話**3. **常用快捷鍵(需先按 Ctrlb 前綴)**4. **會話管理命令**5. **窗格操作進階** **典型工作流****注意事項****配置文件(~/.tmux.conf)** tmux( …

3D Gaussian splatting 04: 代碼閱讀-提取相機位姿和稀疏點云

目錄 3D Gaussian splatting 01: 環境搭建3D Gaussian splatting 02: 快速評估3D Gaussian splatting 03: 用戶數據訓練和結果查看3D Gaussian splatting 04: 代碼閱讀-提取相機位姿和稀疏點云3D Gaussian splatting 05: 代碼閱讀-訓練整體流程3D Gaussian splatting 06: 代碼…

每日c/c++題 備戰藍橋杯(P1204 [USACO1.2] 擠牛奶 Milking Cows)

P1204 [USACO1.2] 擠牛奶 Milking Cows - 詳解與代碼實現 一、題目背景 三個農民每天清晨[……](簡要介紹題目背景,與官網描述類似) 二、問題分析 輸入要求 :讀取 N 個農民的擠奶時間區間,計算兩個值:最…

保持本地 Git 項目副本與遠程倉庫完全同步

核心目標: 保持本地 Git 項目副本與 GitHub 遠程倉庫完全同步。 關鍵方法: 定期執行 git pull 命令。 操作步驟: 進入項目目錄: 在終端/命令行中,使用 cd 命令切換到你的項目文件夾。執行拉取命令: 運行…

Flutter 4.x 版本 webview_flutter 嵌套H5

踩坑早期版本 使用 WebView 代碼如下 import package:flutter/material.dart; import package:webview_flutter/webview_flutter.dart;class HomePage extends StatelessWidget {const HomePage({super.key});overrideWidget build(BuildContext context) {return Scaffold(ap…

rtpinsertsound:語音注入攻擊!全參數詳細教程!Kali Linux教程!

簡介 2006年8月至9月期間,我們創建了一個用于將音頻插入指定音頻(即RTP)流的工具。該工具名為rtpinsertsound。 該工具已在Linux Red Hat Fedora Core 4平臺(奔騰IV,2.5 GHz)上進行了測試,但預…

跑步前熱身動作

跑前熱身的核心目標是升高體溫、激活肌肉、預防損傷 ,同時通過動態動作提升運動表現。熱身(步驟關節→肌肉→心肺)和針對性動作(如抱膝抬腿)能有效降低受傷風險,建議每次跑步前嚴格執行。 推薦跑前熱身動作…

GIT命令行的一些常規操作

放棄修改 git checkout . 修改commit信息 git commit --amend 撤銷上次本地commit 1、通過git log查看上次提交的哈希值 2、git reset --soft 哈希值 分支 1.創建本地分支 git branch 分支名 2.切換本地分支 git checkout mybranch; 3.創建一個新分支并…

RAGFlow從理論到實戰的檢索增強生成指南

目錄 前言 一、RAGFlow是什么?為何需要它? 二、RAGFlow技術架構拆解 三、實戰指南:從0到1搭建RAGFlow系統 步驟1:環境準備 步驟2:數據接入 步驟3:檢索與生成 四、優化技巧:讓RAGFlow更精…

軟件工程方法論:在確定性與不確定性的永恒之舞中尋找平衡

當我們談論“軟件工程”時,“工程”二字總暗示著某種如橋梁建造般的精確與可控。然而,軟件的本質卻根植于人類思維的復雜性與需求的流變之中。軟件工程方法論的發展史,并非線性進步的凱歌,而是一部在確定性的渴望與不確定性的現實…

Python打卡訓練營Day41

DAY 41 簡單CNN 知識回顧 數據增強卷積神經網絡定義的寫法batch歸一化:調整一個批次的分布,常用與圖像數據特征圖:只有卷積操作輸出的才叫特征圖調度器:直接修改基礎學習率 卷積操作常見流程如下: 1. 輸入 → 卷積層 →…

開源版 PyMOL 如何繪制 Galidesivir 分子結構 ?

參閱:開源版PyMol安裝保姆級教程 百度網盤下載 提取碼:csub pip show pymol 簡介: PyMOL是一個Python增強的分子圖形工具。它擅長蛋白質、小分子、密度、表面和軌跡的3D可視化。它還包括分子編輯、射線追蹤和動畫。 先從 www.python.org 下載 python-…

【FPGA】Vivado 保姆級安裝教程 | 從官網下載安裝包開始到安裝完畢 | 每步都有詳細截圖說明 | 支持無腦跟裝

安裝包下載:Xilinx_Vivado Download Link(下好后可直接安裝) 目錄 (有安裝包后,可直接跳轉至 Step5,免得去官網下了,比較麻煩) Step1:進入官網 Step2:注冊…

純html,js創建一個類似excel的表格

后臺是php,表中數據可編輯,可刪除,可提交到數據庫 <!DOCTYPE html> <html> <head><meta charset="utf-8"><style>body {font-family: Arial, sans-serif;margin: 20px;background-color: #fff;}.toolbar {margin-bottom: 10px;disp…

密碼編碼器使用指南

密碼編碼器概述 通過第三章的學習,您應該已經對UserDetails接口及其多種實現方式有了清晰認識。如第二章所述,在認證授權流程中,不同參與者負責管理用戶憑證的表示形式,其中UserDetailsService和PasswordEncoder等組件都提供了默認實現。本節將重點分析PasswordEncoder的核…