ããŒã¯ã³ãã±ããã¢ã«ãŽãªãºã ãäžå¿ã«ã¬ãŒãå¶éæŠç¥ãæ¢ããŸãããã®å®è£ ãå©ç¹ãæ¬ ç¹ããããŠå埩åãšæ¡åŒµæ§ã®ããã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããããã®å®çšçãªãŠãŒã¹ã±ãŒã¹ã«ã€ããŠåŠã³ãŸãã
ã¬ãŒãå¶éïŒããŒã¯ã³ãã±ããå®è£ ã®æ·±æã
仿¥ã®çžäºæ¥ç¶ãããããžã¿ã«ç°å¢ã«ãããŠãã¢ããªã±ãŒã·ã§ã³ãšAPIã®å®å®æ§ãšå¯çšæ§ã確ä¿ããããšã¯æãéèŠã§ããã¬ãŒãå¶éã¯ããŠãŒã¶ãŒãã¯ã©ã€ã¢ã³ãããªã¯ãšã¹ããè¡ããã¬ãŒããå¶åŸ¡ããããšã§ããã®ç®æšãéæããäžã§éèŠãªåœ¹å²ãæãããŸãããã®ããã°èšäºã§ã¯ãã¬ãŒãå¶éæŠç¥ã«ã€ããŠãç¹ã«ããŒã¯ã³ãã±ããã¢ã«ãŽãªãºã ããã®å®è£ ãå©ç¹ãæ¬ ç¹ã«çŠç¹ãåœãŠãŠå æ¬çã«æ¢ããŸãã
ã¬ãŒãå¶éãšã¯ïŒ
ã¬ãŒãå¶éã¯ãç¹å®ã®æéã«ãµãŒããŒããµãŒãã¹ã«éä¿¡ããããã©ãã£ãã¯ã®éãå¶åŸ¡ããããã«äœ¿çšãããæè¡ã§ããããã«ãããéå°ãªãªã¯ãšã¹ãã«ããã·ã¹ãã ã®éè² è·ãé²ãããµãŒãã¹æåŠïŒDoSïŒæ»æãäžæ£å©çšãäºæãã¬ãã©ãã£ãã¯ã¹ãã€ã¯ããã·ã¹ãã ãä¿è·ããŸãããªã¯ãšã¹ãæ°ã«å¶éãèšããããšã§ãã¬ãŒãå¶éã¯å ¬æ£ãªå©çšã確ä¿ããã·ã¹ãã å šäœã®ããã©ãŒãã³ã¹ãåäžãããã»ãã¥ãªãã£ã匷åããŸãã
ãã©ãã·ã¥ã»ãŒã«äžã®eã³ããŒã¹ãã©ãããã©ãŒã ãèããŠã¿ãŸããããã¬ãŒãå¶éããªããã°ããŠãŒã¶ãŒãªã¯ãšã¹ãã®æ¥å¢ã«ãããµãŒããŒãéè² è·ç¶æ ã«é¥ããå¿çæéãé ããªã£ããããµãŒãã¹ã忢ãããããå¯èœæ§ããããŸããã¬ãŒãå¶éã¯ããŠãŒã¶ãŒïŒãŸãã¯IPã¢ãã¬ã¹ïŒãç¹å®ã®æéå ã«éä¿¡ã§ãããªã¯ãšã¹ãæ°ãå¶éããããšã§ãããé²ãããã¹ãŠã®ãŠãŒã¶ãŒã«ãšã£ãŠããã¹ã ãŒãºãªäœéšãä¿èšŒããŸãã
ãªãã¬ãŒãå¶éã¯éèŠãªã®ãïŒ
ã¬ãŒãå¶éã¯ã以äžã®ãããªå€ãã®å©ç¹ãæäŸããŸãïŒ
- ãµãŒãã¹æåŠïŒDoSïŒæ»æã®é²æ¢ïŒ åäžã®ãœãŒã¹ããã®ãªã¯ãšã¹ãã¬ãŒããå¶éããããšã§ãã¬ãŒãå¶éã¯ãµãŒããŒãæªæã®ãããã©ãã£ãã¯ã§å§åããããšãç®çãšããDoSæ»æã®åœ±é¿ã軜æžããŸãã
- äžæ£å©çšããã®ä¿è·ïŒ ã¬ãŒãå¶éã¯ãããŒã¿ã®ã¹ã¯ã¬ã€ãã³ã°ãåœã¢ã«ãŠã³ãã®äœæãªã©ãæªæã®ããè¡çºè ãAPIããµãŒãã¹ãäžæ£å©çšããã®ãææ¢ã§ããŸãã
- å ¬æ£ãªå©çšã®ç¢ºä¿ïŒ ã¬ãŒãå¶éã¯ãåã ã®ãŠãŒã¶ãŒãã¯ã©ã€ã¢ã³ãããªãœãŒã¹ãç¬å ããã®ãé²ãããã¹ãŠã®ãŠãŒã¶ãŒããµãŒãã¹ã«ã¢ã¯ã»ã¹ããå ¬å¹³ãªæ©äŒãæã€ããšãä¿èšŒããŸãã
- ã·ã¹ãã ããã©ãŒãã³ã¹ã®åäžïŒ ãªã¯ãšã¹ãã¬ãŒããå¶åŸ¡ããããšã§ãã¬ãŒãå¶éã¯ãµãŒããŒãéè² è·ã«ãªãã®ãé²ããå¿çæéã®ççž®ãšã·ã¹ãã å šäœã®ããã©ãŒãã³ã¹åäžã«ã€ãªãããŸãã
- ã³ã¹ã管çïŒ ã¯ã©ãŠãããŒã¹ã®ãµãŒãã¹ã§ã¯ãã¬ãŒãå¶éã¯äºæãã¬è«æ±ã«ã€ãªããå¯èœæ§ã®ããéå°ãªäœ¿çšãé²ããã³ã¹ãã管çããã®ã«åœ¹ç«ã¡ãŸãã
äžè¬çãªã¬ãŒãå¶éã¢ã«ãŽãªãºã
ã¬ãŒãå¶éãå®è£ ããããã«äœ¿çšã§ããã¢ã«ãŽãªãºã ã¯ããã€ããããŸããæãäžè¬çãªãã®ã«ã¯ä»¥äžãå«ãŸããŸãïŒ
- ããŒã¯ã³ãã±ããïŒ ãã®ã¢ã«ãŽãªãºã ã¯ãããŒã¯ã³ãä¿æããæŠå¿µçãªããã±ãããã䜿çšããŸããåãªã¯ãšã¹ãã¯ããŒã¯ã³ã1ã€æ¶è²»ããŸãããã±ããã空ã®å Žåããªã¯ãšã¹ãã¯æåŠãããŸããããŒã¯ã³ã¯å®çŸ©ãããã¬ãŒãã§ãã±ããã«è¿œå ãããŸãã
- ãªãŒããŒãã±ããïŒ ããŒã¯ã³ãã±ããã«äŒŒãŠããŸããããªã¯ãšã¹ãã¯å°çã¬ãŒãã«é¢ä¿ãªãåºå®ã¬ãŒãã§åŠçãããŸããè¶ éãããªã¯ãšã¹ãã¯ãã¥ãŒã«å ¥ããããããç Žæ£ãããŸãã
- åºå®ãŠã£ã³ããŠã«ãŠã³ã¿ãŒïŒ ãã®ã¢ã«ãŽãªãºã ã¯æéãåºå®ãµã€ãºãŠã£ã³ããŠã«åå²ããåãŠã£ã³ããŠå ã®ãªã¯ãšã¹ãæ°ãã«ãŠã³ãããŸããå¶éã«éãããšãåŸç¶ã®ãªã¯ãšã¹ãã¯ãŠã£ã³ããŠããªã»ããããããŸã§æåŠãããŸãã
- ã¹ã©ã€ãã£ã³ã°ãŠã£ã³ããŠãã°ïŒ ãã®ã¢ãããŒãã¯ãã¹ã©ã€ãã£ã³ã°ãŠã£ã³ããŠå ã®ãªã¯ãšã¹ãã®ã¿ã€ã ã¹ã¿ã³ãã®ãã°ãä¿æããŸãããŠã£ã³ããŠå ã®ãªã¯ãšã¹ãæ°ã¯ãã°ã«åºã¥ããŠèšç®ãããŸãã
- ã¹ã©ã€ãã£ã³ã°ãŠã£ã³ããŠã«ãŠã³ã¿ãŒïŒ åºå®ãŠã£ã³ããŠãšã¹ã©ã€ãã£ã³ã°ãŠã£ã³ããŠã¢ã«ãŽãªãºã ã®åŽé¢ãçµã¿åããããã€ããªããã¢ãããŒãã§ã粟床ãåäžãããŸãã
ãã®ããã°èšäºã§ã¯ããã®æè»æ§ãšå¹ åºãé©çšæ§ãããããŒã¯ã³ãã±ããã¢ã«ãŽãªãºã ã«çŠç¹ãåœãŠãŸãã
ããŒã¯ã³ãã±ããã¢ã«ãŽãªãºã ïŒè©³çްãªè§£èª¬
ããŒã¯ã³ãã±ããã¢ã«ãŽãªãºã ã¯ãã·ã³ãã«ããšå¹æã®ãã©ã³ã¹ãåãããåºã䜿çšãããŠããã¬ãŒãå¶éæè¡ã§ããæŠå¿µçã«ããŒã¯ã³ãä¿æããããã±ããããç¶æããããšã§æ©èœããŸããåçä¿¡ãªã¯ãšã¹ãã¯ãã±ããããããŒã¯ã³ã1ã€æ¶è²»ããŸãããã±ããã«ååãªããŒã¯ã³ãããã°ãªã¯ãšã¹ãã¯èš±å¯ãããŸããããã§ãªããã°ããªã¯ãšã¹ãã¯æåŠãããŸãïŒãŸãã¯å®è£ ã«ãã£ãŠã¯ãã¥ãŒã«å ¥ããããŸãïŒãããŒã¯ã³ã¯å®çŸ©ãããã¬ãŒãã§ãã±ããã«è¿œå ãããå©çšå¯èœãªå®¹éãè£å ããŸãã
äž»èŠãªæŠå¿µ
- ãã±ãã容éïŒ ãã±ãããä¿æã§ããããŒã¯ã³ã®æå€§æ°ãããã¯ããŒã¹ã容éãæ±ºå®ããäžå®æ°ã®ãªã¯ãšã¹ããçæéã§é£ç¶ããŠåŠçãããããšãå¯èœã«ããŸãã
- è£å ã¬ãŒãïŒ ããŒã¯ã³ããã±ããã«è¿œå ãããã¬ãŒãã§ãéåžžã¯1ç§ãããã®ããŒã¯ã³æ°ïŒãŸãã¯ä»ã®æéåäœïŒã§æž¬å®ãããŸããããã«ããããªã¯ãšã¹ããåŠçãããå¹³åã¬ãŒããå¶åŸ¡ãããŸãã
- ãªã¯ãšã¹ãæ¶è²»ïŒ åçä¿¡ãªã¯ãšã¹ãã¯ãã±ããããäžå®æ°ã®ããŒã¯ã³ãæ¶è²»ããŸããéåžžãåãªã¯ãšã¹ãã¯1ããŒã¯ã³ãæ¶è²»ããŸãããããè€éãªã·ããªãªã§ã¯ãç°ãªãã¿ã€ãã®ãªã¯ãšã¹ãã«ç°ãªãããŒã¯ã³ã³ã¹ããå²ãåœãŠãããšãã§ããŸãã
ä»çµã¿
- ãªã¯ãšã¹ããå°çãããšãã¢ã«ãŽãªãºã ã¯ãã±ããã«ååãªããŒã¯ã³ããããã©ããã確èªããŸãã
- ååãªããŒã¯ã³ãããå Žåããªã¯ãšã¹ãã¯èš±å¯ããã察å¿ããæ°ã®ããŒã¯ã³ããã±ããããåé€ãããŸãã
- ååãªããŒã¯ã³ããªãå Žåããªã¯ãšã¹ãã¯æåŠããããïŒéåžžã¯HTTP 429ãToo Many Requestsããšã©ãŒãè¿ãïŒãåŸã§åŠçããããã«ãã¥ãŒã«å ¥ããããŸãã
- ãªã¯ãšã¹ãã®å°çãšã¯ç¡é¢ä¿ã«ãããŒã¯ã³ã¯å®çŸ©ãããè£å ã¬ãŒãã§ããã±ããã®å®¹éãŸã§å®æçã«ãã±ããã«è¿œå ãããŸãã
äŸ
容éã10ããŒã¯ã³ãè£å ã¬ãŒããæ¯ç§2ããŒã¯ã³ã®ããŒã¯ã³ãã±ãããæ³åããŠã¿ãŠãã ãããåæç¶æ ã§ã¯ããã±ããã¯æºã¿ã³ã§ãïŒ10ããŒã¯ã³ïŒãã¢ã«ãŽãªãºã ã®åäœã¯æ¬¡ã®ããã«ãªããŸãïŒ
- 0ç§ç®ïŒ 5ã€ã®ãªã¯ãšã¹ããå°çããã±ããã«ã¯ååãªããŒã¯ã³ãããããã5ã€ãã¹ãŠã®ãªã¯ãšã¹ããèš±å¯ããããã±ããã«ã¯çŸåš5ããŒã¯ã³ãå«ãŸããŸãã
- 1ç§ç®ïŒ ãªã¯ãšã¹ãã¯å°çããã2ããŒã¯ã³ããã±ããã«è¿œå ãããåèšã¯7ããŒã¯ã³ã«ãªããŸãã
- 2ç§ç®ïŒ 4ã€ã®ãªã¯ãšã¹ããå°çããã±ããã«ã¯ååãªããŒã¯ã³ãããããã4ã€ãã¹ãŠã®ãªã¯ãšã¹ããèš±å¯ããããã±ããã«ã¯çŸåš3ããŒã¯ã³ãå«ãŸããŸãã2ããŒã¯ã³ã远å ãããåèšã¯5ããŒã¯ã³ã«ãªããŸãã
- 3ç§ç®ïŒ 8ã€ã®ãªã¯ãšã¹ããå°çã5ã€ã®ãªã¯ãšã¹ãã®ã¿ãèš±å¯ããïŒãã±ããã«ã¯5ããŒã¯ã³ïŒãæ®ãã®3ã€ã®ãªã¯ãšã¹ãã¯æåŠãããããã¥ãŒã«å ¥ããããŸãã2ããŒã¯ã³ã远å ãããåèšã¯2ããŒã¯ã³ã«ãªããŸãïŒ5ã€ã®ãªã¯ãšã¹ããè£å ãµã€ã¯ã«ã®åã«åŠçãããå Žåãè£å ããªã¯ãšã¹ãåŠçã®åã«è¡ãããå Žåã¯7ããŒã¯ã³ïŒã
ããŒã¯ã³ãã±ããã¢ã«ãŽãªãºã ã®å®è£
ããŒã¯ã³ãã±ããã¢ã«ãŽãªãºã ã¯ãããŸããŸãªããã°ã©ãã³ã°èšèªã§å®è£ ã§ããŸãã以äžã«GolangãPythonãJavaã§ã®äŸã瀺ããŸãïŒ
Golang
```go package main import ( "fmt" "sync" "time" ) // TokenBucket ã¯ããŒã¯ã³ãã±ããã¬ãŒããªããã¿ãŒã衚ããŸãã type TokenBucket struct { capacity int tokens int rate time.Duration lastRefill time.Time mu sync.Mutex } // NewTokenBucket ã¯æ°ããTokenBucketãäœæããŸãã func NewTokenBucket(capacity int, rate time.Duration) *TokenBucket { return &TokenBucket{ capacity: capacity, tokens: capacity, rate: rate, lastRefill: time.Now(), } } // Allow ã¯ããŒã¯ã³ã®å¯çšæ§ã«åºã¥ããŠãªã¯ãšã¹ããèš±å¯ããããã確èªããŸãã func (tb *TokenBucket) Allow() bool { tb.mu.Lock() defer tb.mu.Unlock() now := time.Now() tb.refill(now) if tb.tokens > 0 { tb.tokens-- return true } return false } // refill ã¯çµéæéã«åºã¥ããŠãã±ããã«ããŒã¯ã³ã远å ããŸãã func (tb *TokenBucket) refill(now time.Time) { elapsed := now.Sub(tb.lastRefill) newTokens := int(elapsed.Seconds() * float64(tb.capacity) / tb.rate.Seconds()) if newTokens > 0 { tb.tokens += newTokens if tb.tokens > tb.capacity { tb.tokens = tb.capacity } tb.lastRefill = now } } func main() { bucket := NewTokenBucket(10, time.Second) for i := 0; i < 15; i++ { if bucket.Allow() { fmt.Printf("ãªã¯ãšã¹ã %d ã¯èš±å¯ãããŸãã\n", i+1) } else { fmt.Printf("ãªã¯ãšã¹ã %d ã¯ã¬ãŒãå¶éãããŸãã\n", i+1) } time.Sleep(100 * time.Millisecond) } } ```
Python
```python import time import threading class TokenBucket: def __init__(self, capacity, refill_rate): self.capacity = capacity self.tokens = capacity self.refill_rate = refill_rate self.last_refill = time.time() self.lock = threading.Lock() def allow(self): with self.lock: self._refill() if self.tokens > 0: self.tokens -= 1 return True return False def _refill(self): now = time.time() elapsed = now - self.last_refill new_tokens = elapsed * self.refill_rate self.tokens = min(self.capacity, self.tokens + new_tokens) self.last_refill = now if __name__ == '__main__': bucket = TokenBucket(capacity=10, refill_rate=2) # 10ããŒã¯ã³ãæ¯ç§2ã€è£å for i in range(15): if bucket.allow(): print(f"ãªã¯ãšã¹ã {i+1} ã¯èš±å¯ãããŸãã") else: print(f"ãªã¯ãšã¹ã {i+1} ã¯ã¬ãŒãå¶éãããŸãã") time.sleep(0.1) ```
Java
```java import java.util.concurrent.locks.ReentrantLock; import java.util.concurrent.TimeUnit; public class TokenBucket { private final int capacity; private double tokens; private final double refillRate; private long lastRefillTimestamp; private final ReentrantLock lock = new ReentrantLock(); public TokenBucket(int capacity, double refillRate) { this.capacity = capacity; this.tokens = capacity; this.refillRate = refillRate; this.lastRefillTimestamp = System.nanoTime(); } public boolean allow() { try { lock.lock(); refill(); if (tokens >= 1) { tokens -= 1; return true; } else { return false; } } finally { lock.unlock(); } } private void refill() { long now = System.nanoTime(); double elapsedTimeInSeconds = (double) (now - lastRefillTimestamp) / TimeUnit.NANOSECONDS.toNanos(1); double newTokens = elapsedTimeInSeconds * refillRate; tokens = Math.min(capacity, tokens + newTokens); lastRefillTimestamp = now; } public static void main(String[] args) throws InterruptedException { TokenBucket bucket = new TokenBucket(10, 2); // 10ããŒã¯ã³ãæ¯ç§2ã€è£å for (int i = 0; i < 15; i++) { if (bucket.allow()) { System.out.println("ãªã¯ãšã¹ã " + (i + 1) + " ã¯èš±å¯ãããŸãã"); } else { System.out.println("ãªã¯ãšã¹ã " + (i + 1) + " ã¯ã¬ãŒãå¶éãããŸãã"); } TimeUnit.MILLISECONDS.sleep(100); } } } ```
ããŒã¯ã³ãã±ããã¢ã«ãŽãªãºã ã®å©ç¹
- æè»æ§ïŒ ããŒã¯ã³ãã±ããã¢ã«ãŽãªãºã ã¯éåžžã«æè»ã§ãããŸããŸãªã¬ãŒãå¶éã·ããªãªã«ç°¡åã«é©å¿ã§ããŸãããã±ãã容éãšè£å ã¬ãŒãã調æŽããŠãã¬ãŒãå¶éã®åäœã埮調æŽã§ããŸãã
- ããŒã¹ãåŠçïŒ ãã±ãã容éã«ãããäžå®éã®ããŒã¹ããã©ãã£ãã¯ãã¬ãŒãå¶éãããããšãªãåŠçã§ããŸããããã¯ãææçºçãããã©ãã£ãã¯ã®æ¥å¢ãåŠçããã®ã«åœ¹ç«ã¡ãŸãã
- ã·ã³ãã«ãïŒ ã¢ã«ãŽãªãºã ã¯æ¯èŒççè§£ãããããå®è£ ãç°¡åã§ãã
- èšå®å¯èœæ§ïŒ å¹³åãªã¯ãšã¹ãã¬ãŒããšããŒã¹ã容éãæ£ç¢ºã«å¶åŸ¡ã§ããŸãã
ããŒã¯ã³ãã±ããã¢ã«ãŽãªãºã ã®æ¬ ç¹
- è€éãïŒ æŠå¿µã¯ã·ã³ãã«ã§ããããã±ããã®ç¶æ ãšè£å ããã»ã¹ã管çããã«ã¯ãç¹ã«åæ£ã·ã¹ãã ã§ã¯æ éãªå®è£ ãå¿ èŠã§ãã
- äžåäžãªåé ã®å¯èœæ§ïŒ äžéšã®ã·ããªãªã§ã¯ãããŒã¹ã容éãæéãšãšãã«ãªã¯ãšã¹ãã®äžåäžãªåé ã«ã€ãªããå¯èœæ§ããããŸãã
- èšå®ã®ãªãŒããŒãããïŒ æé©ãªãã±ãã容éãšè£å ã¬ãŒããæ±ºå®ããã«ã¯ãæ éãªåæãšå®éšãå¿ èŠã«ãªãå ŽåããããŸãã
ããŒã¯ã³ãã±ããã¢ã«ãŽãªãºã ã®ãŠãŒã¹ã±ãŒã¹
ããŒã¯ã³ãã±ããã¢ã«ãŽãªãºã ã¯ã以äžãå«ãå¹ åºãã¬ãŒãå¶éã®ãŠãŒã¹ã±ãŒã¹ã«é©ããŠããŸãïŒ
- APIã¬ãŒãå¶éïŒ ãŠãŒã¶ãŒãŸãã¯ã¯ã©ã€ã¢ã³ãããšã®ãªã¯ãšã¹ãæ°ãå¶éããããšã«ãããAPIãäžæ£å©çšããä¿è·ããå ¬æ£ãªå©çšã確ä¿ããŸããäŸãã°ããœãŒã·ã£ã«ã¡ãã£ã¢APIã¯ãã¹ãã ãé²ãããã«ãŠãŒã¶ãŒã1æéã«è¡ããæçš¿æ°ãå¶éããå ŽåããããŸãã
- Webã¢ããªã±ãŒã·ã§ã³ã®ã¬ãŒãå¶éïŒ ãŠãŒã¶ãŒããã©ãŒã ãéä¿¡ããããªãœãŒã¹ã«ã¢ã¯ã»ã¹ããããããªã©ãWebãµãŒããŒãžã®éå°ãªãªã¯ãšã¹ããé²ããŸãããªã³ã©ã€ã³ãã³ãã³ã°ã¢ããªã±ãŒã·ã§ã³ã¯ããã«ãŒããã©ãŒã¹æ»æãé²ãããã«ãã¹ã¯ãŒããªã»ããã®è©Šè¡åæ°ãå¶éããå ŽåããããŸãã
- ãããã¯ãŒã¯ã®ã¬ãŒãå¶éïŒ ç¹å®ã®ã¢ããªã±ãŒã·ã§ã³ããŠãŒã¶ãŒã䜿çšãã垯åå¹ ãå¶éãããªã©ããããã¯ãŒã¯ãæµãããã©ãã£ãã¯ã®ã¬ãŒããå¶åŸ¡ããŸããISPã¯ããããã¯ãŒã¯ã®æ··éã管çããããã«ã¬ãŒãå¶éããã䜿çšããŸãã
- ã¡ãã»ãŒãžãã¥ãŒã®ã¬ãŒãå¶éïŒ ã¡ãã»ãŒãžãã¥ãŒã«ãã£ãŠåŠçãããã¡ãã»ãŒãžã®ã¬ãŒããå¶åŸ¡ããã³ã³ã·ã¥ãŒããŒãéè² è·ã«ãªãã®ãé²ããŸããããã¯ããµãŒãã¹ãã¡ãã»ãŒãžãã¥ãŒãä»ããŠéåæã«éä¿¡ãããã€ã¯ããµãŒãã¹ã¢ãŒããã¯ãã£ã§äžè¬çã§ãã
- ãã€ã¯ããµãŒãã¹ã®ã¬ãŒãå¶éïŒ ä»ã®ãµãŒãã¹ãå€éšã¯ã©ã€ã¢ã³ãããåãåããªã¯ãšã¹ãæ°ãå¶éããããšã«ãããåã ã®ãã€ã¯ããµãŒãã¹ãéè² è·ããä¿è·ããŸãã
忣ã·ã¹ãã ã«ãããããŒã¯ã³ãã±ããã®å®è£
忣ã·ã¹ãã ã§ããŒã¯ã³ãã±ããã¢ã«ãŽãªãºã ãå®è£ ããã«ã¯ãäžè²«æ§ã確ä¿ããç«¶åç¶æ ãåé¿ããããã«ç¹å¥ãªèæ ®äºé ãå¿ èŠã§ããäžè¬çãªã¢ãããŒãã¯æ¬¡ã®ãšããã§ãïŒ
- äžå€®éæš©åããŒã¯ã³ãã±ããïŒåäžã®äžå€®éæš©åãµãŒãã¹ãããã¹ãŠã®ãŠãŒã¶ãŒãŸãã¯ã¯ã©ã€ã¢ã³ãã®ããŒã¯ã³ãã±ããã管çããŸãããã®ã¢ãããŒãã¯å®è£ ãç°¡åã§ãããããã«ããã¯ãåäžé害ç¹ã«ãªãå¯èœæ§ããããŸãã
- Redisã䜿çšãã忣ããŒã¯ã³ãã±ããïŒ ã€ã³ã¡ã¢ãªããŒã¿ã¹ãã¢ã§ããRedisã䜿çšããŠãããŒã¯ã³ãã±ãããä¿åããã³ç®¡çã§ããŸããRedisã¯ã䞊è¡ç°å¢ã§ãã±ããã®ç¶æ ãå®å šã«æŽæ°ããããã«äœ¿çšã§ããã¢ãããã¯ãªæäœãæäŸããŸãã
- ã¯ã©ã€ã¢ã³ããµã€ãããŒã¯ã³ãã±ããïŒ åã¯ã©ã€ã¢ã³ããç¬èªã®ããŒã¯ã³ãã±ãããç¶æããŸãããã®ã¢ãããŒãã¯æ¡åŒµæ§ãé«ãã§ãããã¬ãŒãå¶éã«å¯Ÿããäžå€®ã®å¶åŸ¡ããªãããã粟床ãäœããªãå¯èœæ§ããããŸãã
- ãã€ããªããã¢ãããŒãïŒ äžå€®éæš©åãšåæ£åã®ã¢ãããŒãã®åŽé¢ãçµã¿åãããŸããããšãã°ã忣ãã£ãã·ã¥ã䜿çšããŠããŒã¯ã³ãã±ãããä¿åããäžå€®éæš©åãµãŒãã¹ããã±ããã®è£å ãæ åœããŸãã
Redisã䜿çšããäŸïŒæŠå¿µïŒ
忣ããŒã¯ã³ãã±ããã«Redisã䜿çšããã«ã¯ããã®ã¢ãããã¯ãªæäœïŒ`INCRBY`ã`DECR`ã`TTL`ã`EXPIRE`ãªã©ïŒã掻çšããŠããŒã¯ã³æ°ã管çããŸããåºæ¬çãªãããŒã¯æ¬¡ã®ããã«ãªããŸãïŒ
- æ¢åãã±ããã®ç¢ºèªïŒ ãŠãŒã¶ãŒ/APIãšã³ããã€ã³ãã®ããŒãRedisã«ååšãããã©ããã確èªããŸãã
- å¿ èŠã«å¿ããŠäœæïŒ ååšããªãå Žåã¯ãããŒãäœæããããŒã¯ã³æ°ã容éã«åæåããè£å æéã«åãããŠæå¹æéïŒTTLïŒãèšå®ããŸãã
- ããŒã¯ã³æ¶è²»ã®è©Šè¡ïŒ ã¢ãããã¯ã«ããŒã¯ã³æ°ããã¯ãªã¡ã³ãããŸããçµæã0以äžã§ããã°ããªã¯ãšã¹ãã¯èš±å¯ãããŸãã
- ããŒã¯ã³æ¯æžã®åŠçïŒ çµæã0æªæºã®å Žåã¯ããã¯ãªã¡ã³ããå ã«æ»ãïŒã¢ãããã¯ã«ã€ã³ã¯ãªã¡ã³ããçŽãïŒããªã¯ãšã¹ããæåŠããŸãã
- è£å ããžãã¯ïŒ ããã¯ã°ã©ãŠã³ãããã»ã¹ãŸãã¯å®æçãªã¿ã¹ã¯ããã±ãããè£å ãã容éãŸã§ããŒã¯ã³ã远å ããŸãã
忣å®è£ ã«ãããéèŠãªèæ ®äºé ïŒ
- ååæ§ïŒ äžŠè¡ç°å¢ã§ããŒã¯ã³æ°ãæ£ããæŽæ°ãããããã«ãã¢ãããã¯ãªæäœã䜿çšããŸãã
- äžè²«æ§ïŒ 忣ã·ã¹ãã ã®ãã¹ãŠã®ããŒãã§ããŒã¯ã³æ°ã«äžè²«æ§ãããããšã確èªããŸãã
- ãã©ãŒã«ããã¬ã©ã³ã¹ïŒ äžéšã®ããŒãã«é害ãçºçããå Žåã§ãæ©èœãç¶ããããšãã§ããããã«ãã·ã¹ãã ããã©ãŒã«ããã¬ã©ã³ãã«èšèšããŸãã
- ã¹ã±ãŒã©ããªãã£ïŒ ãœãªã¥ãŒã·ã§ã³ã¯ã倿°ã®ãŠãŒã¶ãŒãšãªã¯ãšã¹ããåŠçã§ããããã«æ¡åŒµå¯èœã§ãªããã°ãªããŸããã
- ç£èŠïŒ ã¬ãŒãå¶éã®æå¹æ§ã远跡ããåé¡ãç¹å®ããããã«ç£èŠãå®è£ ããŸãã
ããŒã¯ã³ãã±ããã®ä»£æ¿æ¡
ããŒã¯ã³ãã±ããã¢ã«ãŽãªãºã ã¯äººæ°ã®ããéžæè¢ã§ãããç¹å®ã®èŠä»¶ã«ãã£ãŠã¯ä»ã®ã¬ãŒãå¶éæè¡ãããé©ããŠããå ŽåããããŸãã以äžã«ããã€ãã®ä»£æ¿æ¡ãšã®æ¯èŒã瀺ããŸãïŒ
- ãªãŒããŒãã±ããïŒ ããŒã¯ã³ãã±ãããããã·ã³ãã«ã§ãããªã¯ãšã¹ããåºå®ã¬ãŒãã§åŠçããŸãããã©ãã£ãã¯ãå¹³æ»åããã®ã«é©ããŠããŸãããããŒã¹ãã®åŠçã«é¢ããŠã¯ããŒã¯ã³ãã±ããã»ã©æè»ã§ã¯ãããŸããã
- åºå®ãŠã£ã³ããŠã«ãŠã³ã¿ãŒïŒ å®è£ ã¯ç°¡åã§ããããŠã£ã³ããŠã®å¢çã§ã¬ãŒãå¶éã®2åãèš±å¯ããå¯èœæ§ããããŸããããŒã¯ã³ãã±ããããã粟床ãäœãã§ãã
- ã¹ã©ã€ãã£ã³ã°ãŠã£ã³ããŠãã°ïŒ æ£ç¢ºã§ããããã¹ãŠã®ãªã¯ãšã¹ãããã°ã«èšé²ãããããããå€ãã®ã¡ã¢ãªãæ¶è²»ããŸãã粟床ãæãéèŠãªã·ããªãªã«é©ããŠããŸãã
- ã¹ã©ã€ãã£ã³ã°ãŠã£ã³ããŠã«ãŠã³ã¿ãŒïŒ 粟床ãšã¡ã¢ãªäœ¿çšéã®éã®åХ忡ã§ããåºå®ãŠã£ã³ããŠã«ãŠã³ã¿ãŒãããåªãã粟床ããã¹ã©ã€ãã£ã³ã°ãŠã£ã³ããŠãã°ãããå°ãªãã¡ã¢ãªãªãŒããŒãããã§æäŸããŸãã
é©åãªã¢ã«ãŽãªãºã ã®éžæïŒ
æé©ãªã¬ãŒãå¶éã¢ã«ãŽãªãºã ã®éžæã¯ã次ã®ãããªèŠå ã«äŸåããŸãïŒ
- 粟床ã®èŠä»¶ïŒ ã¬ãŒãå¶éãã©ã®çšåºŠæ£ç¢ºã«å®æœããå¿ èŠããããŸããïŒ
- ããŒã¹ãåŠçã®ããŒãºïŒ çæéã®ãã©ãã£ãã¯ã®ããŒã¹ããèš±å¯ããå¿ èŠããããŸããïŒ
- ã¡ã¢ãªå¶çŽïŒ ã¬ãŒãå¶éããŒã¿ãä¿åããããã«ã©ãã ãã®ã¡ã¢ãªãå²ãåœãŠãããšãã§ããŸããïŒ
- å®è£ ã®è€éãïŒ ã¢ã«ãŽãªãºã ã®å®è£ ãšä¿å®ã¯ã©ã®ãããç°¡åã§ããïŒ
- ã¹ã±ãŒã©ããªãã£èŠä»¶ïŒ ã¢ã«ãŽãªãºã ã¯å€æ°ã®ãŠãŒã¶ãŒãšãªã¯ãšã¹ããåŠçããããã«ã©ã®çšåºŠã¹ã±ãŒã«ããŸããïŒ
ã¬ãŒãå¶éã®ãã¹ããã©ã¯ãã£ã¹
ã¬ãŒãå¶éã广çã«å®è£ ããã«ã¯ãæ éãªèšç»ãšæ€èšãå¿ èŠã§ãã以äžã«åŸãã¹ããã¹ããã©ã¯ãã£ã¹ãããã€ã瀺ããŸãïŒ
- ã¬ãŒãå¶éãæç¢ºã«å®çŸ©ããïŒ ãµãŒããŒã®å®¹éãäºæ³ããããã©ãã£ãã¯ãã¿ãŒã³ããŠãŒã¶ãŒã®ããŒãºã«åºã¥ããŠé©åãªã¬ãŒãå¶éãæ±ºå®ããŸãã
- æç¢ºãªãšã©ãŒã¡ãã»ãŒãžãæäŸããïŒ ãªã¯ãšã¹ããã¬ãŒãå¶éãããå Žåãã¬ãŒãå¶éã®çç±ãšå詊è¡å¯èœãªææïŒäŸãã°ã`Retry-After` HTTPããããŒã䜿çšïŒãå«ããæç¢ºã§æçãªãšã©ãŒã¡ãã»ãŒãžããŠãŒã¶ãŒã«è¿ããŸãã
- æšæºã®HTTPã¹ããŒã¿ã¹ã³ãŒãã䜿çšããïŒ 429ïŒToo Many RequestsïŒãªã©ãã¬ãŒãå¶éã瀺ãé©åãªHTTPã¹ããŒã¿ã¹ã³ãŒãã䜿çšããŸãã
- ã°ã¬ãŒã¹ãã«ãã°ã©ããŒã·ã§ã³ãå®è£ ããïŒ åã«ãªã¯ãšã¹ããæåŠããã®ã§ã¯ãªãããµãŒãã¹ã®å質ãäœäžãããããåŠçãé å»¶ãããããããªã©ãã°ã¬ãŒã¹ãã«ãã°ã©ããŒã·ã§ã³ã®å®è£ ãæ€èšããŸãã
- ã¬ãŒãå¶éã¡ããªã¯ã¹ãç£èŠããïŒ ã¬ãŒãå¶éããããªã¯ãšã¹ãã®æ°ãå¹³åå¿çæéããã®ä»ã®é¢é£ã¡ããªã¯ã¹ã远跡ããŠãã¬ãŒãå¶éã广çã§ãããæå³ããªãçµæãåŒãèµ·ãããŠããªãããšã確èªããŸãã
- ã¬ãŒãå¶éãèšå®å¯èœã«ããïŒ ç®¡çè ãå€åãããã©ãã£ãã¯ãã¿ãŒã³ãã·ã¹ãã 容éã«åºã¥ããŠåçã«ã¬ãŒãå¶éã調æŽã§ããããã«ããŸãã
- ã¬ãŒãå¶éãææžåããïŒ éçºè ãå¶éãèªèããããã«å¿ããŠã¢ããªã±ãŒã·ã§ã³ãèšèšã§ããããã«ãAPIããã¥ã¡ã³ãã«ã¬ãŒãå¶éãæç¢ºã«ææžåããŸãã
- é©å¿åã¬ãŒãå¶éã䜿çšããïŒ çŸåšã®ã·ã¹ãã è² è·ãšãã©ãã£ãã¯ãã¿ãŒã³ã«åºã¥ããŠã¬ãŒãå¶éãèªåçã«èª¿æŽãããé©å¿åã¬ãŒãå¶éã®äœ¿çšãæ€èšããŸãã
- ã¬ãŒãå¶éãåºå¥ããïŒ ç°ãªãã¿ã€ãã®ãŠãŒã¶ãŒãã¯ã©ã€ã¢ã³ãã«ç°ãªãã¬ãŒãå¶éãé©çšããŸããããšãã°ãèªèšŒæžã¿ãŠãŒã¶ãŒã¯å¿åãŠãŒã¶ãŒãããé«ãã¬ãŒãå¶éãæã€å ŽåããããŸããåæ§ã«ãç°ãªãAPIãšã³ããã€ã³ãã¯ç°ãªãã¬ãŒãå¶éãæã€å ŽåããããŸãã
- å°åã«ããå€åãèæ ®ããïŒ ãããã¯ãŒã¯ç¶æ³ããŠãŒã¶ãŒã®è¡åã¯ãå°ççãªå°åã«ãã£ãŠç°ãªãå Žåãããããšã«æ³šæããŠãã ãããå¿ èŠã«å¿ããŠã¬ãŒãå¶éã調æŽããŸãã
çµè«
ã¬ãŒãå¶éã¯ãå埩åãšæ¡åŒµæ§ã®ããã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããããã®äžå¯æ¬ ãªæè¡ã§ããããŒã¯ã³ãã±ããã¢ã«ãŽãªãºã ã¯ããŠãŒã¶ãŒãã¯ã©ã€ã¢ã³ãããªã¯ãšã¹ããè¡ããã¬ãŒããå¶åŸ¡ããããã®æè»ã§å¹æçãªæ¹æ³ãæäŸããã·ã¹ãã ãäžæ£å©çšããä¿è·ããå ¬æ£ãªå©çšã確ä¿ããå šäœçãªããã©ãŒãã³ã¹ãåäžãããŸããããŒã¯ã³ãã±ããã¢ã«ãŽãªãºã ã®ååãçè§£ããå®è£ ã®ãã¹ããã©ã¯ãã£ã¹ã«åŸãããšã§ãéçºè ã¯æãèŠæ±ã®å³ãããã©ãã£ãã¯è² è·ã«ã察å¿ã§ããå ç¢ã§ä¿¡é Œæ§ã®é«ãã·ã¹ãã ãæ§ç¯ã§ããŸãã
ãã®ããã°èšäºã§ã¯ãããŒã¯ã³ãã±ããã¢ã«ãŽãªãºã ããã®å®è£ ãå©ç¹ãæ¬ ç¹ãããã³ãŠãŒã¹ã±ãŒã¹ã®å æ¬çãªæŠèŠãæäŸããŸããããã®ç¥èãæŽ»çšããããšã§ãèªèº«ã®ã¢ããªã±ãŒã·ã§ã³ã«å¹æçã«ã¬ãŒãå¶éãå®è£ ããäžçäžã®ãŠãŒã¶ãŒã®ããã«ãµãŒãã¹ã®å®å®æ§ãšå¯çšæ§ã確ä¿ã§ããŸãã