Merge pull request 'redis' (#12) from master into dev

Reviewed-on: #12
This commit is contained in:
emmatveev 2024-11-25 00:27:58 +03:00
commit e4915c126d
7 changed files with 32 additions and 1 deletions

View File

@ -9,6 +9,8 @@ services:
environment:
MONGO_HOST: "mongo.develop.sprinthub.ru"
MONGO_PASSWORD: $MONGO_PASSWORD_DEV
REDIS_HOST: "redis.develop.sprinthub.ru"
REDIS_PASSWORD: $REDIS_PASSWORD_DEV
deploy:
mode: replicated
restart_policy:

View File

@ -9,6 +9,8 @@ services:
environment:
MONGO_HOST: "mongo.sprinthub.ru"
MONGO_PASSWORD: $MONGO_PASSWORD_PROD
REDIS_HOST: "redis.sprinthub.ru"
REDIS_PASSWORD: $REDIS_PASSWORD_PROD
deploy:
mode: replicated
restart_policy:

View File

@ -40,4 +40,5 @@ jobs:
- name: deploy
env:
MONGO_PASSWORD_DEV: ${{ secrets.MONGO_PASSWORD_DEV }}
REDIS_PASSWORD_DEV: ${{ secrets.REDIS_PASSWORD_DEV }}
run: docker stack deploy --with-registry-auth -c ./.deploy/deploy-dev.yaml infra-development

View File

@ -40,4 +40,5 @@ jobs:
- name: deploy
env:
MONGO_PASSWORD_PROD: ${{ secrets.MONGO_PASSWORD_PROD }}
REDIS_PASSWORD_PROD: ${{ secrets.REDIS_PASSWORD_PROD }}
run: docker stack deploy --with-registry-auth -c ./.deploy/deploy-prod.yaml infra

View File

@ -3,6 +3,7 @@ import pydantic
import typing
from app.storage.mongo import tasks
from app.storage.redis import lock
router = fastapi.APIRouter()
@ -16,7 +17,8 @@ class Response(pydantic.BaseModel):
@router.get('/api/v1/take', responses={404: {'description': 'Not found'}})
async def execute(queue: typing.Annotated[str, fastapi.Header()]) -> Response:
task = await tasks.take_task(queue)
async with lock.acquire(queue):
task = await tasks.take_task(queue)
if not task:
raise fastapi.HTTPException(404)
return Response(id=str(task._id), attempt=task.attempts, payload=task.payload)

View File

@ -0,0 +1,15 @@
import os
import redis.asyncio
REDIS_HOST = os.getenv('REDIS_HOST', 'localhost')
REDIS_PASSWORD = os.getenv('REDIS_PASSWORD')
if REDIS_PASSWORD:
URL = f'redis://:{REDIS_PASSWORD}@{REDIS_HOST}:6379'
else:
URL = f'redis://{REDIS_HOST}:6379'
pool = redis.asyncio.ConnectionPool.from_url(URL)
database = redis.Redis.from_pool(pool)

View File

@ -0,0 +1,8 @@
import contextlib
from app.storage import redis
@contextlib.contextmanager
def acquire(lock_name: str):
return redis.database.lock(lock_name)