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.

Files changed (85) hide show
  1. {jararaca-0.3.11a15 → jararaca-0.3.11a16}/PKG-INFO +1 -1
  2. {jararaca-0.3.11a15 → jararaca-0.3.11a16}/docs/messagebus.md +2 -0
  3. jararaca-0.3.11a16/docs/retry.md +79 -0
  4. {jararaca-0.3.11a15 → jararaca-0.3.11a16}/pyproject.toml +1 -1
  5. jararaca-0.3.11a16/src/jararaca/messagebus/worker.py +1416 -0
  6. jararaca-0.3.11a16/src/jararaca/utils/retry.py +141 -0
  7. jararaca-0.3.11a15/src/jararaca/messagebus/worker.py +0 -644
  8. {jararaca-0.3.11a15 → jararaca-0.3.11a16}/LICENSE +0 -0
  9. {jararaca-0.3.11a15 → jararaca-0.3.11a16}/README.md +0 -0
  10. {jararaca-0.3.11a15 → jararaca-0.3.11a16}/docs/CNAME +0 -0
  11. {jararaca-0.3.11a15 → jararaca-0.3.11a16}/docs/architecture.md +0 -0
  12. {jararaca-0.3.11a15 → jararaca-0.3.11a16}/docs/assets/_f04774c9-7e05-4da4-8b17-8be23f6a1475.jpeg +0 -0
  13. {jararaca-0.3.11a15 → jararaca-0.3.11a16}/docs/assets/_f04774c9-7e05-4da4-8b17-8be23f6a1475.webp +0 -0
  14. {jararaca-0.3.11a15 → jararaca-0.3.11a16}/docs/assets/tracing_example.png +0 -0
  15. {jararaca-0.3.11a15 → jararaca-0.3.11a16}/docs/index.md +0 -0
  16. {jararaca-0.3.11a15 → jararaca-0.3.11a16}/docs/scheduler.md +0 -0
  17. {jararaca-0.3.11a15 → jararaca-0.3.11a16}/docs/stylesheets/custom.css +0 -0
  18. {jararaca-0.3.11a15 → jararaca-0.3.11a16}/docs/websocket.md +0 -0
  19. {jararaca-0.3.11a15 → jararaca-0.3.11a16}/src/jararaca/__init__.py +0 -0
  20. {jararaca-0.3.11a15 → jararaca-0.3.11a16}/src/jararaca/__main__.py +0 -0
  21. {jararaca-0.3.11a15 → jararaca-0.3.11a16}/src/jararaca/broker_backend/__init__.py +0 -0
  22. {jararaca-0.3.11a15 → jararaca-0.3.11a16}/src/jararaca/broker_backend/mapper.py +0 -0
  23. {jararaca-0.3.11a15 → jararaca-0.3.11a16}/src/jararaca/broker_backend/redis_broker_backend.py +0 -0
  24. {jararaca-0.3.11a15 → jararaca-0.3.11a16}/src/jararaca/cli.py +0 -0
  25. {jararaca-0.3.11a15 → jararaca-0.3.11a16}/src/jararaca/common/__init__.py +0 -0
  26. {jararaca-0.3.11a15 → jararaca-0.3.11a16}/src/jararaca/core/__init__.py +0 -0
  27. {jararaca-0.3.11a15 → jararaca-0.3.11a16}/src/jararaca/core/providers.py +0 -0
  28. {jararaca-0.3.11a15 → jararaca-0.3.11a16}/src/jararaca/core/uow.py +0 -0
  29. {jararaca-0.3.11a15 → jararaca-0.3.11a16}/src/jararaca/di.py +0 -0
  30. {jararaca-0.3.11a15 → jararaca-0.3.11a16}/src/jararaca/files/entity.py.mako +0 -0
  31. {jararaca-0.3.11a15 → jararaca-0.3.11a16}/src/jararaca/lifecycle.py +0 -0
  32. {jararaca-0.3.11a15 → jararaca-0.3.11a16}/src/jararaca/messagebus/__init__.py +0 -0
  33. {jararaca-0.3.11a15 → jararaca-0.3.11a16}/src/jararaca/messagebus/bus_message_controller.py +0 -0
  34. {jararaca-0.3.11a15 → jararaca-0.3.11a16}/src/jararaca/messagebus/consumers/__init__.py +0 -0
  35. {jararaca-0.3.11a15 → jararaca-0.3.11a16}/src/jararaca/messagebus/decorators.py +0 -0
  36. {jararaca-0.3.11a15 → jararaca-0.3.11a16}/src/jararaca/messagebus/interceptors/__init__.py +0 -0
  37. {jararaca-0.3.11a15 → jararaca-0.3.11a16}/src/jararaca/messagebus/interceptors/aiopika_publisher_interceptor.py +0 -0
  38. {jararaca-0.3.11a15 → jararaca-0.3.11a16}/src/jararaca/messagebus/interceptors/publisher_interceptor.py +0 -0
  39. {jararaca-0.3.11a15 → jararaca-0.3.11a16}/src/jararaca/messagebus/message.py +0 -0
  40. {jararaca-0.3.11a15 → jararaca-0.3.11a16}/src/jararaca/messagebus/publisher.py +0 -0
  41. {jararaca-0.3.11a15 → jararaca-0.3.11a16}/src/jararaca/microservice.py +0 -0
  42. {jararaca-0.3.11a15 → jararaca-0.3.11a16}/src/jararaca/observability/decorators.py +0 -0
  43. {jararaca-0.3.11a15 → jararaca-0.3.11a16}/src/jararaca/observability/interceptor.py +0 -0
  44. {jararaca-0.3.11a15 → jararaca-0.3.11a16}/src/jararaca/observability/providers/__init__.py +0 -0
  45. {jararaca-0.3.11a15 → jararaca-0.3.11a16}/src/jararaca/observability/providers/otel.py +0 -0
  46. {jararaca-0.3.11a15 → jararaca-0.3.11a16}/src/jararaca/persistence/base.py +0 -0
  47. {jararaca-0.3.11a15 → jararaca-0.3.11a16}/src/jararaca/persistence/exports.py +0 -0
  48. {jararaca-0.3.11a15 → jararaca-0.3.11a16}/src/jararaca/persistence/interceptors/__init__.py +0 -0
  49. {jararaca-0.3.11a15 → jararaca-0.3.11a16}/src/jararaca/persistence/interceptors/aiosqa_interceptor.py +0 -0
  50. {jararaca-0.3.11a15 → jararaca-0.3.11a16}/src/jararaca/persistence/session.py +0 -0
  51. {jararaca-0.3.11a15 → jararaca-0.3.11a16}/src/jararaca/persistence/sort_filter.py +0 -0
  52. {jararaca-0.3.11a15 → jararaca-0.3.11a16}/src/jararaca/persistence/utilities.py +0 -0
  53. {jararaca-0.3.11a15 → jararaca-0.3.11a16}/src/jararaca/presentation/__init__.py +0 -0
  54. {jararaca-0.3.11a15 → jararaca-0.3.11a16}/src/jararaca/presentation/decorators.py +0 -0
  55. {jararaca-0.3.11a15 → jararaca-0.3.11a16}/src/jararaca/presentation/hooks.py +0 -0
  56. {jararaca-0.3.11a15 → jararaca-0.3.11a16}/src/jararaca/presentation/http_microservice.py +0 -0
  57. {jararaca-0.3.11a15 → jararaca-0.3.11a16}/src/jararaca/presentation/server.py +0 -0
  58. {jararaca-0.3.11a15 → jararaca-0.3.11a16}/src/jararaca/presentation/websocket/__init__.py +0 -0
  59. {jararaca-0.3.11a15 → jararaca-0.3.11a16}/src/jararaca/presentation/websocket/base_types.py +0 -0
  60. {jararaca-0.3.11a15 → jararaca-0.3.11a16}/src/jararaca/presentation/websocket/context.py +0 -0
  61. {jararaca-0.3.11a15 → jararaca-0.3.11a16}/src/jararaca/presentation/websocket/decorators.py +0 -0
  62. {jararaca-0.3.11a15 → jararaca-0.3.11a16}/src/jararaca/presentation/websocket/redis.py +0 -0
  63. {jararaca-0.3.11a15 → jararaca-0.3.11a16}/src/jararaca/presentation/websocket/types.py +0 -0
  64. {jararaca-0.3.11a15 → jararaca-0.3.11a16}/src/jararaca/presentation/websocket/websocket_interceptor.py +0 -0
  65. {jararaca-0.3.11a15 → jararaca-0.3.11a16}/src/jararaca/py.typed +0 -0
  66. {jararaca-0.3.11a15 → jararaca-0.3.11a16}/src/jararaca/reflect/__init__.py +0 -0
  67. {jararaca-0.3.11a15 → jararaca-0.3.11a16}/src/jararaca/reflect/controller_inspect.py +0 -0
  68. {jararaca-0.3.11a15 → jararaca-0.3.11a16}/src/jararaca/reflect/metadata.py +0 -0
  69. {jararaca-0.3.11a15 → jararaca-0.3.11a16}/src/jararaca/rpc/__init__.py +0 -0
  70. {jararaca-0.3.11a15 → jararaca-0.3.11a16}/src/jararaca/rpc/http/__init__.py +0 -0
  71. {jararaca-0.3.11a15 → jararaca-0.3.11a16}/src/jararaca/rpc/http/backends/__init__.py +0 -0
  72. {jararaca-0.3.11a15 → jararaca-0.3.11a16}/src/jararaca/rpc/http/backends/httpx.py +0 -0
  73. {jararaca-0.3.11a15 → jararaca-0.3.11a16}/src/jararaca/rpc/http/backends/otel.py +0 -0
  74. {jararaca-0.3.11a15 → jararaca-0.3.11a16}/src/jararaca/rpc/http/decorators.py +0 -0
  75. {jararaca-0.3.11a15 → jararaca-0.3.11a16}/src/jararaca/rpc/http/httpx.py +0 -0
  76. {jararaca-0.3.11a15 → jararaca-0.3.11a16}/src/jararaca/scheduler/__init__.py +0 -0
  77. {jararaca-0.3.11a15 → jararaca-0.3.11a16}/src/jararaca/scheduler/beat_worker.py +0 -0
  78. {jararaca-0.3.11a15 → jararaca-0.3.11a16}/src/jararaca/scheduler/decorators.py +0 -0
  79. {jararaca-0.3.11a15 → jararaca-0.3.11a16}/src/jararaca/scheduler/types.py +0 -0
  80. {jararaca-0.3.11a15 → jararaca-0.3.11a16}/src/jararaca/tools/app_config/__init__.py +0 -0
  81. {jararaca-0.3.11a15 → jararaca-0.3.11a16}/src/jararaca/tools/app_config/decorators.py +0 -0
  82. {jararaca-0.3.11a15 → jararaca-0.3.11a16}/src/jararaca/tools/app_config/interceptor.py +0 -0
  83. {jararaca-0.3.11a15 → jararaca-0.3.11a16}/src/jararaca/tools/typescript/interface_parser.py +0 -0
  84. {jararaca-0.3.11a15 → jararaca-0.3.11a16}/src/jararaca/utils/__init__.py +0 -0
  85. {jararaca-0.3.11a15 → jararaca-0.3.11a16}/src/jararaca/utils/rabbitmq_utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: jararaca
3
- Version: 0.3.11a15
3
+ Version: 0.3.11a16
4
4
  Summary: A simple and fast API framework for Python
5
5
  Author: Lucas S
6
6
  Author-email: me@luscasleo.dev
@@ -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
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "jararaca"
3
- version = "0.3.11a15"
3
+ version = "0.3.11a16"
4
4
  description = "A simple and fast API framework for Python"
5
5
  authors = ["Lucas S <me@luscasleo.dev>"]
6
6
  readme = "README.md"