squeal: SQL-Backed Message Queue
A python library implementing a message queue using a relational database as the storage backend.
Note: This is an alpha version. The interface is unstable. Feel free to try it out, though, and let me know what you think.
Why?
squeal offers a lightweight implementation of a message queue, using a backend that you probably already have as part of your infrastructure. The basic functionality is exposed by the squeal.Queue object:
createanddestroythe required database tablesputandgetmessages from a queue- a message payload is just a binary blob
- messages have a priority, where higher-priority messages are retrieved first
- consumers can
ackornackmessages to indicate success or failure - if a consumer acquires a message but doesn't
ackit, it will eventually be redelivered to another consumer - a message that is
nacked will be put back in the queue with an exponential backoff delay - a
Queueobject represents multiple logical queues, indicated by a messagetopic - topics are dynamic: they only exist as long as there's a message with that topic
- a
Queuecan query for existing topics or the number of messages waiting in any particular topic
Queue objects delegate to a Backend object that implements database-specific methods. The only backend is currently the MySQLBackend, which wraps a Connection from a mysql library, like pymysql.
What database backends are supported?
Currently, the only backend that has been tested is:
pymysqlwithmysql 8.1.0
But theoretically other database libraries can be used, as long as they implement PEP 249 (Python Database API Specification). Other database engines can probably be supported with minimal effort by changing the dialect of SQL that's generated. (That is, creating a new subclass of Backend)
Examples
Check the examples/ directory.
API
(Coming soon)
Contributing
To-Do
- dead letter queue for messages that fail repeatedly
- raise some better exceptions if we get an expected error from the SQL library (table doesn't exist, etc)
- do some benchmarking and add indices
- refactor tests so all backends are compared against the same expectations
Please feel free to submit an issue to the github for bugs, comments, or feature requests. Also feel free to fork and make a PR.
Formatting
Please use black to format your code.
Running tests
Install the dev requirements in a virtual env:
python3 -m venv venv
. venv/bin/activate
pip install -r requirements.txt
The tests assume you have a mysql instance running locally. The connection can be adjusted with envvars, but the defaults are:
SQUEAL_TEST_HOSTNAME = os.environ.get("SQUEAL_TEST_HOSTNAME", "localhost")
SQUEAL_TEST_PORT = os.environ.get("SQUEAL_TEST_PORT", "3306")
SQUEAL_TEST_USERNAME = os.environ.get("SQUEAL_TEST_USERNAME", "root")
SQUEAL_TEST_PASSWORD = os.environ.get("SQUEAL_TEST_PASSWORD", "password")
SQUEAL_TEST_DATABASE = os.environ.get("SQUEAL_TEST_DATABASE", "test")
The easiest way to get this running is to just use docker:
docker run --name mysql -e MYSQL_ROOT_PASSWORD=password -d -p 3306:3306 mysql:8.1.0
Then the tests can be run with pytest:
pytest tests
Metadata
Release files for squeal 0.0.17
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| squeal-0.0.17.tar.gz | 16.9 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| squeal-0.0.17-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 31.6 kB
Release files / squeal-0.0.17.tar.gz
| Download URL | squeal-0.0.17.tar.gz |
|---|---|
| Size | 16.9 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
8435c6bd4f8a788ad10e9074094156a1f7c6fd361b53c0366c311264fbe0cdc1
|
|
BLAKE2b-256 checksum How to use checksums |
d40a55e02a2c5bf4d3415ffe6a2a3cc9e102179d63f87d5c64ce4bb2ed02c173
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/4.0.2 CPython/3.9.5
|
Release files / squeal-0.0.17-py3-none-any.whl
| Download URL | squeal-0.0.17-py3-none-any.whl |
|---|---|
| Size | 14.7 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
0385b5c37f7ae64f347eb96289ab86afff82953682e2c064e449884821cf8317
|
|
BLAKE2b-256 checksum How to use checksums |
0c97ec2a5e219c39e5253fef7708476cdf15841e5690d527be1aa5a60e22d341
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/4.0.2 CPython/3.9.5
|