DatabaseRouter¶
Added in version 0.13.0.
DatabaseRouter provides the following functionality:
All inbound and outbound messages are stored in the database.
Inbound and outbound messages are processed asynchronously with Celery.
Outbound messages are automatically split into batches for sending.
Use of Django’s bulk create to optimize database inserts.
Messages that fail to send will use Celery’s retry mechanism.
Similar to CeleryRouter, DatabaseRouter is designed for
projects that require high messages volumes.
How it works¶
Before doing any processing, an inbound message is loaded into the
MessageandTransmissionmodels. A celery task is then queued to process the message asynchronously.The celery task reconstructs the message object, fires up the router, and passes it off for inbound processing.
Any replies are loaded into the
MessageandTransmissionmodels.The router then divides the outbound messages by backend and queues tasks for sending chunks of messages to their respective backends.
As tasks complete, the status of the messages are updated in the database, including any errors that occurred.
Installation¶
Note
DatabaseRouter depends on django-celery 3.0+. Please follow
the django-celery setup instructions before proceeding.
Add rapidsms.router.db to INSTALLED_APPS, then import djcelery and
invoke setup_loader():
INSTALLED_APPS = (
# Other apps here
"rapidsms.router.db",
)
import djcelery
djcelery.setup_loader()
This will register Celery tasks in rapidsms.router.db.tasks.
Set RAPIDSMS_ROUTER to use DatabaseRouter:
RAPIDSMS_ROUTER = "rapidsms.router.db.DatabaseRouter"
Run syncdb to create the necessary database tables:
python manage.py syncdb
That’s it!
Configuration¶
The database router has one optional setting,
DB_ROUTER_DEFAULT_BATCH_SIZE, to change the default
maximum size of a batch of messages from 200.
Celery workers¶
Finally, you’ll need to run the celery worker command (in a separate shell from
runserver) to begin consuming queued tasks:
python manage.py celery worker --loglevel=info
Now your messages will be handled asynchronously with DatabaseRouter.
Database models¶
DatabaseRouter utilizes two database models, Message and
Transmission.
Message¶
The Message model contains the context of a text message. For every associated Connection, a Message has an associated Transmission.
Transmission¶
A Transmission represents the instance of a particular Message and Connection.
Message status values¶
Message and Transmission objects can have the following status values:
- Inbound values:
Q- Queued: Message is queued and awaiting processingR- Received: Message has been processed and responses are queuedE- Errored: An error occurred during processing
- Outbound values:
Q- Queued: Message is queued and awaiting processingP- Processing: Message is sendingS- Sent: All associated transmissions have been sentD- Delivered: All associated transmissions have been delivered (requires backend functionality)E- Errored: An error occurred during processing