without-durability-redis
without-durability's two
interfaces over Redis: a workflow's completed steps as one hash, its claim as another, and a
queue of workflows that can run now.
from redis.asyncio import Redis
from without_durability import SplitDurable
from without_durability_redis import RedisCheckpointer, RedisStreamScheduler
redis = Redis(host=..., decode_responses=True) # this client owns both ends of every key
durable = SplitDurable(RedisCheckpointer(redis=redis), RedisStreamScheduler(redis=redis))
Every guarantee here is a small Lua script, and each is a script for the same reason: it is only correct as one step. Checking whether a workflow is free and taking it; checking a fencing token and applying the write it guards; testing whether a key is recorded and reading back the winner. Split any of them into two round trips and the gap between them is where the guarantee leaks.
LuaEffect is what this store can commit alongside a record, so a step whose
effect is a Redis write happens exactly once. That is worth stating plainly,
because the usual framing (that exactly-once needs Postgres) is wrong about why: a
Lua script is an atomic commit over Redis data, and the real constraint is that
you can only transact within one datastore.
On a cluster that constraint becomes a slot. A workflow's two keys are hash-tagged
(workflow:{id}) so a script may touch both, and an effect's keys must carry the
same tag. Redis enforces this rather than trusting it: declared keys spanning
slots are refused outright, and a script reaching a key another node owns dies
partway having written nothing.
Two queues ship, and the difference between them is the finding rather than a
choice you have to make carefully. RedisStreamScheduler is a stream read as a consumer
group beside a deadline-scored sorted set, which buys a blocking read so an idle
worker costs nothing. RedisSetScheduler is one sorted set scored by when each
workflow becomes visible, which makes the timer, the consumer group, the pending
list, and the trimmer all disappear, and costs the blocking read.
See the
without-durability-redis guide
(with the API reference)
for the scripts themselves, what each key holds and for how long, and the two
sharp edges (Redis's default persistence, and a TTL that can outlive a suspended
workflow).
Metadata
Release files for without-durability-redis 0.0.10
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| without_durability_redis-0.0.10.tar.gz | 28.2 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| without_durability_redis-0.0.10-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 60.8 kB
Release files / without_durability_redis-0.0.10.tar.gz
| Download URL | without_durability_redis-0.0.10.tar.gz |
|---|---|
| Size | 28.2 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
781491b4e9f028c43f3a780126a40ea709b2523c0043c9bff6326370250a6379
|
|
BLAKE2b-256 checksum How to use checksums |
7e38a433550e9afcbaa6f9566c73b533d80011a4cb555e1dcd86a9ee72bafd6b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.23 {"installer":{"name":"uv","version":"0.12.23","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / without_durability_redis-0.0.10-py3-none-any.whl
| Download URL | without_durability_redis-0.0.10-py3-none-any.whl |
|---|---|
| Size | 32.6 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
3fb5142d2284f9cd28fffc8b66f66b4d83c5561a326d3be1a89595bcac70a02a
|
|
BLAKE2b-256 checksum How to use checksums |
01af9751646099387b168e4dc669a8866b5abd9ceb381af4db96024c12d5d754
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.23 {"installer":{"name":"uv","version":"0.12.23","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|