인터넷이 발전함에 따라 많은 애플리케이션에서는 다양한 요청의 흐름을 제한해야 합니다. 동시성이 높으면 애플리케이션이 많은 수의 요청으로 인해 압박을 받아 서비스가 중단되거나 느리게 응답하기 때문입니다. 이 문제를 해결하기 위해 개발자는 일반적으로 분산 전류 제한 기술을 사용하여 요청 흐름을 제어하고 서비스의 고가용성과 안정성을 보장합니다. 고성능 메모리 데이터 저장 시스템인 Redis는 일반적으로 사용되는 분산 전류 제한 솔루션 중 하나입니다. 이 글에서는 Redis에서 분산 전류 제한의 원리와 구현 방법을 소개합니다.
1. 분산 전류 제한이란?
분산 전류 제한은 여러 서버 간의 협업을 통해 요청 트래픽을 제어하는 프로세스를 의미합니다. 속도 제한기는 요청 수를 계산하고, 들어오는 요청의 속도를 허용된 속도와 비교하고, 비율에 따라 요청을 수락하거나 거부합니다. 분산 조절에서 각 노드는 요청 속도와 요청 카운터를 공유하므로 모든 노드에 대해 속도가 동일하도록 보장하고 노드의 과부하를 방지합니다.
2. Redis의 분산 전류 제한 구현 원리
Redis는 내장된 데이터 구조, 특히 zset(정렬된 집합)을 사용하여 분산 전류 제한을 구현합니다. zset은 각 요소가 고유하고 점수를 갖는 정렬된 집합입니다. 점수는 요소(일반적으로 숫자 또는 시간)를 정렬하는 데 사용됩니다. 분산 전류 제한에서는 각 사용자(또는 IP 주소)에 대해 zset를 설정한 다음 이 zset를 사용하여 사용자의 요청 카운터를 저장할 수 있습니다. 각 요청이 도착하면 이를 zset에 저장하고 Redis의 INCRBY 명령을 사용하여 카운터를 증가시킵니다. 그런 다음 요청 점수와 현재 타임스탬프를 매개변수로 함께 zrangebyscore 명령에 전달하여 특정 시간 범위 내의 요청 비율을 계산합니다. 요율이 허용되는 요율을 초과하면 요청이 거부됩니다.
3. Redis가 분산 전류 제한을 구현하는 방법
분산 전류 제한을 구현하는 Redis의 구체적인 구현은 다음과 같습니다.
다음은 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!