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:
@@ -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])
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user