// app/gosqs/memory_guard.go // Глобальный предохранитель памяти процесса (защита от OOM одним тенантом). // // Лимиты по числу сообщений (MaxMessagesForQueue) не ограничивают СУММАРНЫЙ // объём: 120k × 256 КБ ≈ 30 ГБ на одну очередь. Этот предохранитель отказывает // в SendMessage/SendMessageBatch по HeapAlloc выше порога — единственная защита // процесса от суммы всех тенантов. // // Задаётся env `SHARED_SQS_MAX_HEAP_MB` (0 = выключен). По умолчанию выключен: // конкретное число зависит от RAM ВМ и целевого числа тенантов (решение владельца). // Рекомендация на старт: ~70% от RAM ВМ, напр. 1024 для 1.5 ГБ ВМ. package gosqs import ( "os" "runtime" "strconv" ) // maxHeapBytes — порог HeapAlloc в байтах; 0 = предохранитель выключен. var maxHeapBytes = func() int64 { mb, err := strconv.ParseInt(os.Getenv("SHARED_SQS_MAX_HEAP_MB"), 10, 64) if err != nil || mb <= 0 { return 0 } return mb * 1024 * 1024 }() // heapOverLimit — true, если текущий HeapAlloc превышает порог. func heapOverLimit() bool { if maxHeapBytes <= 0 { return false } var ms runtime.MemStats runtime.ReadMemStats(&ms) return int64(ms.HeapAlloc) > maxHeapBytes }