2017-01-28 5 views
0

사용자를 시간당 25k/요청으로 제한하고 싶습니다.웹 기반 앱에서 요청을 제한하는 할당량 시스템 구현

첫 번째 아이디어는 mysql을 사용하고 사용자 테이블에 요청을 저장하는 열이 있고 사용자가 요청할 때마다이 카운터를 증가시키는 것입니다. 이 접근법의 문제점은 때때로 열에 동시에 글을 쓰게되고 mysql에서 교착 상태가 발생하는 경우가 있기 때문에이 방법이 좋은 방법이 아닌가?

또 다른 방법은 열의 카운터를 증가시키지 않고 별도의 테이블에 로그 레코드를 삽입 한 다음 주어진 시간 간격 동안이 레코드를 계산하는 것입니다. 그러나이 방법을 사용하면 백만 개의 레코드 테이블과 쿼리가 너무 느려질 수 있습니다.

RDBMS를 사용하는 경우 각 요청시 데이터베이스에서 사용자 할당량을 계산해야하며 위의 방법 중 하나에 따라 시간이 걸릴 수 있다는 점을 고려해야합니다.

두 번째 아이디어, redis/memcached (대안이 확실하지 않거나 어느 것이 더 빠르는지)를 사용하여 요청 카운터를 저장하는 것이 좋습니다. 이것은 쿼리와 카운터를 증가시키기에 충분히 빠르며, RDBMS보다 확실히 빠르지 만 방대한 양의 데이터로 시도하지 않았기 때문에 아직 어떻게 수행 될지 확신 할 수 없습니다.

제 3의 아이디어는지도에서 메모리에 할당량 데이터를 유지하는 것이고 map[int]int과 같은 것이고 키는 user_id이고 값은 할당량 사용이며 뮤텍스가있는지도 액세스를 보호합니다. 이것은 가장 빠른 해결책 일 것입니다. 그러나 어떤 이유로 앱이 다운되면 특정 사용자가 한 요청 수와 관련된 모든 데이터를 잃게됩니다. 한 가지 방법은 충돌 할 때 앱을 잡아서지도를 반복하고 데이터베이스를 업데이트하는 것입니다. 이것이 가능한가?

위의 방법 중 하나가 올바른 방법인지는 모르겠지만 제안 사항에 대해서는 확신 할 수 없습니다.

+0

웹 응용 프로그램에 대해 이야기하고 있기 때문에 많은 간단한 카운터를 보유하는 메모리 구조를 최적화 한 HAProxy를 사용하면 간단하고 훨씬 가벼운 솔루션을 만들 수 있습니다. 속도 제한] (http://blog.serverfault.com/2010/08/26/1016491873/). –

답변

1

동시에 행을 업데이트하려고 할 때 "get a deadlock from mysql"이 무슨 뜻인지 확신 할 수 없습니다. 그러나 간단한 update rate_limit set count = count + 1 where user_id = ?은 원하는 것을해야합니다.

저는 개인적으로 속도 제한을 수행하는 Redis에서 큰 성공을 거두었습니다. 유스 케이스에 대한 적절한 접근 방식을 이해하는 데 도움이되는 많은 리소스가 있습니다. 여기에 내가 흘끗 보았던 것 하나가 정확하게 처리하는 것 같습니다 : https://www.binpress.com/tutorial/introduction-to-rate-limiting-with-redis/155. 파이프 라인 (MULTI)이나 루아 스크립트를 사용하면 더 좋은 것들을 만들 수 있습니다.

+0

답장을 보내 주셔서 감사합니다. atm에 정확한 오류 코드가 없습니다. 그러나 병렬 요청을 수행 할 때 문제가 발생하며 둘 이상의 요청이 동시에 해당 열을 업데이트하려고하면 문제가 발생합니다. 실패 할 것이다. 나는 원자 갱신을 할 수있는 방법이 필요하다고 생각하지만, 아무것도 발견하지 못했다. redis 링크를 이용해 주셔서 감사합니다. – Twisted1919

+0

@ Twisted1919 이는 교착 상태가 아닙니다. 원자 적 업데이트가 좋으며 잠금 경합이 투명하게 처리됩니다. 교착 상태는 두 트랜잭션이 각각 다른 트랜잭션이 이미 보유하고있는 잠금을 획득하려고 시도 할 때 발생합니다. 한 행의 한 열에 대한 간단한 원자 적 업데이트에서는 발생하지 않습니다. –

0

map[int]int을 RDBMS에 보관하거나 파일 시스템 시간과 지연 기능을 유지할 수 있습니다. redis 대신 캐시로 사용할 수도 있습니다. 확실히 모든 요청에 ​​대해 제 3 자 서비스에 연결하는 것보다 빠를 것입니다. 또한 단순히 쿠키에 사용자 측에 카운터를 저장할 수 있습니다. 똑똑한 사용자는 쿠키를 삭제할 수 있지만 너무 위험하므로 쿠키에 식별 정보를 제공하여 불편을 없앨 수 있습니다.