Production fixes: n8n workflow auto-restart, user-friendly messages, fixed navigation buttons
This commit is contained in:
@@ -2,7 +2,7 @@
|
||||
Redis Service для кеширования, rate limiting, сессий
|
||||
"""
|
||||
import redis.asyncio as redis
|
||||
from typing import Optional, Any
|
||||
from typing import Optional, Any, List
|
||||
import json
|
||||
from ..config import settings
|
||||
import logging
|
||||
@@ -155,6 +155,58 @@ class RedisService:
|
||||
async def cache_delete(self, cache_key: str):
|
||||
"""Удалить из кеша"""
|
||||
await self.delete(f"cache:{cache_key}")
|
||||
|
||||
# ============================================
|
||||
# MESSAGE BUFFER (для буферизации сообщений при недоступности workflow)
|
||||
# ============================================
|
||||
|
||||
async def buffer_push(self, buffer_key: str, message: dict):
|
||||
"""
|
||||
Добавить сообщение в буфер (очередь)
|
||||
|
||||
Args:
|
||||
buffer_key: Имя буфера (например, "description")
|
||||
message: Сообщение для буферизации
|
||||
"""
|
||||
full_key = f"{settings.redis_prefix}buffer:{buffer_key}"
|
||||
await self.client.lpush(full_key, json.dumps(message))
|
||||
# Устанавливаем TTL на буфер (24 часа)
|
||||
await self.client.expire(full_key, 86400)
|
||||
|
||||
async def buffer_get_all(self, buffer_key: str) -> List[dict]:
|
||||
"""
|
||||
Получить все сообщения из буфера (и очистить буфер)
|
||||
|
||||
Args:
|
||||
buffer_key: Имя буфера
|
||||
|
||||
Returns:
|
||||
Список сообщений
|
||||
"""
|
||||
full_key = f"{settings.redis_prefix}buffer:{buffer_key}"
|
||||
|
||||
# Используем транзакцию для атомарности
|
||||
pipe = self.client.pipeline()
|
||||
pipe.lrange(full_key, 0, -1) # Получить все
|
||||
pipe.delete(full_key) # Удалить буфер
|
||||
results = await pipe.execute()
|
||||
|
||||
messages_data = results[0] if results else []
|
||||
|
||||
messages = []
|
||||
for msg_str in messages_data:
|
||||
try:
|
||||
messages.append(json.loads(msg_str))
|
||||
except json.JSONDecodeError:
|
||||
logger.warning(f"⚠️ Не удалось распарсить сообщение из буфера: {msg_str}")
|
||||
|
||||
# Возвращаем в правильном порядке (FIFO - сначала старые)
|
||||
return list(reversed(messages))
|
||||
|
||||
async def buffer_size(self, buffer_key: str) -> int:
|
||||
"""Получить размер буфера"""
|
||||
full_key = f"{settings.redis_prefix}buffer:{buffer_key}"
|
||||
return await self.client.llen(full_key)
|
||||
|
||||
|
||||
# Глобальный экземпляр
|
||||
|
||||
Reference in New Issue
Block a user