P1.4: tenant-индекс очередей (O(1) подсчёт/список вместо скана)

Введён тип QueueStore с индексом accessKey→{queueName}. Мутации очередей идут через
AddQueue/RemoveQueue (create/delete/restore/config/seed/admin), подсчёт и список —
через CountTenantQueues/TenantQueueNames. Устранены O(total) скан-по-префиксу в
countTenantQueues, deleteTenant, listTenantQueues, createTenantQueue. API SyncQueues
(Queues, Lock) сохранён — остальной код не затронут.
This commit is contained in:
Repinoid
2026-10-06 18:36:03 +03:00
parent fb833ef01c
commit 3a52960d5b
9 changed files with 127 additions and 62 deletions
+1 -1
View File
@@ -75,7 +75,7 @@ func CreateQueueV1(req *http.Request) (int, interfaces.AbstractResponseBody) {
models.SyncQueues.Unlock()
return utils.CreateErrorResponseV1(err.Error(), true)
}
models.SyncQueues.Queues[key] = queue
models.SyncQueues.AddQueue(key, queue)
}
// Сохраняем очередь в Redis пока держим Lock — консистентный снапшот
persistence.SaveQueue(key, models.SyncQueues.Queues[key])
+1 -1
View File
@@ -50,7 +50,7 @@ func DeleteQueueV1(req *http.Request) (int, interfaces.AbstractResponseBody) {
log.Warnf("Delete Queue: %s does not exist (tenant: %s)", queueName, t.ID)
return utils.CreateErrorResponseV1("QueueNotFound", true)
}
delete(models.SyncQueues.Queues, key)
models.SyncQueues.RemoveQueue(key)
// Удаляем из Redis асинхронно
persistence.DeleteQueue(key)
+7 -14
View File
@@ -4,11 +4,11 @@
package gosqs
import (
"net/http"
"net/http"
"shared-sqs/app/auth"
"shared-sqs/app/models"
"shared-sqs/app/tenant"
"shared-sqs/app/auth"
"shared-sqs/app/models"
"shared-sqs/app/tenant"
)
// tenantQueueKey — внутренний ключ очереди в SyncQueues в формате "{accessKey}:{queueName}".
@@ -41,16 +41,9 @@ func tenantQueueARN(t *tenant.Tenant, queueName string) string {
return "arn:aws:sqs:" + models.CurrentEnvironment.Region + ":" + t.ID + ":" + queueName
}
// countTenantQueues — считает количество очередей тенанта в SyncQueues.
// countTenantQueues — считает количество очередей тенанта (через tenant-индекс, O(1)).
// Используется для проверки лимита MaxQueues.
// Вызывать под SyncQueues.RLock().
// Вызывать под SyncQueues.RLock()/Lock().
func countTenantQueues(tenantAccessKey string) int {
prefix := tenantAccessKey + ":"
count := 0
for key := range models.SyncQueues.Queues {
if len(key) > len(prefix) && key[:len(prefix)] == prefix {
count++
}
}
return count
return models.SyncQueues.CountTenantQueues(tenantAccessKey)
}