Почему мой микросервис возвращает противоречивые результаты при использовании кэширования Redis с асинхронной SQLAlchemyPython

Программы на Python
Ответить
Anonymous
 Почему мой микросервис возвращает противоречивые результаты при использовании кэширования Redis с асинхронной SQLAlchemy

Сообщение Anonymous »

Я работаю над микросервисом Python FastAPI, который использует асинхронный SQLAlchemy (2.0) для доступа к базе данных и aioredis для кэширования результатов запросов.
Цель — снизить нагрузку на кластер PostgreSQL за счет кэширования частых запросов.
Однако я столкнулся со странной проблемой: после нескольких сотен запросов сервис начинает возвращать противоречивые данные — иногда значение кэша не соответствует последнему состоянию БД, а иногда кеш просто возвращает None даже несмотря на то, что ключ существует.
Вот упрощенный пример того, что я делаю:

Код: Выделить всё

from fastapi import FastAPI, Depends
from sqlalchemy.ext.asyncio import AsyncSession
from aioredis import Redis
import json

app = FastAPI()

async def get_user(user_id: int, db: AsyncSession, redis: Redis):
cache_key = f"user:{user_id}"
cached = await redis.get(cache_key)
if cached:
return json.loads(cached)

result = await db.execute("SELECT * FROM users WHERE id = :id", {"id": user_id})
user = result.fetchone()
if user:
await redis.set(cache_key, json.dumps(dict(user)), ex=60)
return user
Чтобы избежать состояний гонки, я добавил asyncio.Lock() вокруг операций записи Redis, но это не помогло.
При отладке я заметил, что противоречивые ответы в основном возникают во время одновременных запросов для одного и того же идентификатора пользователя.
Мне интересно:
Вызвано ли это конфликтом цикла событий Redis в асинхронном режиме?
Должно быть? Вместо этого я использую await redis.setex() или конвейер?
Или есть что-то в жизненном цикле асинхронного сеанса SQLAlchemy, что может привести к частичному чтению во время одновременного доступа?
Я прочитал документацию и попробовал и uvicorn, и Hypercorn, но проблема не устранена.
Кто-нибудь сталкивался с подобными проблемами рассинхронизации кэширования с асинхронными SQLAlchemy и aioredis в производстве?

Подробнее здесь: https://stackoverflow.com/questions/798 ... caching-wi
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»