redqueue 0.13.0__tar.gz → 0.13.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {redqueue-0.13.0 → redqueue-0.13.1}/CHANGELOG.md +39 -22
- {redqueue-0.13.0 → redqueue-0.13.1}/PKG-INFO +2 -2
- {redqueue-0.13.0 → redqueue-0.13.1}/README-zh-CN.md +51 -51
- {redqueue-0.13.0 → redqueue-0.13.1}/README.md +51 -51
- {redqueue-0.13.0 → redqueue-0.13.1}/docs/API.md +51 -51
- {redqueue-0.13.0 → redqueue-0.13.1}/pyproject.toml +1 -1
- {redqueue-0.13.0 → redqueue-0.13.1}/src/redqueue/__init__.py +4 -4
- {redqueue-0.13.0 → redqueue-0.13.1}/src/redqueue/_version.py +1 -1
- {redqueue-0.13.0 → redqueue-0.13.1}/src/redqueue/async_client.py +26 -21
- {redqueue-0.13.0 → redqueue-0.13.1}/src/redqueue/backends/async_delay.py +372 -372
- {redqueue-0.13.0 → redqueue-0.13.1}/src/redqueue/backends/async_list.py +12 -12
- {redqueue-0.13.0 → redqueue-0.13.1}/src/redqueue/backends/async_stream.py +601 -601
- {redqueue-0.13.0 → redqueue-0.13.1}/src/redqueue/backends/base.py +160 -160
- {redqueue-0.13.0 → redqueue-0.13.1}/src/redqueue/backends/delay.py +380 -380
- {redqueue-0.13.0 → redqueue-0.13.1}/src/redqueue/backends/list.py +12 -12
- {redqueue-0.13.0 → redqueue-0.13.1}/src/redqueue/backends/stream.py +575 -575
- {redqueue-0.13.0 → redqueue-0.13.1}/src/redqueue/cli.py +19 -19
- {redqueue-0.13.0 → redqueue-0.13.1}/src/redqueue/client.py +25 -20
- {redqueue-0.13.0 → redqueue-0.13.1}/src/redqueue/message.py +174 -169
- {redqueue-0.13.0 → redqueue-0.13.1}/src/redqueue/monitoring.py +189 -189
- {redqueue-0.13.0 → redqueue-0.13.1}/tests/test_availability.py +255 -255
- {redqueue-0.13.0 → redqueue-0.13.1}/tests/test_cli.py +61 -61
- {redqueue-0.13.0 → redqueue-0.13.1}/tests/test_project_skeleton.py +230 -166
- {redqueue-0.13.0 → redqueue-0.13.1}/tests/test_real_redis_availability.py +124 -124
- {redqueue-0.13.0 → redqueue-0.13.1}/.github/workflows/ci.yml +0 -0
- {redqueue-0.13.0 → redqueue-0.13.1}/.gitignore +0 -0
- {redqueue-0.13.0 → redqueue-0.13.1}/CODE_OF_CONDUCT.md +0 -0
- {redqueue-0.13.0 → redqueue-0.13.1}/CONTRIBUTING.md +0 -0
- {redqueue-0.13.0 → redqueue-0.13.1}/LICENSE +0 -0
- {redqueue-0.13.0 → redqueue-0.13.1}/NOTICE +0 -0
- {redqueue-0.13.0 → redqueue-0.13.1}/docs/RELEASE.md +0 -0
- {redqueue-0.13.0 → redqueue-0.13.1}/examples/README.md +0 -0
- {redqueue-0.13.0 → redqueue-0.13.1}/examples/__init__.py +0 -0
- {redqueue-0.13.0 → redqueue-0.13.1}/examples/async_list_queue.py +0 -0
- {redqueue-0.13.0 → redqueue-0.13.1}/examples/common.py +0 -0
- {redqueue-0.13.0 → redqueue-0.13.1}/examples/compatibility_check.py +0 -0
- {redqueue-0.13.0 → redqueue-0.13.1}/examples/custom_serializer.py +0 -0
- {redqueue-0.13.0 → redqueue-0.13.1}/examples/delayed_tasks.py +0 -0
- {redqueue-0.13.0 → redqueue-0.13.1}/examples/monitoring_hooks.py +0 -0
- {redqueue-0.13.0 → redqueue-0.13.1}/examples/stream_queue.py +0 -0
- {redqueue-0.13.0 → redqueue-0.13.1}/examples/sync_list_queue.py +0 -0
- {redqueue-0.13.0 → redqueue-0.13.1}/requirements.txt +0 -0
- {redqueue-0.13.0 → redqueue-0.13.1}/scripts/check.py +0 -0
- {redqueue-0.13.0 → redqueue-0.13.1}/src/redqueue/__main__.py +0 -0
- {redqueue-0.13.0 → redqueue-0.13.1}/src/redqueue/backends/__init__.py +0 -0
- {redqueue-0.13.0 → redqueue-0.13.1}/src/redqueue/compat.py +0 -0
- {redqueue-0.13.0 → redqueue-0.13.1}/src/redqueue/config.py +0 -0
- {redqueue-0.13.0 → redqueue-0.13.1}/src/redqueue/connection.py +0 -0
- {redqueue-0.13.0 → redqueue-0.13.1}/src/redqueue/exceptions.py +0 -0
- {redqueue-0.13.0 → redqueue-0.13.1}/src/redqueue/serialization.py +0 -0
- {redqueue-0.13.0 → redqueue-0.13.1}/tests/README.md +0 -0
- {redqueue-0.13.0 → redqueue-0.13.1}/tests/__init__.py +0 -0
- {redqueue-0.13.0 → redqueue-0.13.1}/tests/fakes.py +0 -0
- {redqueue-0.13.0 → redqueue-0.13.1}/tests/test_backend_contracts.py +0 -0
- {redqueue-0.13.0 → redqueue-0.13.1}/tests/test_integration_redis.py +0 -0
- {redqueue-0.13.0 → redqueue-0.13.1}/tests/test_performance.py +0 -0
- {redqueue-0.13.0 → redqueue-0.13.1}/tests/test_real_redis_performance.py +0 -0
|
@@ -7,36 +7,53 @@ All notable public release changes are documented here.
|
|
|
7
7
|
Development versions are tracked separately from formal release versions.
|
|
8
8
|
开发版本与正式版本分开管理。
|
|
9
9
|
|
|
10
|
-
## [0.13.
|
|
10
|
+
## [0.13.1] - 2026-06-27
|
|
11
11
|
|
|
12
|
-
###
|
|
12
|
+
### Fixed
|
|
13
13
|
|
|
14
|
-
-
|
|
15
|
-
`
|
|
16
|
-
|
|
17
|
-
-
|
|
18
|
-
|
|
19
|
-
`headers["trace_id"]` messages.
|
|
20
|
-
- Added `trace_id` to monitoring events and CLI message output for lifecycle
|
|
21
|
-
correlation.
|
|
22
|
-
- Added CLI `--trace-id` support for `publish` and `delay`.
|
|
23
|
-
- Added `new_trace_id()` helper for callers that want RedQueue-generated trace
|
|
24
|
-
identifiers.
|
|
14
|
+
- Fixed a compatibility regression where legacy messages with blank
|
|
15
|
+
`headers["trace_id"]` values could fail to construct or consume after
|
|
16
|
+
upgrading to `0.13.0`.
|
|
17
|
+
- Fixed sync and async `publish(..., delay=..., message_id=...)` so delayed
|
|
18
|
+
publishing preserves caller-provided message ids.
|
|
25
19
|
|
|
26
|
-
###
|
|
20
|
+
### 修复
|
|
27
21
|
|
|
28
|
-
- `
|
|
29
|
-
|
|
30
|
-
-
|
|
31
|
-
|
|
32
|
-
- 监控事件和 CLI 消息输出新增 `trace_id`,方便按链路聚合生命周期事件。
|
|
33
|
-
- CLI 的 `publish` 和 `delay` 命令新增 `--trace-id`。
|
|
34
|
-
- 新增 `new_trace_id()` helper,方便调用方生成 RedQueue trace 标识。
|
|
22
|
+
- 修复升级到 `0.13.0` 后,历史消息中空白 `headers["trace_id"]` 可能导致
|
|
23
|
+
消息构造或消费失败的兼容性回归。
|
|
24
|
+
- 修复同步和异步 `publish(..., delay=..., message_id=...)`,现在延迟发布会
|
|
25
|
+
保留调用方传入的消息 ID。
|
|
35
26
|
|
|
36
|
-
## [0.
|
|
27
|
+
## [0.13.0] - 2026-06-27
|
|
37
28
|
|
|
38
29
|
### Added
|
|
39
30
|
|
|
31
|
+
- Added first-class `trace_id` support to `Message`, sync and async
|
|
32
|
+
`publish()`, sync and async `delay()`, List, Streams, and delayed task
|
|
33
|
+
backends.
|
|
34
|
+
- Added trace propagation through message envelopes, retry, dead-letter,
|
|
35
|
+
delayed release, and requeue flows while remaining compatible with existing
|
|
36
|
+
`headers["trace_id"]` messages.
|
|
37
|
+
- Added `trace_id` to monitoring events and CLI message output for lifecycle
|
|
38
|
+
correlation.
|
|
39
|
+
- Added CLI `--trace-id` support for `publish` and `delay`.
|
|
40
|
+
- Added `new_trace_id()` helper for callers that want RedQueue-generated trace
|
|
41
|
+
identifiers.
|
|
42
|
+
|
|
43
|
+
### 新增
|
|
44
|
+
|
|
45
|
+
- `Message`、同步和异步 `publish()`、同步和异步 `delay()`、List、Streams
|
|
46
|
+
和延迟任务后端新增一等 `trace_id` 支持。
|
|
47
|
+
- trace 会穿过消息 envelope、重试、死信、延迟释放和重放流程,并兼容已有的
|
|
48
|
+
`headers["trace_id"]` 消息。
|
|
49
|
+
- 监控事件和 CLI 消息输出新增 `trace_id`,方便按链路聚合生命周期事件。
|
|
50
|
+
- CLI 的 `publish` 和 `delay` 命令新增 `--trace-id`。
|
|
51
|
+
- 新增 `new_trace_id()` helper,方便调用方生成 RedQueue trace 标识。
|
|
52
|
+
|
|
53
|
+
## [0.12.0] - 2026-06-23
|
|
54
|
+
|
|
55
|
+
### Added
|
|
56
|
+
|
|
40
57
|
- Added the `redqueue` CLI and `python -m redqueue` module entry point for
|
|
41
58
|
developer debugging.
|
|
42
59
|
- Added CLI commands for Redis compatibility checks, queue statistics, message
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: redqueue
|
|
3
|
-
Version: 0.13.
|
|
3
|
+
Version: 0.13.1
|
|
4
4
|
Summary: Redis-backed Python message queue library with List, Streams, delayed tasks, and monitoring.
|
|
5
5
|
Project-URL: Homepage, https://github.com/SpringMirror-pear/redqueue
|
|
6
6
|
Project-URL: Repository, https://github.com/SpringMirror-pear/redqueue.git
|
|
@@ -367,7 +367,7 @@ REDQUEUE_REDIS_URL=redis://127.0.0.1:6379/0 PYTHONPATH=src python -m pytest -m "
|
|
|
367
367
|
|
|
368
368
|
Latest local run on Python `3.14.5`:
|
|
369
369
|
|
|
370
|
-
- Full test suite without `REDQUEUE_REDIS_URL`: `
|
|
370
|
+
- Full test suite without `REDQUEUE_REDIS_URL`: `102 passed, 8 skipped`.
|
|
371
371
|
- Real Redis availability suite: `3 passed` with
|
|
372
372
|
`redis://127.0.0.1:6379/0`.
|
|
373
373
|
- Real Redis server: Redis for Windows `5.0.14.1`.
|
|
@@ -14,11 +14,11 @@ https://github.com/SpringMirror-pear/redqueue.git
|
|
|
14
14
|
`BRPOPLPUSH`。
|
|
15
15
|
- 基于 Redis Streams 的消费组后端,Streams 要求 Redis `>=5.0`。
|
|
16
16
|
- 基于 Redis Sorted Set 的延迟任务。
|
|
17
|
-
- 同步客户端 `QueueClient` 与异步客户端 `AsyncQueueClient`。
|
|
18
|
-
- 支持同步和异步 Redis 连接池管理器,方便多个客户端共享连接池。
|
|
19
|
-
- 提供 `redqueue` CLI,用于本地调试和运行时检查。
|
|
20
|
-
- 一等 `trace_id` 链路追踪能力,贯穿消息生命周期。
|
|
21
|
-
- 带结构化上下文的统一异常体系。
|
|
17
|
+
- 同步客户端 `QueueClient` 与异步客户端 `AsyncQueueClient`。
|
|
18
|
+
- 支持同步和异步 Redis 连接池管理器,方便多个客户端共享连接池。
|
|
19
|
+
- 提供 `redqueue` CLI,用于本地调试和运行时检查。
|
|
20
|
+
- 一等 `trace_id` 链路追踪能力,贯穿消息生命周期。
|
|
21
|
+
- 带结构化上下文的统一异常体系。
|
|
22
22
|
- 针对发布、消费、确认、拒绝、重试、死信、延迟和后端错误的监控事件。
|
|
23
23
|
- 通过 `INFO server` 探测 Redis 能力。
|
|
24
24
|
- Apache License 2.0。
|
|
@@ -72,16 +72,16 @@ redqueue stats --url redis://127.0.0.1:6379/0 --queue emails
|
|
|
72
72
|
|
|
73
73
|
发布和消费消息:
|
|
74
74
|
|
|
75
|
-
```bash
|
|
76
|
-
redqueue publish --queue emails --payload '{"to":"user@example.com"}'
|
|
77
|
-
redqueue consume --queue emails --timeout 1 --ack
|
|
78
|
-
```
|
|
79
|
-
|
|
80
|
-
发布时指定 trace:
|
|
81
|
-
|
|
82
|
-
```bash
|
|
83
|
-
redqueue publish --queue emails --payload '{"to":"user@example.com"}' --trace-id trace-123
|
|
84
|
-
```
|
|
75
|
+
```bash
|
|
76
|
+
redqueue publish --queue emails --payload '{"to":"user@example.com"}'
|
|
77
|
+
redqueue consume --queue emails --timeout 1 --ack
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
发布时指定 trace:
|
|
81
|
+
|
|
82
|
+
```bash
|
|
83
|
+
redqueue publish --queue emails --payload '{"to":"user@example.com"}' --trace-id trace-123
|
|
84
|
+
```
|
|
85
85
|
|
|
86
86
|
调试延迟任务:
|
|
87
87
|
|
|
@@ -102,8 +102,8 @@ redqueue dead-letters --queue emails --limit 20
|
|
|
102
102
|
|
|
103
103
|
同步 List 队列:
|
|
104
104
|
|
|
105
|
-
```python
|
|
106
|
-
from redqueue import QueueClient, new_trace_id
|
|
105
|
+
```python
|
|
106
|
+
from redqueue import QueueClient, new_trace_id
|
|
107
107
|
|
|
108
108
|
client = QueueClient.from_url(
|
|
109
109
|
"redis://127.0.0.1:6379/0",
|
|
@@ -111,15 +111,15 @@ client = QueueClient.from_url(
|
|
|
111
111
|
backend="list",
|
|
112
112
|
)
|
|
113
113
|
|
|
114
|
-
trace_id = new_trace_id()
|
|
115
|
-
message_id = client.publish({"to": "user@example.com"}, trace_id=trace_id)
|
|
116
|
-
message = client.consume(timeout=1)
|
|
117
|
-
|
|
118
|
-
if message is not None:
|
|
119
|
-
try:
|
|
120
|
-
print(message.trace_id)
|
|
121
|
-
print(message.payload)
|
|
122
|
-
client.ack(message)
|
|
114
|
+
trace_id = new_trace_id()
|
|
115
|
+
message_id = client.publish({"to": "user@example.com"}, trace_id=trace_id)
|
|
116
|
+
message = client.consume(timeout=1)
|
|
117
|
+
|
|
118
|
+
if message is not None:
|
|
119
|
+
try:
|
|
120
|
+
print(message.trace_id)
|
|
121
|
+
print(message.payload)
|
|
122
|
+
client.ack(message)
|
|
123
123
|
except Exception:
|
|
124
124
|
client.retry(message, reason="handler failed")
|
|
125
125
|
```
|
|
@@ -170,30 +170,30 @@ asyncio.run(main())
|
|
|
170
170
|
```python
|
|
171
171
|
from redqueue import QueueClient
|
|
172
172
|
|
|
173
|
-
client = QueueClient.from_url("redis://127.0.0.1:6379/0", queue="emails")
|
|
174
|
-
client.delay({"to": "later@example.com"}, delay_seconds=60, trace_id="trace-123")
|
|
175
|
-
released = client.schedule_due(limit=100)
|
|
176
|
-
```
|
|
177
|
-
|
|
178
|
-
链路追踪:
|
|
179
|
-
|
|
180
|
-
```python
|
|
181
|
-
from redqueue import InMemoryMonitoringHook, QueueClient, new_trace_id
|
|
182
|
-
|
|
183
|
-
hook = InMemoryMonitoringHook()
|
|
184
|
-
client = QueueClient.from_url(
|
|
185
|
-
"redis://127.0.0.1:6379/0",
|
|
186
|
-
queue="emails",
|
|
187
|
-
monitoring=hook,
|
|
188
|
-
)
|
|
189
|
-
|
|
190
|
-
trace_id = new_trace_id()
|
|
191
|
-
client.publish({"to": "user@example.com"}, trace_id=trace_id)
|
|
192
|
-
message = client.consume(timeout=1)
|
|
193
|
-
|
|
194
|
-
assert message.trace_id == trace_id
|
|
195
|
-
assert hook.events[-1].trace_id == trace_id
|
|
196
|
-
```
|
|
173
|
+
client = QueueClient.from_url("redis://127.0.0.1:6379/0", queue="emails")
|
|
174
|
+
client.delay({"to": "later@example.com"}, delay_seconds=60, trace_id="trace-123")
|
|
175
|
+
released = client.schedule_due(limit=100)
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
链路追踪:
|
|
179
|
+
|
|
180
|
+
```python
|
|
181
|
+
from redqueue import InMemoryMonitoringHook, QueueClient, new_trace_id
|
|
182
|
+
|
|
183
|
+
hook = InMemoryMonitoringHook()
|
|
184
|
+
client = QueueClient.from_url(
|
|
185
|
+
"redis://127.0.0.1:6379/0",
|
|
186
|
+
queue="emails",
|
|
187
|
+
monitoring=hook,
|
|
188
|
+
)
|
|
189
|
+
|
|
190
|
+
trace_id = new_trace_id()
|
|
191
|
+
client.publish({"to": "user@example.com"}, trace_id=trace_id)
|
|
192
|
+
message = client.consume(timeout=1)
|
|
193
|
+
|
|
194
|
+
assert message.trace_id == trace_id
|
|
195
|
+
assert hook.events[-1].trace_id == trace_id
|
|
196
|
+
```
|
|
197
197
|
|
|
198
198
|
连接池管理:
|
|
199
199
|
|
|
@@ -329,7 +329,7 @@ REDQUEUE_REDIS_URL=redis://127.0.0.1:6379/0 PYTHONPATH=src python -m pytest -m "
|
|
|
329
329
|
|
|
330
330
|
Python `3.14.5` 最新本地运行结果:
|
|
331
331
|
|
|
332
|
-
- 未设置 `REDQUEUE_REDIS_URL` 时的完整测试套件:`
|
|
332
|
+
- 未设置 `REDQUEUE_REDIS_URL` 时的完整测试套件:`102 passed, 8 skipped`。
|
|
333
333
|
- 真实 Redis 可用性套件:使用 `redis://127.0.0.1:6379/0` 时 `3 passed`。
|
|
334
334
|
- 真实 Redis 服务端:Redis for Windows `5.0.14.1`。
|
|
335
335
|
- 可用性套件覆盖:List processing 恢复、List 死信重放、Streams Redis
|
|
@@ -15,11 +15,11 @@ https://github.com/SpringMirror-pear/redqueue.git
|
|
|
15
15
|
fallback on older compatible Redis versions.
|
|
16
16
|
- Redis Streams backend with consumer groups. Streams require Redis `>=5.0`.
|
|
17
17
|
- Delayed tasks based on Redis Sorted Set.
|
|
18
|
-
- Sync client `QueueClient` and async client `AsyncQueueClient`.
|
|
19
|
-
- Redis connection pool managers for shared sync and async resources.
|
|
20
|
-
- `redqueue` CLI for local debugging and operational checks.
|
|
21
|
-
- First-class `trace_id` propagation for lifecycle tracing.
|
|
22
|
-
- Unified exception hierarchy with structured context.
|
|
18
|
+
- Sync client `QueueClient` and async client `AsyncQueueClient`.
|
|
19
|
+
- Redis connection pool managers for shared sync and async resources.
|
|
20
|
+
- `redqueue` CLI for local debugging and operational checks.
|
|
21
|
+
- First-class `trace_id` propagation for lifecycle tracing.
|
|
22
|
+
- Unified exception hierarchy with structured context.
|
|
23
23
|
- Monitoring events for publish, consume, ack, nack, retry, dead letter, delay,
|
|
24
24
|
and backend errors.
|
|
25
25
|
- Redis capability detection from `INFO server`.
|
|
@@ -74,16 +74,16 @@ redqueue stats --url redis://127.0.0.1:6379/0 --queue emails
|
|
|
74
74
|
|
|
75
75
|
Publish and consume messages:
|
|
76
76
|
|
|
77
|
-
```bash
|
|
78
|
-
redqueue publish --queue emails --payload '{"to":"user@example.com"}'
|
|
79
|
-
redqueue consume --queue emails --timeout 1 --ack
|
|
80
|
-
```
|
|
81
|
-
|
|
82
|
-
Publish with trace correlation:
|
|
83
|
-
|
|
84
|
-
```bash
|
|
85
|
-
redqueue publish --queue emails --payload '{"to":"user@example.com"}' --trace-id trace-123
|
|
86
|
-
```
|
|
77
|
+
```bash
|
|
78
|
+
redqueue publish --queue emails --payload '{"to":"user@example.com"}'
|
|
79
|
+
redqueue consume --queue emails --timeout 1 --ack
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
Publish with trace correlation:
|
|
83
|
+
|
|
84
|
+
```bash
|
|
85
|
+
redqueue publish --queue emails --payload '{"to":"user@example.com"}' --trace-id trace-123
|
|
86
|
+
```
|
|
87
87
|
|
|
88
88
|
Delayed task debugging:
|
|
89
89
|
|
|
@@ -104,8 +104,8 @@ All command output is JSON so it can be piped into scripts or log processors.
|
|
|
104
104
|
|
|
105
105
|
Synchronous List queue:
|
|
106
106
|
|
|
107
|
-
```python
|
|
108
|
-
from redqueue import QueueClient, new_trace_id
|
|
107
|
+
```python
|
|
108
|
+
from redqueue import QueueClient, new_trace_id
|
|
109
109
|
|
|
110
110
|
client = QueueClient.from_url(
|
|
111
111
|
"redis://127.0.0.1:6379/0",
|
|
@@ -113,15 +113,15 @@ client = QueueClient.from_url(
|
|
|
113
113
|
backend="list",
|
|
114
114
|
)
|
|
115
115
|
|
|
116
|
-
trace_id = new_trace_id()
|
|
117
|
-
message_id = client.publish({"to": "user@example.com"}, trace_id=trace_id)
|
|
118
|
-
message = client.consume(timeout=1)
|
|
119
|
-
|
|
120
|
-
if message is not None:
|
|
121
|
-
try:
|
|
122
|
-
print(message.trace_id)
|
|
123
|
-
print(message.payload)
|
|
124
|
-
client.ack(message)
|
|
116
|
+
trace_id = new_trace_id()
|
|
117
|
+
message_id = client.publish({"to": "user@example.com"}, trace_id=trace_id)
|
|
118
|
+
message = client.consume(timeout=1)
|
|
119
|
+
|
|
120
|
+
if message is not None:
|
|
121
|
+
try:
|
|
122
|
+
print(message.trace_id)
|
|
123
|
+
print(message.payload)
|
|
124
|
+
client.ack(message)
|
|
125
125
|
except Exception:
|
|
126
126
|
client.retry(message, reason="handler failed")
|
|
127
127
|
```
|
|
@@ -172,30 +172,30 @@ Delayed task:
|
|
|
172
172
|
```python
|
|
173
173
|
from redqueue import QueueClient
|
|
174
174
|
|
|
175
|
-
client = QueueClient.from_url("redis://127.0.0.1:6379/0", queue="emails")
|
|
176
|
-
client.delay({"to": "later@example.com"}, delay_seconds=60, trace_id="trace-123")
|
|
177
|
-
released = client.schedule_due(limit=100)
|
|
178
|
-
```
|
|
179
|
-
|
|
180
|
-
Trace IDs:
|
|
181
|
-
|
|
182
|
-
```python
|
|
183
|
-
from redqueue import InMemoryMonitoringHook, QueueClient, new_trace_id
|
|
184
|
-
|
|
185
|
-
hook = InMemoryMonitoringHook()
|
|
186
|
-
client = QueueClient.from_url(
|
|
187
|
-
"redis://127.0.0.1:6379/0",
|
|
188
|
-
queue="emails",
|
|
189
|
-
monitoring=hook,
|
|
190
|
-
)
|
|
191
|
-
|
|
192
|
-
trace_id = new_trace_id()
|
|
193
|
-
client.publish({"to": "user@example.com"}, trace_id=trace_id)
|
|
194
|
-
message = client.consume(timeout=1)
|
|
195
|
-
|
|
196
|
-
assert message.trace_id == trace_id
|
|
197
|
-
assert hook.events[-1].trace_id == trace_id
|
|
198
|
-
```
|
|
175
|
+
client = QueueClient.from_url("redis://127.0.0.1:6379/0", queue="emails")
|
|
176
|
+
client.delay({"to": "later@example.com"}, delay_seconds=60, trace_id="trace-123")
|
|
177
|
+
released = client.schedule_due(limit=100)
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
Trace IDs:
|
|
181
|
+
|
|
182
|
+
```python
|
|
183
|
+
from redqueue import InMemoryMonitoringHook, QueueClient, new_trace_id
|
|
184
|
+
|
|
185
|
+
hook = InMemoryMonitoringHook()
|
|
186
|
+
client = QueueClient.from_url(
|
|
187
|
+
"redis://127.0.0.1:6379/0",
|
|
188
|
+
queue="emails",
|
|
189
|
+
monitoring=hook,
|
|
190
|
+
)
|
|
191
|
+
|
|
192
|
+
trace_id = new_trace_id()
|
|
193
|
+
client.publish({"to": "user@example.com"}, trace_id=trace_id)
|
|
194
|
+
message = client.consume(timeout=1)
|
|
195
|
+
|
|
196
|
+
assert message.trace_id == trace_id
|
|
197
|
+
assert hook.events[-1].trace_id == trace_id
|
|
198
|
+
```
|
|
199
199
|
|
|
200
200
|
Connection pool management:
|
|
201
201
|
|
|
@@ -334,7 +334,7 @@ REDQUEUE_REDIS_URL=redis://127.0.0.1:6379/0 PYTHONPATH=src python -m pytest -m "
|
|
|
334
334
|
|
|
335
335
|
Latest local run on Python `3.14.5`:
|
|
336
336
|
|
|
337
|
-
- Full test suite without `REDQUEUE_REDIS_URL`: `
|
|
337
|
+
- Full test suite without `REDQUEUE_REDIS_URL`: `102 passed, 8 skipped`.
|
|
338
338
|
- Real Redis availability suite: `3 passed` with
|
|
339
339
|
`redis://127.0.0.1:6379/0`.
|
|
340
340
|
- Real Redis server: Redis for Windows `5.0.14.1`.
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
# RedQueue API / RedQueue API 文档
|
|
2
2
|
|
|
3
|
-
This document describes the public API available in RedQueue `0.13.
|
|
3
|
+
This document describes the public API available in RedQueue `0.13.1`.
|
|
4
4
|
|
|
5
|
-
本文档描述 RedQueue `0.13.
|
|
5
|
+
本文档描述 RedQueue `0.13.1` 的公开 API。
|
|
6
6
|
|
|
7
7
|
## Clients / 客户端
|
|
8
8
|
|
|
@@ -27,12 +27,12 @@ Methods / 方法:
|
|
|
27
27
|
- `from_url(url, *, queue, backend="list", connection_manager=None, **options) -> QueueClient`
|
|
28
28
|
- Advanced options include `pool_options`, injected `redis`, injected
|
|
29
29
|
`capabilities`, and `owns_redis`.
|
|
30
|
-
- `publish(payload, *, delay=None, headers=None, message_id=None, trace_id=None) -> str`
|
|
30
|
+
- `publish(payload, *, delay=None, headers=None, message_id=None, trace_id=None) -> str`
|
|
31
31
|
- `consume(*, timeout=None, batch_size=1) -> Message | list[Message] | None`
|
|
32
32
|
- `ack(message) -> None`
|
|
33
33
|
- `nack(message, *, requeue=True) -> None`
|
|
34
34
|
- `retry(message, *, delay=None, reason=None) -> None`
|
|
35
|
-
- `delay(payload, *, delay_seconds=None, run_at=None, headers=None, trace_id=None) -> str`
|
|
35
|
+
- `delay(payload, *, delay_seconds=None, run_at=None, headers=None, message_id=None, trace_id=None) -> str`
|
|
36
36
|
- `schedule_due(*, limit=100, now=None) -> int`
|
|
37
37
|
- `recover_stale(*, min_idle_ms=None, limit=100) -> int`
|
|
38
38
|
- `dead_letters(*, limit=100) -> list[Message]`
|
|
@@ -61,12 +61,12 @@ Methods / 方法:
|
|
|
61
61
|
- `await from_url(url, *, queue, backend="list", connection_manager=None, **options) -> AsyncQueueClient`
|
|
62
62
|
- Advanced options include `pool_options`, injected `redis`, injected
|
|
63
63
|
`capabilities`, and `owns_redis`.
|
|
64
|
-
- `await publish(payload, *, delay=None, headers=None, message_id=None, trace_id=None) -> str`
|
|
64
|
+
- `await publish(payload, *, delay=None, headers=None, message_id=None, trace_id=None) -> str`
|
|
65
65
|
- `await consume(*, timeout=None, batch_size=1) -> Message | list[Message] | None`
|
|
66
66
|
- `await ack(message) -> None`
|
|
67
67
|
- `await nack(message, *, requeue=True) -> None`
|
|
68
68
|
- `await retry(message, *, delay=None, reason=None) -> None`
|
|
69
|
-
- `await delay(payload, *, delay_seconds=None, run_at=None, headers=None, trace_id=None) -> str`
|
|
69
|
+
- `await delay(payload, *, delay_seconds=None, run_at=None, headers=None, message_id=None, trace_id=None) -> str`
|
|
70
70
|
- `await schedule_due(*, limit=100, now=None) -> int`
|
|
71
71
|
- `await recover_stale(*, min_idle_ms=None, limit=100) -> int`
|
|
72
72
|
- `await dead_letters(*, limit=100) -> list[Message]`
|
|
@@ -188,10 +188,10 @@ Fields / 字段:
|
|
|
188
188
|
|
|
189
189
|
- `id: str`
|
|
190
190
|
- `queue: str`
|
|
191
|
-
- `payload: Any`
|
|
192
|
-
- `headers: dict[str, Any]`
|
|
193
|
-
- `trace_id: str | None`
|
|
194
|
-
- `attempts: int`
|
|
191
|
+
- `payload: Any`
|
|
192
|
+
- `headers: dict[str, Any]`
|
|
193
|
+
- `trace_id: str | None`
|
|
194
|
+
- `attempts: int`
|
|
195
195
|
- `created_at: float`
|
|
196
196
|
- `available_at: float | None`
|
|
197
197
|
- `backend: str | None`
|
|
@@ -200,32 +200,32 @@ Fields / 字段:
|
|
|
200
200
|
|
|
201
201
|
Helpers / 辅助方法:
|
|
202
202
|
|
|
203
|
-
- `with_attempt() -> Message`
|
|
204
|
-
- `with_backend(backend, *, raw_id=None, raw_payload=None) -> Message`
|
|
205
|
-
- `new_message_id() -> str`
|
|
206
|
-
- `new_trace_id() -> str`
|
|
207
|
-
|
|
208
|
-
## Trace IDs / 链路追踪
|
|
209
|
-
|
|
210
|
-
`trace_id` is an optional lifecycle correlation id. It can be supplied to
|
|
211
|
-
`publish()` or `delay()`, is mirrored into `Message.headers["trace_id"]`, and is
|
|
212
|
-
preserved through consume, ack, nack, retry, delayed release, dead-letter, and
|
|
213
|
-
requeue flows.
|
|
214
|
-
|
|
215
|
-
`trace_id` 是可选的生命周期关联 ID。可以在 `publish()` 或 `delay()` 中传入,
|
|
216
|
-
会同步写入 `Message.headers["trace_id"]`,并在消费、ack、nack、retry、
|
|
217
|
-
延迟释放、死信和重放流程中保持传递。
|
|
218
|
-
|
|
219
|
-
```python
|
|
220
|
-
from redqueue import QueueClient, new_trace_id
|
|
221
|
-
|
|
222
|
-
client = QueueClient.from_url("redis://127.0.0.1:6379/0", queue="emails")
|
|
223
|
-
trace_id = new_trace_id()
|
|
224
|
-
client.publish({"to": "user@example.com"}, trace_id=trace_id)
|
|
225
|
-
message = client.consume(timeout=1)
|
|
226
|
-
|
|
227
|
-
assert message.trace_id == trace_id
|
|
228
|
-
```
|
|
203
|
+
- `with_attempt() -> Message`
|
|
204
|
+
- `with_backend(backend, *, raw_id=None, raw_payload=None) -> Message`
|
|
205
|
+
- `new_message_id() -> str`
|
|
206
|
+
- `new_trace_id() -> str`
|
|
207
|
+
|
|
208
|
+
## Trace IDs / 链路追踪
|
|
209
|
+
|
|
210
|
+
`trace_id` is an optional lifecycle correlation id. It can be supplied to
|
|
211
|
+
`publish()` or `delay()`, is mirrored into `Message.headers["trace_id"]`, and is
|
|
212
|
+
preserved through consume, ack, nack, retry, delayed release, dead-letter, and
|
|
213
|
+
requeue flows.
|
|
214
|
+
|
|
215
|
+
`trace_id` 是可选的生命周期关联 ID。可以在 `publish()` 或 `delay()` 中传入,
|
|
216
|
+
会同步写入 `Message.headers["trace_id"]`,并在消费、ack、nack、retry、
|
|
217
|
+
延迟释放、死信和重放流程中保持传递。
|
|
218
|
+
|
|
219
|
+
```python
|
|
220
|
+
from redqueue import QueueClient, new_trace_id
|
|
221
|
+
|
|
222
|
+
client = QueueClient.from_url("redis://127.0.0.1:6379/0", queue="emails")
|
|
223
|
+
trace_id = new_trace_id()
|
|
224
|
+
client.publish({"to": "user@example.com"}, trace_id=trace_id)
|
|
225
|
+
message = client.consume(timeout=1)
|
|
226
|
+
|
|
227
|
+
assert message.trace_id == trace_id
|
|
228
|
+
```
|
|
229
229
|
|
|
230
230
|
## Backends / 后端
|
|
231
231
|
|
|
@@ -323,13 +323,13 @@ All RedQueue custom exceptions inherit from `RedQueueError`.
|
|
|
323
323
|
- `CompositeMonitoringHook`
|
|
324
324
|
- `SafeMonitoringHook`
|
|
325
325
|
|
|
326
|
-
Monitoring events do not include business payload by default.
|
|
327
|
-
|
|
328
|
-
监控事件默认不包含业务 payload。
|
|
329
|
-
|
|
330
|
-
Monitoring events include `trace_id` when a message operation has one.
|
|
331
|
-
|
|
332
|
-
消息操作存在 `trace_id` 时,监控事件会包含该字段。
|
|
326
|
+
Monitoring events do not include business payload by default.
|
|
327
|
+
|
|
328
|
+
监控事件默认不包含业务 payload。
|
|
329
|
+
|
|
330
|
+
Monitoring events include `trace_id` when a message operation has one.
|
|
331
|
+
|
|
332
|
+
消息操作存在 `trace_id` 时,监控事件会包含该字段。
|
|
333
333
|
|
|
334
334
|
## Redis Capability Detection / Redis 能力探测
|
|
335
335
|
|
|
@@ -345,19 +345,19 @@ Streams are rejected with `RedisCompatibilityError` when Redis is below `5.0`.
|
|
|
345
345
|
|
|
346
346
|
## CLI / 命令行工具
|
|
347
347
|
|
|
348
|
-
RedQueue `0.13.
|
|
348
|
+
RedQueue `0.13.1` provides a `redqueue` console command and a
|
|
349
349
|
`python -m redqueue` module entry point for developer diagnostics.
|
|
350
350
|
|
|
351
|
-
RedQueue `0.13.
|
|
352
|
-
模块入口,用于开发者调试。
|
|
351
|
+
RedQueue `0.13.1` 提供 `redqueue` 控制台命令和 `python -m redqueue`
|
|
352
|
+
模块入口,用于开发者调试。
|
|
353
353
|
|
|
354
354
|
Commands / 命令:
|
|
355
355
|
|
|
356
356
|
- `redqueue check --url redis://127.0.0.1:6379/0`
|
|
357
357
|
- `redqueue stats --queue emails [--backend list|stream]`
|
|
358
|
-
- `redqueue publish --queue emails --payload '{"to":"user@example.com"}' [--trace-id trace-123]`
|
|
358
|
+
- `redqueue publish --queue emails --payload '{"to":"user@example.com"}' [--trace-id trace-123]`
|
|
359
359
|
- `redqueue consume --queue emails [--ack|--nack|--retry]`
|
|
360
|
-
- `redqueue delay --queue emails --payload '{"to":"later@example.com"}' --delay-seconds 60 [--trace-id trace-123]`
|
|
360
|
+
- `redqueue delay --queue emails --payload '{"to":"later@example.com"}' --delay-seconds 60 [--trace-id trace-123]`
|
|
361
361
|
- `redqueue schedule-due --queue emails --limit 100`
|
|
362
362
|
- `redqueue dead-letters --queue emails --limit 20`
|
|
363
363
|
|
|
@@ -367,9 +367,9 @@ Common options / 通用选项:
|
|
|
367
367
|
- `--queue`: RedQueue queue name.
|
|
368
368
|
- `--backend`: `list` or `stream`.
|
|
369
369
|
- `--namespace`: Redis key namespace. Defaults to `rq`.
|
|
370
|
-
- `--consumer-group`: Streams consumer group. Defaults to `redqueue`.
|
|
371
|
-
- `--consumer-name`: Optional Streams consumer name.
|
|
372
|
-
- `--trace-id`: Optional trace id for `publish` and `delay`.
|
|
370
|
+
- `--consumer-group`: Streams consumer group. Defaults to `redqueue`.
|
|
371
|
+
- `--consumer-name`: Optional Streams consumer name.
|
|
372
|
+
- `--trace-id`: Optional trace id for `publish` and `delay`.
|
|
373
373
|
|
|
374
374
|
Payload and headers are JSON strings. Command responses are stable JSON objects.
|
|
375
375
|
|
|
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "redqueue"
|
|
7
|
-
version = "0.13.
|
|
7
|
+
version = "0.13.1"
|
|
8
8
|
description = "Redis-backed Python message queue library with List, Streams, delayed tasks, and monitoring."
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.9"
|
|
@@ -26,7 +26,7 @@ from redqueue.exceptions import (
|
|
|
26
26
|
RedQueueError,
|
|
27
27
|
RetryExceededError,
|
|
28
28
|
)
|
|
29
|
-
from redqueue.message import Message, new_message_id, new_trace_id
|
|
29
|
+
from redqueue.message import Message, new_message_id, new_trace_id
|
|
30
30
|
from redqueue.monitoring import (
|
|
31
31
|
CompositeMonitoringHook,
|
|
32
32
|
InMemoryMonitoringHook,
|
|
@@ -71,6 +71,6 @@ __all__ = [
|
|
|
71
71
|
"detect_capabilities",
|
|
72
72
|
"detect_capabilities_async",
|
|
73
73
|
"extract_redis_version",
|
|
74
|
-
"new_message_id",
|
|
75
|
-
"new_trace_id",
|
|
76
|
-
]
|
|
74
|
+
"new_message_id",
|
|
75
|
+
"new_trace_id",
|
|
76
|
+
]
|