>  기사  >  데이터 베이스  >  분산 전류 제한을 구현하는 Redis의 원리 및 구현 방법

분산 전류 제한을 구현하는 Redis의 원리 및 구현 방법

WBOY
WBOY원래의
2023-05-11 16:40:591861검색

인터넷이 발전함에 따라 많은 애플리케이션에서는 다양한 요청의 흐름을 제한해야 합니다. 동시성이 높으면 애플리케이션이 많은 수의 요청으로 인해 압박을 받아 서비스가 중단되거나 느리게 응답하기 때문입니다. 이 문제를 해결하기 위해 개발자는 일반적으로 분산 전류 제한 기술을 사용하여 요청 흐름을 제어하고 서비스의 고가용성과 안정성을 보장합니다. 고성능 메모리 데이터 저장 시스템인 Redis는 일반적으로 사용되는 분산 전류 제한 솔루션 중 하나입니다. 이 글에서는 Redis에서 분산 전류 제한의 원리와 구현 방법을 소개합니다.

1. 분산 전류 제한이란?

분산 전류 제한은 여러 서버 간의 협업을 통해 요청 트래픽을 제어하는 ​​프로세스를 의미합니다. 속도 제한기는 요청 수를 계산하고, 들어오는 요청의 속도를 허용된 속도와 비교하고, 비율에 따라 요청을 수락하거나 거부합니다. 분산 조절에서 각 노드는 요청 속도와 요청 카운터를 공유하므로 모든 노드에 대해 속도가 동일하도록 보장하고 노드의 과부하를 방지합니다.

2. Redis의 분산 전류 제한 구현 원리

Redis는 내장된 데이터 구조, 특히 zset(정렬된 집합)을 사용하여 분산 전류 제한을 구현합니다. zset은 각 요소가 고유하고 점수를 갖는 정렬된 집합입니다. 점수는 요소(일반적으로 숫자 또는 시간)를 정렬하는 데 사용됩니다. 분산 전류 제한에서는 각 사용자(또는 IP 주소)에 대해 zset를 설정한 다음 이 zset를 사용하여 사용자의 요청 카운터를 저장할 수 있습니다. 각 요청이 도착하면 이를 zset에 저장하고 Redis의 INCRBY 명령을 사용하여 카운터를 증가시킵니다. 그런 다음 요청 점수와 현재 타임스탬프를 매개변수로 함께 zrangebyscore 명령에 전달하여 특정 시간 범위 내의 요청 비율을 계산합니다. 요율이 허용되는 요율을 초과하면 요청이 거부됩니다.

3. Redis가 분산 전류 제한을 구현하는 방법

분산 전류 제한을 구현하는 Redis의 구체적인 구현은 다음과 같습니다.

  1. 현재 제한 장치(하나의 전류 제한 장치는 사용자 또는 IP 주소를 나타냄)를 저장하기 위한 전역 zset을 생성하고 요청합니다. 속도 제한기당 카운터.
  2. 요청이 도착할 때마다 이를 속도 제한기의 zset에 저장하고 INCRBY 명령을 사용하여 카운터를 증가시킵니다. 기본적으로 이 명령은 매번 카운터를 1씩 증가시키지만 명령 인수를 더 높은 값으로 설정하여 증가량을 늘릴 수 있습니다.
  3. zrangebyscore 명령을 사용하면 지정된 시간 범위 내에서 요청 카운터가 있는 모든 요청을 찾아 요청 비율을 계산할 수 있습니다.
  4. 요청 비율이 허용 비율을 초과하는 경우 요청이 거부되고 오류 메시지가 반환됩니다.
  5. 요청 속도가 허용 속도를 초과하지 않는 경우 요청을 수락하고 zset에서 요청 카운터를 업데이트하세요.

다음은 Redis를 사용하여 분산 전류 제한을 구현하는 방법을 보여주는 샘플 코드입니다. 그 중 전역 zset을 사용하여 각 IP 주소에 대한 요청 카운터를 저장하고, zrangebyscore 명령을 사용하여 초당 요청 속도를 계산했습니다.

import redis
import time

class RateLimiter(object):
    def __init__(self, redis_client, rate, key_prefix='limiter'):
        self.redis = redis_client
        self.rate = rate
        self.key_prefix = key_prefix

    def allow_request(self, ip):
        key = '%s:%s' % (self.key_prefix, ip)
        now = time.time()
        count = self.redis.zcount(key, now - 1, now)
        if count < self.rate:
            self.redis.zadd(key, now, now)
            return True
        return False

if __name__ == '__main__':
    redis_client = redis.Redis()
    limiter = RateLimiter(redis_client, 5)
    for i in range(10):
        print(limiter.allow_request('192.168.1.1'))
        time.sleep(1)

위 코드에서는 먼저 Redis를 백엔드 저장소로 사용하는 RateLimiter라는 클래스를 만듭니다. 생성자는 Redis 클라이언트 인스턴스와 속도 제한이라는 두 가지 매개 변수를 허용합니다. Allow_request 메소드를 호출할 때마다 IP 주소를 나타내는 매개변수를 승인한 다음 해당 IP 주소에 대한 요청 수가 속도 제한을 초과하는지 확인합니다. 그렇지 않은 경우 요청을 수집하고 True를 반환합니다. 그렇지 않으면 요청을 거부하고 False를 반환합니다.

주 함수에서 우리는 Limiter라는 인스턴스를 생성하고 속도 제한을 5로 설정한 다음(즉, 초당 최대 5개의 요청 허용) 각 요청 사이의 간격을 1초로 하여 10개의 연속 요청을 시뮬레이션했습니다. 6번째 요청 시작 시 속도 제한에 도달했으므로 모든 요청이 거부되고 False가 반환됩니다.

4. 요약

Redis는 다양한 데이터 구조, 특히 분산 전류 제한을 구현하는 데 이상적인 zset(Sorted Set)을 제공하는 고성능 메모리 데이터 저장 시스템입니다. Redis의 zset, INCRBY 및 zrangebyscore 명령과 같은 기능을 사용하면 분산 전류 제한을 쉽게 구현하여 요청 흐름을 제어하고 서비스의 고가용성과 안정성을 보장할 수 있습니다.

위 내용은 분산 전류 제한을 구현하는 Redis의 원리 및 구현 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.