Skip to main content

Queue-Agnostic Python Library

A flexible, queue-agnostic Python library for processing documents (PDFs, images) that seamlessly works with different queue providers including RabbitMQ, AWS SQS, Azure Service Bus, and Google Cloud Pub/Sub.

🚀 Features

  • Provider Agnostic: Single interface for multiple queue providers
  • Environment-Based Configuration: Easy deployment across different clients
  • Support for Multiple Providers:
    • RabbitMQ
    • AWS SQS
    • Azure Service Bus
    • Google Cloud Pub/Sub
  • Async/Await: Built on asyncio for high performance
  • Automatic Connection Management: Built-in connection handling
  • Error Handling: Automatic message retry/requeue on failures
  • Easy to Extend: Add new queue providers by implementing the QueueInterface

📦 Installation

pip install -e .

Or install from requirements:

pip install -r requirements.txt

🔧 Configuration

Environment Variables

Create a .env file:

# Set your queue provider
QUEUE_PROVIDER=rabbitmq  # or aws-sqs, azure-servicebus, gcp-pubsub

# Set your queue/topic name
QUEUE_NAME=document-processing-queue

# For GCP: Topic name for publishing
TOPIC_NAME=document-processing-topic

# Provider-specific configuration (see .env.example for details)
RABBITMQ_URL=amqp://localhost:5672

📖 Usage

Quick Start - Subscriber

import asyncio
from dotenv import load_dotenv
from queue_agnostic import QueueFactory

load_dotenv()

async def process_message(message):
    print('Processing:', message)
    # Your document processing logic here

async def main():
    # Create queue from environment variables
    result = QueueFactory.create_from_env()
    queue = result['adapter']
    queue_name = result['queue_name']
    
    await queue.connect()
    
    # Subscribe and process messages
    await queue.subscribe(queue_name, process_message)

asyncio.run(main())

Quick Start - Publisher

import asyncio
from dotenv import load_dotenv
from queue_agnostic import QueueFactory

load_dotenv()

async def main():
    result = QueueFactory.create_from_env()
    queue = result['adapter']
    topic_name = result['topic_name']
    
    await queue.connect()
    
    # Publish a message
    await queue.publish(topic_name, {
        'document_id': 'doc-123',
        'document_url': 'https://example.com/doc.pdf',
        'document_type': 'pdf'
    })
    
    await queue.disconnect()

asyncio.run(main())

Direct Usage (Without Environment Variables)

from queue_agnostic import QueueFactory

# Create queue with explicit configuration
queue = QueueFactory.create({
    'provider': 'rabbitmq',
    'options': {
        'url': 'amqp://localhost:5672'
    }
})

await queue.connect()
# ... use the queue
await queue.disconnect()

🏗️ Architecture

Project Structure

queue-agnostic-python/
├── queue_agnostic/
│   ├── __init__.py
│   ├── queue_interface.py          # Abstract interface
│   ├── queue_factory.py            # Factory for creating adapters
│   └── adapters/
│       ├── __init__.py
│       ├── rabbitmq_adapter.py     # RabbitMQ implementation
│       ├── aws_sqs_adapter.py      # AWS SQS implementation
│       ├── azure_servicebus_adapter.py  # Azure implementation
│       └── gcp_pubsub_adapter.py   # GCP implementation
├── examples/
│   ├── publisher.py                # Example publisher
│   └── subscriber.py               # Example subscriber
├── setup.py
├── requirements.txt
└── README.md

🔌 Queue Interface

All adapters implement:

Methods

  • connect() - Connect to the queue service
  • disconnect() - Disconnect from the queue service
  • publish(queue_name, message, options) - Publish a message
  • subscribe(queue_name, handler, options) - Subscribe and process messages
  • is_connected() - Check connection status

⚙️ Provider-Specific Configuration

RabbitMQ

QUEUE_PROVIDER=rabbitmq
RABBITMQ_URL=amqp://localhost:5672
QUEUE_NAME=my-queue

AWS SQS

QUEUE_PROVIDER=aws-sqs
AWS_REGION=us-east-1
AWS_ACCESS_KEY_ID=your_key
AWS_SECRET_ACCESS_KEY=your_secret
QUEUE_NAME=my-queue

Azure Service Bus

QUEUE_PROVIDER=azure-servicebus
AZURE_SERVICEBUS_CONNECTION_STRING=Endpoint=sb://...
QUEUE_NAME=my-queue

Google Cloud Pub/Sub

QUEUE_PROVIDER=gcp-pubsub
GCP_PROJECT_ID=your-project-id
GCP_KEY_FILENAME=./service-account-key.json
TOPIC_NAME=my-topic              # For publishing
QUEUE_NAME=my-subscription       # For subscribing

🚀 Running Examples

Run Subscriber

python examples/subscriber.py

Run Publisher

python examples/publisher.py

🔄 Deployment Scenarios

Same code, different configurations:

Client A (RabbitMQ):

QUEUE_PROVIDER=rabbitmq
RABBITMQ_URL=amqp://client-a-server:5672

Client B (AWS):

QUEUE_PROVIDER=aws-sqs
AWS_REGION=us-west-2

Client C (Azure):

QUEUE_PROVIDER=azure-servicebus
AZURE_SERVICEBUS_CONNECTION_STRING=Endpoint=sb://...

🐛 Error Handling

All adapters include built-in error handling:

  • Message Processing Errors: Messages are automatically requeued/nacked
  • Connection Errors: Logged and can be handled with reconnection logic
  • Graceful Shutdown: Proper cleanup on SIGINT/SIGTERM

📝 License

MIT

🤝 Contributing

Contributions are welcome! Feel free to submit issues or pull requests.

📞 Support

For issues or questions, please open an issue on the repository.

Metadata

Release files for queue-agnostic 1.0.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for queue-agnostic 1.0.0
File Size Uploaded
queue_agnostic-1.0.0.tar.gz 11.8 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for queue-agnostic 1.0.0
File Interpreter ABI Platform
queue_agnostic-1.0.0-py3-none-any.whl Python 3 none any Details

Total release size: 25.4 kB

Release files / queue_agnostic-1.0.0.tar.gz

Download URL queue_agnostic-1.0.0.tar.gz
Size 11.8 kB
Tags Source
SHA-256 checksum
How to use checksums
72d44d9e8940a87d04fcd7bfe7b5841659b5df397ba6753e18c8bdfc34d2aeed
BLAKE2b-256 checksum
How to use checksums
fffe5bf5f660e292306e6364c7ff1a4df93358b813eae8eda832187efdac6e41
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.13.2

Release files / queue_agnostic-1.0.0-py3-none-any.whl

Download URL queue_agnostic-1.0.0-py3-none-any.whl
Size 13.6 kB
Tags Python 3
SHA-256 checksum
How to use checksums
dc600adb85b6fc7f86e2fd7cd831ce5bc633e66f13315b6fbcaf4195898f80b5
BLAKE2b-256 checksum
How to use checksums
6e94373d126b939232197213e8070dc714b49d5c9c3bc13f75e1cd3c3b9ba80e
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.13.2

Release history Release notifications | RSS feed

This release

1.0.0 This release

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page