男女性高爱潮免费网站,免费人成在线观看视频播放,三级三级三级a级全黄,日日摸日日碰夜夜爽无码,国产精品久久久久精品日日,黑人巨大粗物挺进了少妇,国产麻豆一区二区三区精品视频,精品久久久久久亚洲综合网

教你2種常用的電商高并發(fā)處理解決方案

CRMEB
+ 關(guān)注
2022-11-01 11:03
1186次閱讀

網(wǎng)站架構(gòu)師面臨的最大挑戰(zhàn)之一就是并發(fā)。自Web服務(wù)開始以來,并發(fā)水平一直在不斷增長,一個主流網(wǎng)站同時服務(wù)十萬甚至數(shù)百萬用戶,這并不罕見。

就目前應(yīng)用廣泛的電商系統(tǒng)來說,各種營銷場景的增加,讓電商系統(tǒng)高并發(fā)也成為一種必然。為此,本文將給大家?guī)?種高并發(fā)解決方案,希望能為電商系統(tǒng)實現(xiàn)高并發(fā)提供一些靈感。

1、多級緩存

2、Nginx 限流

本文我們將以CRMEB商城為例,了解電商中常見的2種高并發(fā)方案

一、多級緩存?

我們以CRMEB Pro版首頁為例

教你2種常用的電商高并發(fā)處理解決方案

在上圖中,我們可以看到商品的分類變化不大,我們可以把它存儲在緩存中,這樣會大大減輕數(shù)據(jù)庫的壓力,這種情況我們可以用redis進(jìn)行緩存,但是有時候電商網(wǎng)站的并發(fā)數(shù)只靠redis,會使redis的壓力太大。這時我們在這里引入一個概念:多級緩存。

1. 什么是多級緩存

為了解決上述問題,我們在redis的基礎(chǔ)上增加了另一個nginx緩存。這時候用戶訪問我們的網(wǎng)站,會先訪問nginx緩存。如果nginx緩存不存在,他們會再次訪問redis緩存。如果redis也不存在,我們最終會訪問MySQL來獲取數(shù)據(jù)。這樣一來redis的壓力就大大降低了,然后nginx緩存和redis緩存就形成了多級緩存。

2、多級緩存怎么實現(xiàn)

了解了多級緩存的概念,我們該怎么去實現(xiàn)多級緩存呢?

我們可以使用OpenResty實現(xiàn),這是一個基于Nginx和Lua的高性能Web平臺,它將Nginx與大量復(fù)雜的Lua庫、第三方模塊和大多數(shù)依賴項集成在一起。Lua是一種輕量級緊湊腳本語言,用標(biāo)準(zhǔn)C語言編寫,以源代碼的形式開放。它被設(shè)計成嵌入在應(yīng)用程序中,從而為應(yīng)用程序提供靈活的擴展和定制功能。在實際操作中,我們通常使用Lua腳本來訪問Nginx緩存、Redis緩存和MySQL。流程圖如下:

教你2種常用的電商高并發(fā)處理解決方案

圖片來自網(wǎng)絡(luò),侵權(quán)聯(lián)系刪除

但是,在上述過程中,我們會發(fā)現(xiàn)一個問題。當(dāng)Redis緩存已經(jīng)存在時,數(shù)據(jù)庫中的數(shù)據(jù)已經(jīng)更改。此時所有用戶都訪問緩存的數(shù)據(jù),那么如何解決這個問題呢?

3、Redis 緩存同步 MySql 數(shù)據(jù)

我們可以通過 canal 解決上面的問題。canal 是一個用來監(jiān)控數(shù)據(jù)庫數(shù)據(jù)的變化的工具,可以在Mysql 數(shù)據(jù)更新時獲取其更新的數(shù)據(jù)。

解決方案:當(dāng)Mysql數(shù)據(jù)發(fā)生變化時,我們可以通過canal微服務(wù)或者用RocketMQ或Kafka配置MQ模式來改變redis中的緩存數(shù)據(jù),使Redis中的緩存數(shù)據(jù)與Mysql中的數(shù)據(jù)保持一致。??????

二、Nginx 限流

平常情況下,首頁的并發(fā)量會比較大,即使使用多級緩存,當(dāng)用戶不斷刷新頁面時,或者大量惡意請求首頁,也會對系統(tǒng)造成影響。這時候就需要采用限流方案了。

1、什么是限流

顧名思義,限流就是限制流量。比如你的手機流量包只有1 G的流量,用完了就沒了。這時候我們就可以說我們的流量被限制了,這就叫限流。

常見的限流有漏桶算法

教你2種常用的電商高并發(fā)處理解決方案

圖片來自網(wǎng)絡(luò),侵權(quán)聯(lián)系刪除

算法思路:

水(請求)從上方倒入水桶,從水桶下面流出(被處理);

來不及流出的水,儲存在水桶(緩沖器)里,以固定的速率流出;

水桶滿后水溢出(丟棄)。

這個算法的核心是:緩存請求,統(tǒng)一處理,直接丟棄冗余請求。

2、nginx 限流的方式

控制速度

我們先來說第一種,控制速度。Nginx 控制速率主要使用的是漏桶算法,這樣能夠強行保證請求的實時處理速度不會超過設(shè)置的閾值。

配置 OpenResty 中 Nginx 的配置文件,使在訪問 ip/test1 地址時進(jìn)行限流,該地址會訪問一個 Lua 腳本

user root root;
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;

#限流設(shè)置
limit_req_zone $binary_remote_addr zone=contentRateLimit:10m rate=10r/s;

sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
server {
listen 80;
server_name localhost;

location /test1{
#使用限流配置
limit_req zone=contentRateLimit;
content_by_lua_file /root/lua/test1.lua;
}
}
}

配置說明:

binary_remote_addr:是一種key,意思是基于 remote_addr(客戶端IP) 來做限流,binary_ 的目的是壓縮內(nèi)存占用數(shù)。

zone:定義了一個共享內(nèi)存區(qū)域來存儲訪問信息。 

contentRateLimit:10m 表示一個大小為10M,名字為 contentRateLimit 的內(nèi)存區(qū)域。1M可以存儲 16000 IP地址的訪問信息,10M可以存儲16W IP地址訪問信息。

Rate:用于設(shè)置最大訪問速率,rate=10r/s 表示每秒最多處理10個請求。

Nginx:實際上以毫秒為粒度來跟蹤請求信息,因此 10r/s 實際上是限制每100毫秒處理一個請求。這意味著,自上一個請求處理完后,若后續(xù)100毫秒內(nèi)又有請求到達(dá),將拒絕處理該請求。

限流速度為每秒 10 次請求,如果有10次請求同時到達(dá)一個空閑的 nginx,他們都能得到執(zhí)行嗎?

事實上,漏桶漏出請求是勻速的。10r/s是怎樣勻速的呢?每100ms漏出一個請求。在這個配置中,桶是空的,所有不能實時漏出的請求,會被拒絕掉。所以如果10次請求同時到達(dá),那么只有一個請求能夠得到執(zhí)行,其它的,都會被拒絕。這不太友好,大部分業(yè)務(wù)場景下我們希望這10個請求都能得到執(zhí)行。

處理突發(fā)流量

上述情況稱為突發(fā)流量,上面的例子僅限于10r/s,如果正常流量突然增加,超出的請求會被拒絕,無法處理突發(fā)流量,可以結(jié)合 burst 參數(shù)使用來解決該問題。

修改上文中的 Nginx 配置文件

server {
listen 80;
server_name localhost;
location /test1 {
limit_req zone=contentRateLimit burst=20 nodelay;
content_by_lua_file /root/lua/test1.lua;
}  
}

burst 譯為突發(fā)、爆發(fā),表示在超過設(shè)定的處理速率后能額外處理的請求數(shù),當(dāng) rate=10r/s 時,將1s拆成10份,即每100ms可處理1個請求。

此處,burst=12,若同時有12個請求到達(dá),Nginx 會處理第一個請求,剩余11個請求將放入隊列,然后每隔100ms從隊列中獲取一個請求進(jìn)行處理。若請求數(shù)大于12,將拒絕處理多余的請求,直接返回 503。

不過,單獨使用 burst 參數(shù)并不實用。假設(shè) burst=50 ,rate依然為10r/s,排隊中的50個請求雖然每100ms會處理一個,但第50個請求卻需要等待 50 * 100ms即 5s,這么長的處理時間自然難以接受。

因此,burst 往往結(jié)合 nodelay 一起使用。

繼續(xù)修改上文中的 Nginx 配置文件

server {
listen 80;
server_name localhost;
location /test1 {
limit_req zone=contentRateLimit burst=20 nodelay;
content_by_lua_file /root/lua/test1.lua;
}  
}

平均每秒允許不超過10個請求,突發(fā)不超過20個請求,并且處理突發(fā)20個請求的時候,沒有延遲,等到完成之后,按照正常的速率處理。

如上兩種配置結(jié)合就達(dá)到了速率穩(wěn)定,但突然流量也能正常處理的效果。

控制并發(fā)量(連接數(shù))

nginx 還提供了利用連接數(shù)限制某一個用戶的ip連接的數(shù)量來控制流量。一種是限制固定連接數(shù),第二種是限制每個客戶端IP與服務(wù)器的連接數(shù),同時限制與服務(wù)器的連接總數(shù)。

注意:并非所有連接都被計算在內(nèi),只有當(dāng)服務(wù)器正在處理請求并且已經(jīng)讀取了整個請求頭時,才會計算有效連接。

配置限制固定連接數(shù):

http {
include mime.types;
default_type application/octet-stream;
#限流設(shè)置
limit_req_zone $binary_remote_addr zone=contentRateLimit:10m rate=10r/s;
#根據(jù)IP地址來限制,存儲內(nèi)存大小10M
limit_conn_zone $binary_remote_addr zone=addr:1m;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
server {
listen 80;
server_name localhost;
location /test2 {
limit_conn addr 2;
content_by_lua_file /root/lua/test2.lua;
}                                                        
location /test1 {
limit_req zone=contentRateLimit burst=20 nodelay;
content_by_lua_file /root/lua/test1.lua;
}    
}
}

limit_conn_zone $binary_remote_addr zone=addr:10m; 表示限制根據(jù)用戶的IP地址來顯示,設(shè)置存儲地址為的內(nèi)存大小10M

limit_conn addr 2; 表示同一個地址只允許連接2次。

限制每個客戶端IP與服務(wù)器的連接數(shù),同時限制與服務(wù)器的連接總數(shù):

http {
include mime.types;
default_type application/octet-stream;
#限流設(shè)置
limit_req_zone $binary_remote_addr zone=contentRateLimit:10m rate=10r/s;
#存儲個人請求IP的限流配置
limit_conn_zone $binary_remote_addr zone=perip:10m;
#整個location對應(yīng)的請求并發(fā)容量配置
limit_conn_zone $server_name zone=perserver:100m;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
server {
listen 80;
server_name localhost;
location /test2 {
limit_conn perip 10;#單個客戶端ip與服務(wù)器的連接數(shù)"10"
limit_conn perserver 100; #限制與服務(wù)器的總連接數(shù)"100"
content_by_lua_file /root/lua/test2.lua;
}                                                        
location /test1 {
limit_req zone=contentRateLimit burst=20 nodelay;
content_by_lua_file /root/lua/test1.lua;
}    
}
}
總結(jié):我們在redis的基礎(chǔ)上增加了另一個nginx緩存就能實現(xiàn)多級緩存,使用漏桶算法可以實現(xiàn)限流的效果,再結(jié)合 burst 參數(shù)使用來解決突發(fā)流量的處理。這幾種方法相結(jié)合,就能實現(xiàn)電商系統(tǒng)高并發(fā)。如果還有不明白之處可以在下方留言,大家一起學(xué)習(xí)討論。

[免責(zé)聲明]

原文標(biāo)題: 教你2種常用的電商高并發(fā)處理解決方案

本文由作者原創(chuàng)發(fā)布于36氪企服點評;未經(jīng)許可,禁止轉(zhuǎn)載。

資深作者CRMEB
CRMEB
0
西安眾邦網(wǎng)絡(luò)科技有限公司
實力廠商
實力廠商
優(yōu)質(zhì)服務(wù)
優(yōu)質(zhì)服務(wù)
及時響應(yīng)
及時響應(yīng)
立即詢價
相關(guān)文章
最新文章
查看更多
關(guān)注 36氪企服點評 公眾號
打開微信掃一掃
為您推送企服點評最新內(nèi)容
消息通知
咨詢?nèi)腭v
商務(wù)合作
主站蜘蛛池模板: 欧美亚洲国产一区二区三区| 果冻传媒2021精品一区| 欧美成人www在线观看| 鲁一鲁一鲁一鲁一曰综合网| 亚洲精品宾馆在线精品酒店| 国产爆乳无码一区二区麻豆| 给我免费观看片在线| 欧洲男同gay| 成人h动漫精品一区二区樱花动漫| 国产精品无码无片在线观看3d| 亚洲av一般男女在线| 国产无线乱码一区二三区| 精品国偷自产在线视频| 色天天躁夜夜躁天干天干| 人人妻人人爽人人做夜欢视频九色 | 国产欧美精品另类又又久久| 精品免费看国产一区二区| 国产无线乱码一区二三区| 最近的2019中文字幕国语hd| 亚洲av无码专区在线观看成人 | 精品免费看国产一区二区| 777米奇色狠狠俺去啦奇米77| 蜜桃视频app下载网站| 亚洲色图片区| 入禽太深日本免费观看| 人人妻久久人人澡人人爽人人精品| 吃奶还摸下面动态图gif| 少妇被粗大的猛烈进出小说网| 女人18片毛片60分钟| 国产毛多水多高潮高清| jzzijzzij亚洲成熟少妇| 亚洲精品无码专区在线| 国产免费视频| 国产精品va在线播放我和闺蜜| 亚洲乱妇熟女爽到高潮的片| 色欲av永久无码精品无码| 粉嫩大学生无套内射无码卡视频| 孩交videos精品乱子| 亚洲一区无码中文字幕| 久久无码人妻精品一区二区三区 | 99精品国产一区二区三区|