jararaca 0.3.11a15__tar.gz → 0.3.11a16__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.
Potentially problematic release.
This version of jararaca might be problematic. Click here for more details.
- {jararaca-0.3.11a15 → jararaca-0.3.11a16}/PKG-INFO +1 -1
- {jararaca-0.3.11a15 → jararaca-0.3.11a16}/docs/messagebus.md +2 -0
- jararaca-0.3.11a16/docs/retry.md +79 -0
- {jararaca-0.3.11a15 → jararaca-0.3.11a16}/pyproject.toml +1 -1
- jararaca-0.3.11a16/src/jararaca/messagebus/worker.py +1416 -0
- jararaca-0.3.11a16/src/jararaca/utils/retry.py +141 -0
- jararaca-0.3.11a15/src/jararaca/messagebus/worker.py +0 -644
- {jararaca-0.3.11a15 → jararaca-0.3.11a16}/LICENSE +0 -0
- {jararaca-0.3.11a15 → jararaca-0.3.11a16}/README.md +0 -0
- {jararaca-0.3.11a15 → jararaca-0.3.11a16}/docs/CNAME +0 -0
- {jararaca-0.3.11a15 → jararaca-0.3.11a16}/docs/architecture.md +0 -0
- {jararaca-0.3.11a15 → jararaca-0.3.11a16}/docs/assets/_f04774c9-7e05-4da4-8b17-8be23f6a1475.jpeg +0 -0
- {jararaca-0.3.11a15 → jararaca-0.3.11a16}/docs/assets/_f04774c9-7e05-4da4-8b17-8be23f6a1475.webp +0 -0
- {jararaca-0.3.11a15 → jararaca-0.3.11a16}/docs/assets/tracing_example.png +0 -0
- {jararaca-0.3.11a15 → jararaca-0.3.11a16}/docs/index.md +0 -0
- {jararaca-0.3.11a15 → jararaca-0.3.11a16}/docs/scheduler.md +0 -0
- {jararaca-0.3.11a15 → jararaca-0.3.11a16}/docs/stylesheets/custom.css +0 -0
- {jararaca-0.3.11a15 → jararaca-0.3.11a16}/docs/websocket.md +0 -0
- {jararaca-0.3.11a15 → jararaca-0.3.11a16}/src/jararaca/__init__.py +0 -0
- {jararaca-0.3.11a15 → jararaca-0.3.11a16}/src/jararaca/__main__.py +0 -0
- {jararaca-0.3.11a15 → jararaca-0.3.11a16}/src/jararaca/broker_backend/__init__.py +0 -0
- {jararaca-0.3.11a15 → jararaca-0.3.11a16}/src/jararaca/broker_backend/mapper.py +0 -0
- {jararaca-0.3.11a15 → jararaca-0.3.11a16}/src/jararaca/broker_backend/redis_broker_backend.py +0 -0
- {jararaca-0.3.11a15 → jararaca-0.3.11a16}/src/jararaca/cli.py +0 -0
- {jararaca-0.3.11a15 → jararaca-0.3.11a16}/src/jararaca/common/__init__.py +0 -0
- {jararaca-0.3.11a15 → jararaca-0.3.11a16}/src/jararaca/core/__init__.py +0 -0
- {jararaca-0.3.11a15 → jararaca-0.3.11a16}/src/jararaca/core/providers.py +0 -0
- {jararaca-0.3.11a15 → jararaca-0.3.11a16}/src/jararaca/core/uow.py +0 -0
- {jararaca-0.3.11a15 → jararaca-0.3.11a16}/src/jararaca/di.py +0 -0
- {jararaca-0.3.11a15 → jararaca-0.3.11a16}/src/jararaca/files/entity.py.mako +0 -0
- {jararaca-0.3.11a15 → jararaca-0.3.11a16}/src/jararaca/lifecycle.py +0 -0
- {jararaca-0.3.11a15 → jararaca-0.3.11a16}/src/jararaca/messagebus/__init__.py +0 -0
- {jararaca-0.3.11a15 → jararaca-0.3.11a16}/src/jararaca/messagebus/bus_message_controller.py +0 -0
- {jararaca-0.3.11a15 → jararaca-0.3.11a16}/src/jararaca/messagebus/consumers/__init__.py +0 -0
- {jararaca-0.3.11a15 → jararaca-0.3.11a16}/src/jararaca/messagebus/decorators.py +0 -0
- {jararaca-0.3.11a15 → jararaca-0.3.11a16}/src/jararaca/messagebus/interceptors/__init__.py +0 -0
- {jararaca-0.3.11a15 → jararaca-0.3.11a16}/src/jararaca/messagebus/interceptors/aiopika_publisher_interceptor.py +0 -0
- {jararaca-0.3.11a15 → jararaca-0.3.11a16}/src/jararaca/messagebus/interceptors/publisher_interceptor.py +0 -0
- {jararaca-0.3.11a15 → jararaca-0.3.11a16}/src/jararaca/messagebus/message.py +0 -0
- {jararaca-0.3.11a15 → jararaca-0.3.11a16}/src/jararaca/messagebus/publisher.py +0 -0
- {jararaca-0.3.11a15 → jararaca-0.3.11a16}/src/jararaca/microservice.py +0 -0
- {jararaca-0.3.11a15 → jararaca-0.3.11a16}/src/jararaca/observability/decorators.py +0 -0
- {jararaca-0.3.11a15 → jararaca-0.3.11a16}/src/jararaca/observability/interceptor.py +0 -0
- {jararaca-0.3.11a15 → jararaca-0.3.11a16}/src/jararaca/observability/providers/__init__.py +0 -0
- {jararaca-0.3.11a15 → jararaca-0.3.11a16}/src/jararaca/observability/providers/otel.py +0 -0
- {jararaca-0.3.11a15 → jararaca-0.3.11a16}/src/jararaca/persistence/base.py +0 -0
- {jararaca-0.3.11a15 → jararaca-0.3.11a16}/src/jararaca/persistence/exports.py +0 -0
- {jararaca-0.3.11a15 → jararaca-0.3.11a16}/src/jararaca/persistence/interceptors/__init__.py +0 -0
- {jararaca-0.3.11a15 → jararaca-0.3.11a16}/src/jararaca/persistence/interceptors/aiosqa_interceptor.py +0 -0
- {jararaca-0.3.11a15 → jararaca-0.3.11a16}/src/jararaca/persistence/session.py +0 -0
- {jararaca-0.3.11a15 → jararaca-0.3.11a16}/src/jararaca/persistence/sort_filter.py +0 -0
- {jararaca-0.3.11a15 → jararaca-0.3.11a16}/src/jararaca/persistence/utilities.py +0 -0
- {jararaca-0.3.11a15 → jararaca-0.3.11a16}/src/jararaca/presentation/__init__.py +0 -0
- {jararaca-0.3.11a15 → jararaca-0.3.11a16}/src/jararaca/presentation/decorators.py +0 -0
- {jararaca-0.3.11a15 → jararaca-0.3.11a16}/src/jararaca/presentation/hooks.py +0 -0
- {jararaca-0.3.11a15 → jararaca-0.3.11a16}/src/jararaca/presentation/http_microservice.py +0 -0
- {jararaca-0.3.11a15 → jararaca-0.3.11a16}/src/jararaca/presentation/server.py +0 -0
- {jararaca-0.3.11a15 → jararaca-0.3.11a16}/src/jararaca/presentation/websocket/__init__.py +0 -0
- {jararaca-0.3.11a15 → jararaca-0.3.11a16}/src/jararaca/presentation/websocket/base_types.py +0 -0
- {jararaca-0.3.11a15 → jararaca-0.3.11a16}/src/jararaca/presentation/websocket/context.py +0 -0
- {jararaca-0.3.11a15 → jararaca-0.3.11a16}/src/jararaca/presentation/websocket/decorators.py +0 -0
- {jararaca-0.3.11a15 → jararaca-0.3.11a16}/src/jararaca/presentation/websocket/redis.py +0 -0
- {jararaca-0.3.11a15 → jararaca-0.3.11a16}/src/jararaca/presentation/websocket/types.py +0 -0
- {jararaca-0.3.11a15 → jararaca-0.3.11a16}/src/jararaca/presentation/websocket/websocket_interceptor.py +0 -0
- {jararaca-0.3.11a15 → jararaca-0.3.11a16}/src/jararaca/py.typed +0 -0
- {jararaca-0.3.11a15 → jararaca-0.3.11a16}/src/jararaca/reflect/__init__.py +0 -0
- {jararaca-0.3.11a15 → jararaca-0.3.11a16}/src/jararaca/reflect/controller_inspect.py +0 -0
- {jararaca-0.3.11a15 → jararaca-0.3.11a16}/src/jararaca/reflect/metadata.py +0 -0
- {jararaca-0.3.11a15 → jararaca-0.3.11a16}/src/jararaca/rpc/__init__.py +0 -0
- {jararaca-0.3.11a15 → jararaca-0.3.11a16}/src/jararaca/rpc/http/__init__.py +0 -0
- {jararaca-0.3.11a15 → jararaca-0.3.11a16}/src/jararaca/rpc/http/backends/__init__.py +0 -0
- {jararaca-0.3.11a15 → jararaca-0.3.11a16}/src/jararaca/rpc/http/backends/httpx.py +0 -0
- {jararaca-0.3.11a15 → jararaca-0.3.11a16}/src/jararaca/rpc/http/backends/otel.py +0 -0
- {jararaca-0.3.11a15 → jararaca-0.3.11a16}/src/jararaca/rpc/http/decorators.py +0 -0
- {jararaca-0.3.11a15 → jararaca-0.3.11a16}/src/jararaca/rpc/http/httpx.py +0 -0
- {jararaca-0.3.11a15 → jararaca-0.3.11a16}/src/jararaca/scheduler/__init__.py +0 -0
- {jararaca-0.3.11a15 → jararaca-0.3.11a16}/src/jararaca/scheduler/beat_worker.py +0 -0
- {jararaca-0.3.11a15 → jararaca-0.3.11a16}/src/jararaca/scheduler/decorators.py +0 -0
- {jararaca-0.3.11a15 → jararaca-0.3.11a16}/src/jararaca/scheduler/types.py +0 -0
- {jararaca-0.3.11a15 → jararaca-0.3.11a16}/src/jararaca/tools/app_config/__init__.py +0 -0
- {jararaca-0.3.11a15 → jararaca-0.3.11a16}/src/jararaca/tools/app_config/decorators.py +0 -0
- {jararaca-0.3.11a15 → jararaca-0.3.11a16}/src/jararaca/tools/app_config/interceptor.py +0 -0
- {jararaca-0.3.11a15 → jararaca-0.3.11a16}/src/jararaca/tools/typescript/interface_parser.py +0 -0
- {jararaca-0.3.11a15 → jararaca-0.3.11a16}/src/jararaca/utils/__init__.py +0 -0
- {jararaca-0.3.11a15 → jararaca-0.3.11a16}/src/jararaca/utils/rabbitmq_utils.py +0 -0
|
@@ -29,6 +29,7 @@ graph TB
|
|
|
29
29
|
ack[ack]
|
|
30
30
|
nack[nack]
|
|
31
31
|
retry[retry]
|
|
32
|
+
retry_later[retry_later]
|
|
32
33
|
reject[reject]
|
|
33
34
|
end
|
|
34
35
|
|
|
@@ -42,6 +43,7 @@ graph TB
|
|
|
42
43
|
BusMessageController --> nack
|
|
43
44
|
BusMessageController --> reject
|
|
44
45
|
BusMessageController --> retry
|
|
46
|
+
BusMessageController --> retry_later
|
|
45
47
|
```
|
|
46
48
|
|
|
47
49
|
## Message Structure
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
# Retry Mechanism with Exponential Backoff
|
|
2
|
+
|
|
3
|
+
Jararaca implements a robust retry mechanism with exponential backoff for handling transient failures in RabbitMQ connections and operations. This mechanism helps the system gracefully handle temporary network issues, broker unavailability, and other transient failures.
|
|
4
|
+
|
|
5
|
+
## Core Components
|
|
6
|
+
|
|
7
|
+
The retry system consists of these main components:
|
|
8
|
+
|
|
9
|
+
1. `RetryConfig` - Configuration class for customizing retry behavior
|
|
10
|
+
2. `retry_with_backoff` - Utility function to execute operations with retry
|
|
11
|
+
3. `with_retry` - Decorator for applying retry logic to functions
|
|
12
|
+
|
|
13
|
+
## Retry Configuration
|
|
14
|
+
|
|
15
|
+
The `RetryConfig` class allows customization of various retry parameters:
|
|
16
|
+
|
|
17
|
+
```python
|
|
18
|
+
class RetryConfig:
|
|
19
|
+
def __init__(
|
|
20
|
+
self,
|
|
21
|
+
max_retries: int = 5, # Maximum number of retry attempts
|
|
22
|
+
initial_delay: float = 1.0, # Initial delay between retries (seconds)
|
|
23
|
+
max_delay: float = 60.0, # Maximum delay between retries (seconds)
|
|
24
|
+
backoff_factor: float = 2.0, # Multiplier for delay after each retry
|
|
25
|
+
jitter: bool = True, # Add randomness to delay to prevent thundering herd
|
|
26
|
+
):
|
|
27
|
+
...
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
## Integration with MessageBus Worker
|
|
31
|
+
|
|
32
|
+
The RabbitMQ consumer in the message bus system uses the retry mechanism in several key areas:
|
|
33
|
+
|
|
34
|
+
1. **Connection Establishment**: When establishing a connection to RabbitMQ, the system will automatically retry with increasing backoff periods if the connection fails.
|
|
35
|
+
|
|
36
|
+
2. **Channel Creation**: When creating channels for publishing or consuming messages, failures trigger the retry mechanism.
|
|
37
|
+
|
|
38
|
+
3. **Consumer Setup**: Setting up message consumers uses retry logic to handle temporary failures.
|
|
39
|
+
|
|
40
|
+
## URL Configuration Parameters
|
|
41
|
+
|
|
42
|
+
Retry behavior can be customized through URL parameters when configuring the RabbitMQ connection:
|
|
43
|
+
|
|
44
|
+
| Parameter | Description | Default |
|
|
45
|
+
|-----------|-------------|---------|
|
|
46
|
+
| `connection_retry_max` | Maximum number of connection retry attempts | 5 |
|
|
47
|
+
| `connection_retry_delay` | Initial delay between connection retries (seconds) | 1.0 |
|
|
48
|
+
| `connection_retry_max_delay` | Maximum delay between connection retries (seconds) | 60.0 |
|
|
49
|
+
| `connection_retry_backoff` | Multiplier for delay after each connection retry | 2.0 |
|
|
50
|
+
| `consumer_retry_max` | Maximum number of consumer setup retry attempts | 3 |
|
|
51
|
+
| `consumer_retry_delay` | Initial delay between consumer setup retries (seconds) | 0.5 |
|
|
52
|
+
| `consumer_retry_max_delay` | Maximum delay between consumer setup retries (seconds) | 5.0 |
|
|
53
|
+
| `consumer_retry_backoff` | Multiplier for delay after each consumer setup retry | 2.0 |
|
|
54
|
+
|
|
55
|
+
## Example Usage
|
|
56
|
+
|
|
57
|
+
```python
|
|
58
|
+
# Configure with custom retry settings in URL:
|
|
59
|
+
broker_url = "amqp://guest:guest@localhost:5672/?exchange=jararaca&prefetch_count=10&connection_retry_max=10&connection_retry_delay=2.0"
|
|
60
|
+
|
|
61
|
+
# Use custom retry configuration in code:
|
|
62
|
+
from jararaca.utils.retry import RetryConfig, retry_with_backoff
|
|
63
|
+
|
|
64
|
+
config = RetryConfig(max_retries=3, initial_delay=1.0, max_delay=30.0)
|
|
65
|
+
|
|
66
|
+
async def connect_with_retry():
|
|
67
|
+
return await retry_with_backoff(
|
|
68
|
+
establish_connection,
|
|
69
|
+
retry_config=config,
|
|
70
|
+
retry_exceptions=(ConnectionError, TimeoutError)
|
|
71
|
+
)
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
## Benefits
|
|
75
|
+
|
|
76
|
+
1. **Resilience** - The system can recover automatically from transient failures
|
|
77
|
+
2. **Reduced downtime** - Automatic reconnection minimizes service disruption
|
|
78
|
+
3. **Configuration flexibility** - Retry behavior can be tailored to different environments
|
|
79
|
+
4. **Smart backoff** - Exponential backoff with jitter prevents overloading services during recovery
|