Skip to main content

Task/workflow toolkit for Temporal + Redis

Project description

r7kit — лёгкая обёртка над Temporal + Redis для организации workflow-задач с хранением состояния (payload) в Redis и автоматической сериализацией.


  1. Установка
  2. Конфигурация
  3. Базовые понятия
  4. Определение Workflow
  5. Запуск worker-процесса
  6. Запуск workflow из клиента
  7. CRUD операций над задачей
  8. Вложенный payload и child-workflow
  9. Логирование и сериализация
  10. TTL-удаление задач

pip install r7kit

Библиотека не поднимает ни Temporal-сервис, ни Redis — предполагается, что они уже есть.


Можно настроить r7kit через переменные окружения или программно до первого импорта:

from r7kit.config import configure

configure(
    redis_url="redis://localhost:6379",
    temporal_address="localhost:7233",
    stream_default="task_events",
    deleted_ttl=60,  # TTL после delete (в секундах)
)

Переменные окружения:

  • REDIS_URL
  • TEMPORAL_ADDRESS
  • R7KIT_STREAM
  • R7KIT_DELETED_TTL

Каждому workflow соответствует Redis-задача, которая хранится в HSET task:{uuid} и имеет:

  • статус (status)
  • временные метки (created_at, updated_at)
  • payload (вложенный словарь)
  • поток событий (Redis Stream)

Библиотека сериализует payload в orjson + префикс, автоматически декодируя при чтении.


from r7kit.decorators import taskflow
from r7kit.base_task_workflow import BaseTaskWorkflow

@taskflow(queue="producer-queue")
class MyFlow(BaseTaskWorkflow):
    async def handle(self) -> int:
        await self.load_task()
        x = self.payload["input"]
        await self.patch_task({"status": "processing"})
        await self.patch_task({"status": "done", "payload": {"result": x * 2}})
        await self.delete_task(ttl=60)
        return x * 2

Наследуй BaseTaskWorkflow, используй load_task, patch_task, delete_task и self.payload.


from r7kit.worker import R7Worker

if __name__ == "__main__":
    R7Worker("myapp", queue="producer-queue").start()

Указывается имя пакета, где лежат ваши воркфлоу, и очередь.


from myapp.flows import MyFlow

handle, uuid = await MyFlow.start(payload={"input": 42})
await handle.result()

Или:

from r7kit.workflow_utils import submit_workflow

await submit_workflow(MyFlow, payload={"input": 42})

После await self.load_task() доступны:

  • self.task: объект TaskModel
  • self.payload: словарь

Поддерживаются:

await self.patch_task({"status": "in_progress"})
await self.delete_task(ttl=60)
await self.get_task()
await self.exists()  # логическое удаление

Асинхронный контекст для сохранения payload:

async with self.state():
    self.payload["x"] = 1

Можно запускать дочерние воркфлоу:

result = await self.child("OtherFlow", queue="q").run()

Или:

handle, child_task_id = await self.child("OtherFlow", queue="q").start(payload={...})

Для логирования:

from r7kit.logging import setup
setup("DEBUG")

Для ручной сериализации (например, вне воркфлоу):

from r7kit.serializer import dumps, loads

Удаление:

await self.delete_task(ttl=10)

Это:

  • Ставит deleted_at = now
  • Устанавливает PEXPIRE на Redis-ключ задачи
  • Логируется в Redis Stream

TTL можно задать через R7KIT_DELETED_TTL или явно в методе.


@taskflow(queue="producer-queue")
class ProducerWorkflow(BaseTaskWorkflow):
    async def handle(self) -> int:
        await self.load_task()
        x = int(self.payload["mathematic"]["input"])
        await self.patch_task({"status": "sent"})
        res = await self.child("ProcessorWorkflow", queue="processor-queue").run()
        await self.patch_task({"status": "done", "payload": {"mathematic": {"input": x, "result": res}}})
        await self.delete_task(ttl=10)
        return res


MIT

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

r7kit-0.2.2.tar.gz (18.4 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

r7kit-0.2.2-py3-none-any.whl (23.0 kB view details)

Uploaded Python 3

File details

Details for the file r7kit-0.2.2.tar.gz.

File metadata

  • Download URL: r7kit-0.2.2.tar.gz
  • Upload date:
  • Size: 18.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.12.3

File hashes

Hashes for r7kit-0.2.2.tar.gz
Algorithm Hash digest
SHA256 1b8dfa548f59d954c6f12d0d11f33832ef15796e0df246eeb8839b8775c4661f
MD5 4e377356ddb0c4bd78ef3258453d5aa4
BLAKE2b-256 f7733d8a262e9095289f43e01f3ba899f89867e1ea437fc0b56c5ecfdab8fe60

See more details on using hashes here.

File details

Details for the file r7kit-0.2.2-py3-none-any.whl.

File metadata

  • Download URL: r7kit-0.2.2-py3-none-any.whl
  • Upload date:
  • Size: 23.0 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.12.3

File hashes

Hashes for r7kit-0.2.2-py3-none-any.whl
Algorithm Hash digest
SHA256 26f1e923f7371842c84784df3881c7d48fa5c2bc4e8d8aeafb1f8304e82c0c3f
MD5 e6a390d67a56cdd8f339800de6971bbe
BLAKE2b-256 86fc09807e080e31aaa1e92d9ce40d2169867e82a351f69845d0ddb25a44c268

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page