traffic_jam 1.1.0 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: dc24485cfcc470e68b80dbb53f6b135ab9879bf0
4
- data.tar.gz: ab8ea5c0a5e1075af9606fae0e4a0cc9bb1fc071
3
+ metadata.gz: 805e6a84771b1d0933268ad372a33224ac7f5d26
4
+ data.tar.gz: 978bfe19a6637a37efa7b501c53a919104165d18
5
5
  SHA512:
6
- metadata.gz: f428099b9b945e9196a4e54146a79af29d8e8e8c430320f1e9237be2e96df3b9f39e29cad2b78c53694f9c76e85ee698f38af91b23ab715339ab9f578eaa4434
7
- data.tar.gz: 7c9afc9302a854fa68c042c9329e73a6224858bec71e25fb0ff5ac2a72fdcd6ab7f5aeedba4af936242a20e5fb96bc4fc87dcacdf9a77b3291f582adb5ddd540
6
+ metadata.gz: eb81caf639081a1313d893e2c3cc61e8c4d097061e4a6abbb3fbfcd03936dc4709f7fb745d9e206252265e61f3ed41d4351752657fd47d2990b70f2db8ac9a5f
7
+ data.tar.gz: abd29587f6e1bbda2f5a3abba3bf470429846d0c928bf9d2d40797b17b4c66881395846f199305a874bf6dad778bb4edac39dbb0627b7eb0f7bf69caeec88014
@@ -1,12 +1,12 @@
1
1
  require 'ostruct'
2
2
  require 'digest/md5'
3
- require_relative 'traffic_jam/errors'
4
3
  require_relative 'traffic_jam/configuration'
4
+ require_relative 'traffic_jam/errors'
5
+ require_relative 'traffic_jam/gcra_limit'
6
+ require_relative 'traffic_jam/lifetime_limit'
5
7
  require_relative 'traffic_jam/limit'
6
8
  require_relative 'traffic_jam/limit_group'
7
- require_relative 'traffic_jam/simple_limit'
8
9
  require_relative 'traffic_jam/rolling_limit'
9
- require_relative 'traffic_jam/lifetime_limit'
10
10
 
11
11
  module TrafficJam
12
12
  include Errors
@@ -2,21 +2,28 @@ require_relative 'limit'
2
2
  require_relative 'scripts'
3
3
 
4
4
  module TrafficJam
5
- # A SimpleLimit is a limit type that is more efficient for increments but does
6
- # not support decrements or changing the max value without a complete reset.
7
- # This means that if the period or max value for an action, value key changes,
8
- # the used and remaining values cannot be preserved.
9
- #
10
- # This works by storing a key in Redis with a millisecond-precision expiry
5
+ # GCRA (Generic Cell Rate Algorithm) is a leaky bucket type rate limiting
6
+ # algorithm. GCRA works by storing a key in Redis with a ms-precision expiry
11
7
  # representing the time that the limit will be completely reset. Each
12
8
  # increment operation converts the increment amount into the number of
13
9
  # milliseconds to be added to the expiry.
14
10
  #
11
+ # When a request comes in, we take the existing expiry value, subtract a fixed
12
+ # amount representing the limit’s total burst capacity from it, and compare
13
+ # the result to the current time. This result represents the next time to
14
+ # allow a request. If it’s in the past, we allow the incoming request, and if
15
+ # it’s in the future, we don’t. After a successful request, a new expiry is
16
+ # calculated. (see https://brandur.org/rate-limiting)
17
+ #
18
+ # This limit type does not support decrements or changing the max value without
19
+ # a complete reset. This means that if the period or max value for an
20
+ # action/value key changes, the used and remaining values cannot be preserved.
21
+ #
15
22
  # Example: Limit is 5 per 10 seconds.
16
23
  # An increment by 1 first sets the key to expire in 2s.
17
24
  # Another immediate increment by 4 sets the expiry to 10s.
18
25
  # Subsequent increments fail until clock time catches up to expiry
19
- class SimpleLimit < Limit
26
+ class GCRALimit < Limit
20
27
  # Increment the amount used by the given number. Does not perform increment
21
28
  # if the operation would exceed the limit. Returns whether the operation was
22
29
  # successful.
@@ -42,9 +49,9 @@ module TrafficJam
42
49
  result =
43
50
  begin
44
51
  redis.evalsha(
45
- Scripts::INCREMENT_SIMPLE_HASH, keys: [key], argv: argv)
52
+ Scripts::INCREMENT_GCRA_HASH, keys: [key], argv: argv)
46
53
  rescue Redis::CommandError
47
- redis.eval(Scripts::INCREMENT_SIMPLE, keys: [key], argv: argv)
54
+ redis.eval(Scripts::INCREMENT_GCRA, keys: [key], argv: argv)
48
55
  end
49
56
 
50
57
  case result
@@ -57,7 +64,7 @@ module TrafficJam
57
64
  else
58
65
  raise Errors::UnknownReturnValue,
59
66
  "Received unexpected return value #{result} from " \
60
- "increment_simple eval"
67
+ "increment_gcra eval"
61
68
  end
62
69
  end
63
70
 
@@ -91,4 +98,7 @@ module TrafficJam
91
98
  "#{config.key_prefix}:s"
92
99
  end
93
100
  end
101
+
102
+ # alias for backward compatibility
103
+ SimpleLimit = GCRALimit
94
104
  end
@@ -10,8 +10,8 @@ module TrafficJam
10
10
 
11
11
  INCREMENT_SCRIPT = load('increment')
12
12
  INCREMENT_SCRIPT_HASH = Digest::SHA1.hexdigest(INCREMENT_SCRIPT)
13
- INCREMENT_SIMPLE = load('increment_simple')
14
- INCREMENT_SIMPLE_HASH = Digest::SHA1.hexdigest(INCREMENT_SIMPLE)
13
+ INCREMENT_GCRA = load('increment_gcra')
14
+ INCREMENT_GCRA_HASH = Digest::SHA1.hexdigest(INCREMENT_GCRA)
15
15
  INCREMENT_ROLLING = load('increment_rolling')
16
16
  INCREMENT_ROLLING_HASH = Digest::SHA1.hexdigest(INCREMENT_ROLLING)
17
17
  INCRBY = load('incrby')
metadata CHANGED
@@ -1,29 +1,35 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: traffic_jam
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.0
4
+ version: 1.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jim Posen
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-01-09 00:00:00.000000000 Z
11
+ date: 2018-09-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: redis
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - "~>"
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
19
  version: '3.0'
20
+ - - "<"
21
+ - !ruby/object:Gem::Version
22
+ version: '5'
20
23
  type: :runtime
21
24
  prerelease: false
22
25
  version_requirements: !ruby/object:Gem::Requirement
23
26
  requirements:
24
- - - "~>"
27
+ - - ">="
25
28
  - !ruby/object:Gem::Version
26
29
  version: '3.0'
30
+ - - "<"
31
+ - !ruby/object:Gem::Version
32
+ version: '5'
27
33
  - !ruby/object:Gem::Dependency
28
34
  name: rake
29
35
  requirement: !ruby/object:Gem::Requirement
@@ -47,16 +53,16 @@ files:
47
53
  - lib/traffic_jam.rb
48
54
  - lib/traffic_jam/configuration.rb
49
55
  - lib/traffic_jam/errors.rb
56
+ - lib/traffic_jam/gcra_limit.rb
50
57
  - lib/traffic_jam/lifetime_limit.rb
51
58
  - lib/traffic_jam/limit.rb
52
59
  - lib/traffic_jam/limit_group.rb
53
60
  - lib/traffic_jam/rolling_limit.rb
54
61
  - lib/traffic_jam/scripts.rb
55
- - lib/traffic_jam/simple_limit.rb
56
62
  - scripts/incrby.lua
57
63
  - scripts/increment.lua
64
+ - scripts/increment_gcra.lua
58
65
  - scripts/increment_rolling.lua
59
- - scripts/increment_simple.lua
60
66
  - scripts/sum_rolling.lua
61
67
  homepage: https://github.com/coinbase/traffic_jam
62
68
  licenses:
@@ -78,7 +84,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
78
84
  version: '0'
79
85
  requirements: []
80
86
  rubyforge_project:
81
- rubygems_version: 2.6.13
87
+ rubygems_version: 2.6.8
82
88
  signing_key:
83
89
  specification_version: 4
84
90
  summary: Library for time-based rate limiting