Git Product home page Git Product logo

metroid's Introduction


Metroid

Subscribe, act, publish.

Python version Django version Celery version ServiceBus version Django GUID version

Codecov Pre-commit Black mypy isort

Metroid - Metro for Django

This app is intended to streamline integration with Metro for all Django+Celery users by:

  • Asynchronous handling of subscriptions and messages with one command
  • Execute Celery tasks based on message topics, defined in settings.py
  • Retry failed tasks through your admin dashboard when using the MetroidTask base

Overview

  • python >= 3.10
  • django >= 4.2 - For asgiref, settings
  • django-guid >= 3.2.0 - Storing correlation IDs for failed tasks in the database, making debugging easy
  • Choose one:
    • celery >= 5.3.0 - Execute tasks based on a subject
    • django-rq >= 2.4.1 - Execute tasks based on a subject

Implementation

The python manage.py metroid app is fully asynchronous, and has no blocking code. It utilizes Celery to execute tasks.

It works by:

  1. Going through all your configured subscriptions and start a new async connection for each one of them
  2. Metro sends messages on the subscriptions
  3. This app filters out messages matching subjects you have defined, and queues a celery task to execute the function as specified for that subject
    3.1. If no task is found for that subject, the message is marked as complete
  4. The message is marked as complete after the Celery task has successfully been queued
  5. If the task is failed, an entry is automatically created in your database
  6. All failed tasks can be retried manually through the admin dashboard

Configure and install this package

Note For a complete example, have a look in demoproj/settings.py.

  1. Create a METROID key in settings.py with all your subscriptions and handlers. Example settings:
METROID = {
    'subscriptions': [
        {
            'topic_name': 'metro-demo',
            'subscription_name': 'sub-metrodemo-metrodemoerfett',
            'connection_string': config('CONNECTION_STRING_METRO_DEMO', None),
            'handlers': [
               {
                  'subject': 'MetroDemo/Type/GeekJokes',
                  'regex': False,
                  'handler_function': 'demoproj.demoapp.services.my_func'
                }
            ],
        },
    ],
   'worker_type': 'celery', # default
}

The handler_function is defined by providing the full dotted path as a string. For example,from demoproj.demoapp.services import my_func is provided as 'demoproj.demoapp.services.my_func'.

The handlers subject can be a regular expression or a string. If a regular expression is provided, the variable regex must be set to True. Example:

'handlers': [{'subject': r'^MetroDemo/Type/.*$','regex':True,'handler_function': my_func}],
  1. Configure Django-GUID by adding the app to your installed apps, to your middlewares and configuring logging as described here. Make sure you enable the CeleryIntegration:
from django_guid.integrations import CeleryIntegration

DJANGO_GUID = {
    'INTEGRATIONS': [
        CeleryIntegration(
            use_django_logging=True,
            log_parent=True,
        )
    ],
}

Creating your own handler functions

Your functions will be called with keyword arguments for

message, topic_name, subscription_name and subject. You function should in other words look something like this:

Celery
@app.task(base=MetroidTask)
def my_func(*, message: dict, topic_name: str, subscription_name: str, subject: str) -> None:
rq
def my_func(*, message: dict, topic_name: str, subscription_name: str, subject: str) -> None:

Running the project

  1. Ensure you have redis running:
docker-compose up
  1. Run migrations
python manage.py migrate
  1. Create an admin account
python manage.py createsuperuser
  1. Start a worker:
celery -A demoproj worker -l info
  1. Run the subscriber:
python manage.py metroid
  1. Send messages to Metro. Example code can be found in demoproj/demoapp/services.py
  2. Run the webserver:
python manage.py runserver 8000
  1. See failed messages under http://localhost:8080/admin

To contribute, please see CONTRIBUTING.md

metroid's People

Contributors

aliarfan avatar dependabot[bot] avatar fholange avatar ingvaldlorentzen avatar jonasks avatar perastad avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar

metroid's Issues

Messages failed to publish should be stored in a database

Create a fallback to store messages that fails to publish to Metro in the database, allowing us to retry the publish from the admin dashboard/auto-publish.

This is the exact functionality we have for subscribing, but the implementation will most likely have to be different.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.