rapidity 0.0.8.373200 → 0.0.8.380347
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 +4 -4
- data/Gemfile.lock +1 -1
- data/lib/rapidity/share/lua_scripts/acquire.lua +14 -10
- data/lib/rapidity/share/lua_scripts/acquire_queue.lua +3 -2
- data/lib/rapidity/share/lua_scripts/available_in.lua +3 -2
- data/lib/rapidity/share/lua_scripts/check_queue.lua +3 -2
- data/lib/rapidity/share/lua_scripts/info.lua +4 -3
- data/lib/rapidity/share/lua_scripts/init.lua +4 -3
- data/lib/rapidity/share/lua_scripts/release_queue.lua +3 -2
- data/lib/rapidity/share/lua_scripts/reset.lua +3 -2
- metadata +2 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 8f38201a590863fbca01ac13557043dd8f29aafebc8bffb510452dc5e0f19065
|
|
4
|
+
data.tar.gz: 57d2f4b611c1c4150676290c207d8d72e7fe649971d93038c8a17334658df2cc
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 99d114cc8f28ba0c62a30db78cc8b32234f67ff0689ef53e8fc206e72cb89f5c0a70bf29151a873e0b4691286c73ad9ee3a8df4ed6c04de9fffcdb775b239391
|
|
7
|
+
data.tar.gz: 802503b25b8986c5e18c6f4bb69614e8df967ba3ab6de07f925431fc4dc711aeffa0a38db1ba684a7f6023048d3989cc095b2317058973604a551a0fdcb8972a
|
data/Gemfile.lock
CHANGED
|
@@ -134,13 +134,23 @@ local function process_all_limits(limit_keys, requested, current_time)
|
|
|
134
134
|
end
|
|
135
135
|
|
|
136
136
|
local limits = {}
|
|
137
|
-
|
|
138
|
-
-- Фаза 1: Проверка всех лимитов (Read & Validate)
|
|
137
|
+
-- Фаза 1: Изменяем ttl для всех существующих ключей и сохраняем объекты лимитов для существующих
|
|
139
138
|
for i = 1, #limit_keys do
|
|
140
139
|
local key = limit_keys[i]
|
|
141
140
|
local limit = Limit:new(key)
|
|
141
|
+
if limit.exists then
|
|
142
|
+
-- Продлеваем жизнь ключу, чтобы он не удалился, если к нему активно обращаются.
|
|
143
|
+
-- раньше был GT, но он только с версии 7 (GT - только если новый TTL больше текущего остатка)
|
|
144
|
+
redis.call("EXPIRE", limit.key, key_ttl)
|
|
145
|
+
table.insert(limits, limit)
|
|
146
|
+
end
|
|
147
|
+
end
|
|
142
148
|
|
|
143
|
-
|
|
149
|
+
-- Фаза 2: Проверка всех лимитов (Read & Validate)
|
|
150
|
+
for i = 1, #limit_keys do
|
|
151
|
+
local key = limit_keys[i]
|
|
152
|
+
local limit = limits[i]
|
|
153
|
+
if not limit then
|
|
144
154
|
return { "result", "false", "retryable", "false", "error", "key_not_found", "key", key }
|
|
145
155
|
end
|
|
146
156
|
|
|
@@ -157,20 +167,14 @@ local function process_all_limits(limit_keys, requested, current_time)
|
|
|
157
167
|
"key", key
|
|
158
168
|
}
|
|
159
169
|
end
|
|
160
|
-
|
|
161
|
-
table.insert(limits, limit)
|
|
162
170
|
end
|
|
163
171
|
|
|
164
|
-
-- Фаза
|
|
172
|
+
-- Фаза 3: Применение изменений (Write)
|
|
165
173
|
-- Выполняется только если всем лимитам хватило токенов
|
|
166
174
|
for i = 1, #limits do
|
|
167
175
|
local limit = limits[i]
|
|
168
176
|
limit:acquire(requested)
|
|
169
177
|
limit:save()
|
|
170
|
-
|
|
171
|
-
-- Продлеваем жизнь ключу, чтобы он не удалился, если к нему активно обращаются.
|
|
172
|
-
-- "GT" обновляет TTL только если новый TTL больше текущего.
|
|
173
|
-
redis.call("EXPIRE", limit.key, key_ttl, "GT")
|
|
174
178
|
end
|
|
175
179
|
|
|
176
180
|
return { "result", "true", "keys", limit_keys }
|
|
@@ -134,8 +134,9 @@ local function process_all_queues(limit_keys, req_tokens, ttl)
|
|
|
134
134
|
limit:acquire(bottleneck_tokens)
|
|
135
135
|
limit:save()
|
|
136
136
|
|
|
137
|
-
-- Продлеваем жизнь ключу
|
|
138
|
-
|
|
137
|
+
-- Продлеваем жизнь ключу
|
|
138
|
+
-- раньше был GT, но он только с версии 7 (GT - только если новый TTL больше текущего остатка)
|
|
139
|
+
redis.call("EXPIRE", limit.key, ttl)
|
|
139
140
|
end
|
|
140
141
|
|
|
141
142
|
-- Возвращаем успешный результат: сколько реально удалось захватить (tokens)
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
-- 4. Поиск "узкого горлышка" (Bottleneck): Поскольку для успешной операции (в acquire.lua) нужны
|
|
18
18
|
-- токены из всех переданных лимитов одновременно, общим временем ожидания будет являться
|
|
19
19
|
-- максимальное время ожидания среди всех проверенных корзин (math.max(unpack(wait_times))).
|
|
20
|
-
-- 5. Поддержка TTL: В процессе проверки скрипт продлевает время жизни ключей (EXPIRE ...
|
|
20
|
+
-- 5. Поддержка TTL: В процессе проверки скрипт продлевает время жизни ключей (EXPIRE ...),
|
|
21
21
|
-- чтобы корзины не удалялись из Redis, пока за ними наблюдают ожидающие
|
|
22
22
|
-- процессы.
|
|
23
23
|
-- Обратите внимание: скрипт не изменяет количество токенов (не списывает их), а лишь "смотрит" на состояние.
|
|
@@ -132,7 +132,8 @@ local function process_all_limits(limit_keys, needed, time_now)
|
|
|
132
132
|
limit:update(time_now)
|
|
133
133
|
|
|
134
134
|
-- Продлеваем жизнь ключу, так как идет активная проверка лимита
|
|
135
|
-
|
|
135
|
+
-- раньше был GT, но он только с версии 7 (GT - только если новый TTL больше текущего остатка)
|
|
136
|
+
redis.call("EXPIRE", limit.key, key_ttl)
|
|
136
137
|
|
|
137
138
|
-- Сохраняем время ожидания для текущего лимита
|
|
138
139
|
table.insert(wait_times, limit:available_in(needed))
|
|
@@ -36,9 +36,10 @@ local function check_queue()
|
|
|
36
36
|
|
|
37
37
|
local semaphore = tonumber(semaphore_str) or 0
|
|
38
38
|
|
|
39
|
-
-- Продлеваем жизнь ключу
|
|
39
|
+
-- Продлеваем жизнь ключу
|
|
40
|
+
-- раньше был GT, но он только с версии 7 (GT - только если новый TTL больше текущего остатка)
|
|
40
41
|
-- так как идет активная проверка лимита.
|
|
41
|
-
redis.call("EXPIRE", limit_key, key_ttl
|
|
42
|
+
redis.call("EXPIRE", limit_key, key_ttl)
|
|
42
43
|
|
|
43
44
|
-- Возвращаем успешный результат и текущее доступное количество мест
|
|
44
45
|
return {
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
-- Описание логики работы:
|
|
7
7
|
-- 1. Скрипт принимает ключ лимита и время его жизни (TTL).
|
|
8
8
|
-- 2. Если ключ существует, возвращает все его поля (HGETALL).
|
|
9
|
-
-- 3. При успешном чтении продлевает время жизни ключа (EXPIRE ...
|
|
9
|
+
-- 3. При успешном чтении продлевает время жизни ключа (EXPIRE ...),
|
|
10
10
|
-- чтобы предотвратить удаление активно используемых данных.
|
|
11
11
|
-------------------------------------------------------------------------------
|
|
12
12
|
|
|
@@ -28,8 +28,9 @@ local function info()
|
|
|
28
28
|
return {"result", "false", "error", "key_not_found"}
|
|
29
29
|
end
|
|
30
30
|
|
|
31
|
-
-- Продлеваем жизнь ключу
|
|
32
|
-
|
|
31
|
+
-- Продлеваем жизнь ключу
|
|
32
|
+
-- раньше был GT, но он только с версии 7 (GT - только если новый TTL больше текущего остатка)
|
|
33
|
+
redis.call("EXPIRE", limit_key, key_ttl)
|
|
33
34
|
|
|
34
35
|
return {"result", "true", "info", {limit_key, data}}
|
|
35
36
|
end
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
-- Это критически важно: если мы просто обновляем настройки лимита "на лету",
|
|
15
15
|
-- мы не должны сбрасывать текущие ограничения и уже списанные пользователями токены.
|
|
16
16
|
-- 2. Расчет скорости (Rate): Скорость пополнения (rate) предрасчитывается прямо в Lua (max_tokens / interval) и кэшируется в Redis. Это избавляет от необходимости каждый раз высчитывать дроби при проверке (в скрипте acquire.lua).
|
|
17
|
-
-- 3. Управление временем жизни (TTL): Назначает ключу время жизни. Если ключ уже существовал, TTL продлевается
|
|
17
|
+
-- 3. Управление временем жизни (TTL): Назначает ключу время жизни. Если ключ уже существовал, TTL продлевается (EXPIRE ...).
|
|
18
18
|
-- 4. Возврат данных: Скрипт возвращает имя ключа и все его сохраненные поля (HGETALL). В Ruby эта структура затем используется для сборки (гидратации) объекта Limit.
|
|
19
19
|
-------------------------------------------------------------------------------
|
|
20
20
|
|
|
@@ -55,8 +55,9 @@ local function init()
|
|
|
55
55
|
"rate", rate
|
|
56
56
|
)
|
|
57
57
|
|
|
58
|
-
-- Продлеваем жизнь ключу
|
|
59
|
-
|
|
58
|
+
-- Продлеваем жизнь ключу
|
|
59
|
+
-- раньше был GT, но он только с версии 7 (GT - только если новый TTL больше текущего остатка)
|
|
60
|
+
redis.call("EXPIRE", limit_key, key_ttl)
|
|
60
61
|
else
|
|
61
62
|
-- Создание нового лимита.
|
|
62
63
|
-- Корзина инициализируется как полностью заполненная (tokens = max_tokens).
|
|
@@ -120,8 +120,9 @@ local function process_all_queues(limit_keys, released_tokens, ttl)
|
|
|
120
120
|
end
|
|
121
121
|
end
|
|
122
122
|
|
|
123
|
-
-- Продлеваем жизнь ключу
|
|
124
|
-
|
|
123
|
+
-- Продлеваем жизнь ключу
|
|
124
|
+
-- раньше был GT, но он только с версии 7 (GT - только если новый TTL больше текущего остатка)
|
|
125
|
+
redis.call("EXPIRE", limit.key, ttl)
|
|
125
126
|
end
|
|
126
127
|
|
|
127
128
|
-- Если ни у одного лимита очередь не включена, вернем 0
|
|
@@ -51,8 +51,9 @@ local function reset()
|
|
|
51
51
|
"last_used", current_time
|
|
52
52
|
)
|
|
53
53
|
|
|
54
|
-
-- Продлеваем жизнь ключу
|
|
55
|
-
|
|
54
|
+
-- Продлеваем жизнь ключу
|
|
55
|
+
-- раньше был GT, но он только с версии 7 (GT - только если новый TTL больше текущего остатка)
|
|
56
|
+
redis.call("EXPIRE", limit_key, key_ttl)
|
|
56
57
|
|
|
57
58
|
-- Возвращаем успешный результат и обновленные данные
|
|
58
59
|
return {"result", "true", "info", {limit_key, redis.call("HGETALL", limit_key)}}
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: rapidity
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.0.8.
|
|
4
|
+
version: 0.0.8.380347
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Yurusov Vlad
|
|
@@ -9,7 +9,7 @@ authors:
|
|
|
9
9
|
autorequire:
|
|
10
10
|
bindir: bin
|
|
11
11
|
cert_chain: []
|
|
12
|
-
date: 2026-05-
|
|
12
|
+
date: 2026-05-29 00:00:00.000000000 Z
|
|
13
13
|
dependencies:
|
|
14
14
|
- !ruby/object:Gem::Dependency
|
|
15
15
|
name: activesupport
|