1. 程式人生 > >基於 Redis 實現分散式應用限流

基於 Redis 實現分散式應用限流

限流的目的是通過對併發訪問/請求進行限速或者一個時間視窗內的的請求進行限速來保護系統,一旦達到限制速率則可以拒絕服務

實際場景中常用的限流策略:

  • Nginx接入層限流
    按照一定的規則如帳號、IP、系統呼叫邏輯等在Nginx層面做限流

  • 業務應用系統限流
    通過業務程式碼控制流量這個流量可以被稱為訊號量,可以理解成是一種鎖,它可以限制一項資源最多能同時被多少程序訪問。

程式碼實現

640?wx_fmt=png&wxfrom=5&wx_lazy=1

呼叫

640?wx_fmt=png

優化

使用攔截器 + 註解優化程式碼

攔截器

640?wx_fmt=png

定義註解

640?wx_fmt=png

使用

640?wx_fmt=png

併發測試

工具:apache-jmeter-3.2
說明:沒有獲取到訊號量的介面返回500,status是紅色,獲取到訊號量的介面返回200,status是綠色。
當限制請求訊號量為2,併發5個執行緒: 

640?wx_fmt=png
當限制請求訊號量為5,併發10個執行緒:
640?wx_fmt=png

總結

  • 對於訊號量的操作,使用事務操作。

  • 不要使用時間戳作為訊號量的排序分數,因為在分散式環境中,各個節點的時間差的原因,會出現不公平訊號量的現象。

  • 可以使用把這塊程式碼抽成@rateLimiter註解,然後再方法上使用就會很方便啦

  • 不同介面的流控,可以參考原始碼的裡面RedisRateLimiterPlus,無非是每個介面生成一個監控引數

  • 限流技巧請點選原文連線

  • 原始碼連結:http://pan.baidu.com/s/1dEA4RvV 密碼:3ywi

640?wx_fmt=png

看完本文有收穫?請轉發分享給更多人

歡迎關注“暢聊架構”,我們分享最有價值的網際網路技術乾貨文章,助力您成為有思想的全棧架構師,我們只聊網際網路、只聊架構,不聊其他!打造最有價值的架構師圈子和社群。

長按下方的二維碼可以快速關注我們

640?wx_fmt=jpeg

相關推薦

基於 Redis 實現分散式應用

限流的目的是通過對併發訪問/請求進行限速或者一個時間視窗內的的請求進行限速來保護系統,一旦達到限制速率則可以拒絕服務 實際場景中常用的限流策略: Nginx接入層限流 按照一定的規則如帳號、

基於redis分散式RateLimiter()實現

業務背景 系統需要對接某IM廠商rest介面,向客戶端推送訊息(以及其他IM業務) 該廠商對rest介面呼叫有頻率限制:總rest呼叫9000次/30s;訊息推送600次/30s 系統為分散式叢集,需要控制整個分散式叢集總的介面呼叫頻率滿足以

Java併發:分散式應用 Redis + Lua 實踐

任何限流都不是漫無目的的,也不是一個開關就可以解決的問題,常用的限流演算法有:令牌桶,漏桶。在之前的文章中,也講到過,但是那是基於單機場景來寫。 然而再牛逼的機器,再優化的設計,對於特殊場景我們也是要特殊處理的。就拿秒殺來說,可能會有百萬級別的使用者進行搶

基於Redis實現分散式

背景 在很多網際網路產品應用中,有些場景需要加鎖處理,比如:秒殺,全域性遞增ID,樓層生成等等。大部分的解決方案是基於DB實現的,Redis為單程序單執行緒模式,採用佇列模式將併發訪問變成序列訪問,且多客戶端對Redis的連線並不存在競爭關係。其次Redis提供一些命令SETNX,GETSET,可以方便

基於 Redis 實現分散式

什麼是Redis? Redis通常被稱為資料結構伺服器。這意味著Redis通過一組命令提供對可變資料結構的訪問,這些命令使用帶有TCP套接字和簡單協議的伺服器 - 客戶端模型傳送。因此,不同的程序可以以共享方式查詢和修改相同的資料結構。 Redis中實現的資料結構有一些特殊屬性:

基於Redis實現分散式鎖-Redisson使用及原始碼分析

在分散式場景下,有很多種情況都需要實現最終一致性。在設計遠端上下文的領域事件的時候,為了保證最終一致性,在通過領域事件進行通訊的方式中,可以共享儲存(領域模型和訊息的持久化資料來源),或者做全域性XA事務(兩階段提交,資料來源可分開),也可以藉助訊息中介軟體(消

Java併發:分散式應用實踐

任何限流都不是漫無目的的,也不是一個開關就可以解決的問題,常用的限流演算法有:令牌桶,漏桶。在之前的文章中,也講到過,但是那是基於單機場景來寫。 然而再牛逼的機器,再優化的設計,對於特殊場景我們也是要特殊處理的。就拿秒殺來說,可能會有百萬級別的使用者進行搶購,而商品數量遠遠小於使用者數量。如

基於Redis實現分散式訊息佇列(彙總目錄)

基於Redis實現分散式訊息佇列(1)– 緣起 基於Redis實現分散式訊息佇列(2)– 分散式訊息佇列功能設計 基於Redis實現分散式訊息佇列(3)– Redis功能分析 基於Redis實現分散式訊息佇列(4)– 程式碼實現

基於Redis實現分散式訊息佇列(1)

1、為什麼需要訊息佇列? 當系統中出現“生產“和“消費“的速度或穩定性等因素不一致的時候,就需要訊息佇列,作為抽象層,彌合雙方的差異。 舉個例子:業務系統觸發簡訊傳送申請,但簡訊傳送模組速度跟不上,需要將來不及處理的訊息暫存一下,緩衝壓力。 再舉個例子:調

基於Redis實現分散式訊息佇列(4)

1、訪問Redis的工具類 public class RedisManager { private static Pool<Jedis> pool; protected final static Logger logger

基於Redis實現分散式訊息佇列(3)

1、Redis是什麼鬼? Redis是一個簡單的,高效的,分散式的,基於記憶體的快取工具。 假設好伺服器後,通過網路連線(類似資料庫),提供Key-Value式快取服務。 簡單,是Redis突出的特色。 簡單可以保證核心功能的穩定和優異。 2、效能

基於Redis分散式

遇到這種場景:要求某個介面1s最多請求10次,在分散式環境下guava的RateLimiter用不上。redis可以滿足需求,於是baidu一下redis分散式限流的程式碼實現,總結看基本分為兩種,指令碼實現、非指令碼實現。非指令碼實現缺點明顯,lua實現優勢

Java並發:分布式應用 Redis + Lua 實踐

con ebe ber ignorecas rgs config 網關 weixin itl 任何限流都不是漫無目的的,也不是一個開關就可以解決的問題,常用的限流算法有:令牌桶,漏桶。在之前的文章中,也講到過,但是那是基於單機場景來寫。 之前文章:接口限流算法:漏桶算法&a

實現基於redis分散式鎖並整合spring-boot-starter

文章目錄 概述 使用 1.導包 2.寫一個實現鎖功能的service 3.檢查redis的key 4.呼叫(鎖成功) 5.呼叫(鎖失敗) 實現

分散式鎖(三)__基於redis實現

本文參考借鑑了論壇大佬的一篇很詳細的博文並在此基礎上加以實現,在此謝謝此位博主!,博文連線: https://www.cnblogs.com/linjiqin/p/8003838.html 前言 首先,為了確保分散式鎖可用,我們至少要確保鎖的實現同時滿足以下四個條件: 互斥

dubbo 常用的基於redis分散式實現

  小弟本著先會用在學習原理的原則 先用了dubbo 現在在實際業務中 因為分散式專案做了叢集,需要用的分散式鎖,就用到了基於redis的分散式鎖,廢話不多說,先來程式碼: package com.tiancaibao.utils; import org.slf4j.Logger

分散式鎖 -- 基於redis實現

基於Redis實現的鎖機制,主要是依賴redis自身的原子操作,例如: SET user_key user_value NX PX 100 redis從2.6.12版本開始,SET命令才支援這些引數: NX:只在在鍵不存在時,才對鍵進行設定操作,SET key value NX 效果等同於

分散式鎖與實現——基於Redis實現

概述 目前幾乎很多大型網站及應用都是分散式部署的,分散式場景中的資料一致性問題一直是一個比較重要的話題。分散式的CAP理論告訴我們“任何一個分散式系統都無法同時滿足一致性(Consistency)、可用性(Availability)和分割槽容錯性(Partition to

Redis實現分散式鎖(spring定時任務叢集應用Redis分散式鎖)

         之前2片文章介紹了 描述:              不管用不用動態執行,單機服務都是沒有問題的,但是如果服務是叢集模式下,那麼一個任務在每臺機器都會執行一次,這肯定不是我們需要的,我們要實現的是整個叢集每次只有一個任務執行成功,但是spring

【原創】redis庫存操作,分散式鎖的四種實現方式[連載一]--基於zookeeper實現分散式

一、背景 在電商系統中,庫存的概念一定是有的,例如配一些商品的庫存,做商品秒殺活動等,而由於庫存操作頻繁且要求原子性操作,所以絕大多數電商系統都用Redis來實現庫存的加減,最近公司專案做架構升級,以微服務的形式做分散式部署,對庫存的操作也單獨封裝為一個微服務,這樣在高併發情況下,加減庫存時,就會出現超賣等