buz 2.15.5__tar.gz → 2.15.6__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.
Files changed (256) hide show
  1. {buz-2.15.5 → buz-2.15.6}/PKG-INFO +1 -1
  2. {buz-2.15.5 → buz-2.15.6}/pyproject.toml +1 -1
  3. {buz-2.15.5 → buz-2.15.6}/src/buz/event/infrastructure/buz_kafka/base_buz_aiokafka_async_consumer.py +119 -59
  4. {buz-2.15.5 → buz-2.15.6}/src/buz/event/infrastructure/buz_kafka/buz_aiokafka_async_consumer.py +12 -4
  5. {buz-2.15.5 → buz-2.15.6}/src/buz/event/infrastructure/buz_kafka/buz_aiokafka_multi_threaded_consumer.py +13 -5
  6. {buz-2.15.5 → buz-2.15.6}/src/buz/kafka/infrastructure/aiokafka/aiokafka_consumer.py +16 -7
  7. {buz-2.15.5 → buz-2.15.6}/LICENSE +0 -0
  8. {buz-2.15.5 → buz-2.15.6}/README.md +0 -0
  9. {buz-2.15.5 → buz-2.15.6}/src/buz/__init__.py +0 -0
  10. {buz-2.15.5 → buz-2.15.6}/src/buz/command/__init__.py +0 -0
  11. {buz-2.15.5 → buz-2.15.6}/src/buz/command/asynchronous/__init__.py +0 -0
  12. {buz-2.15.5 → buz-2.15.6}/src/buz/command/asynchronous/base_command_handler.py +0 -0
  13. {buz-2.15.5 → buz-2.15.6}/src/buz/command/asynchronous/command_bus.py +0 -0
  14. {buz-2.15.5 → buz-2.15.6}/src/buz/command/asynchronous/command_handler.py +0 -0
  15. {buz-2.15.5 → buz-2.15.6}/src/buz/command/asynchronous/middleware/__init__.py +0 -0
  16. {buz-2.15.5 → buz-2.15.6}/src/buz/command/asynchronous/middleware/base_handle_middleware.py +0 -0
  17. {buz-2.15.5 → buz-2.15.6}/src/buz/command/asynchronous/middleware/handle_middleware.py +0 -0
  18. {buz-2.15.5 → buz-2.15.6}/src/buz/command/asynchronous/middleware/handle_middleware_chain_resolver.py +0 -0
  19. {buz-2.15.5 → buz-2.15.6}/src/buz/command/asynchronous/self_process/__init__.py +0 -0
  20. {buz-2.15.5 → buz-2.15.6}/src/buz/command/asynchronous/self_process/self_process_command_bus.py +0 -0
  21. {buz-2.15.5 → buz-2.15.6}/src/buz/command/command.py +0 -0
  22. {buz-2.15.5 → buz-2.15.6}/src/buz/command/more_than_one_command_handler_related_exception.py +0 -0
  23. {buz-2.15.5 → buz-2.15.6}/src/buz/command/synchronous/__init__.py +0 -0
  24. {buz-2.15.5 → buz-2.15.6}/src/buz/command/synchronous/base_command_handler.py +0 -0
  25. {buz-2.15.5 → buz-2.15.6}/src/buz/command/synchronous/command_bus.py +0 -0
  26. {buz-2.15.5 → buz-2.15.6}/src/buz/command/synchronous/command_handler.py +0 -0
  27. {buz-2.15.5 → buz-2.15.6}/src/buz/command/synchronous/middleware/__init__.py +0 -0
  28. {buz-2.15.5 → buz-2.15.6}/src/buz/command/synchronous/middleware/base_handle_middleware.py +0 -0
  29. {buz-2.15.5 → buz-2.15.6}/src/buz/command/synchronous/middleware/handle_middleware.py +0 -0
  30. {buz-2.15.5 → buz-2.15.6}/src/buz/command/synchronous/middleware/handle_middleware_chain_resolver.py +0 -0
  31. {buz-2.15.5 → buz-2.15.6}/src/buz/command/synchronous/self_process/__init__.py +0 -0
  32. {buz-2.15.5 → buz-2.15.6}/src/buz/command/synchronous/self_process/self_process_command_bus.py +0 -0
  33. {buz-2.15.5 → buz-2.15.6}/src/buz/command/synchronous/synced_async/__init__.py +0 -0
  34. {buz-2.15.5 → buz-2.15.6}/src/buz/command/synchronous/synced_async/synced_async_command_bus.py +0 -0
  35. {buz-2.15.5 → buz-2.15.6}/src/buz/event/__init__.py +0 -0
  36. {buz-2.15.5 → buz-2.15.6}/src/buz/event/async_consumer.py +0 -0
  37. {buz-2.15.5 → buz-2.15.6}/src/buz/event/async_event_bus.py +0 -0
  38. {buz-2.15.5 → buz-2.15.6}/src/buz/event/async_subscriber.py +0 -0
  39. {buz-2.15.5 → buz-2.15.6}/src/buz/event/async_worker.py +0 -0
  40. {buz-2.15.5 → buz-2.15.6}/src/buz/event/base_async_subscriber.py +0 -0
  41. {buz-2.15.5 → buz-2.15.6}/src/buz/event/base_subscriber.py +0 -0
  42. {buz-2.15.5 → buz-2.15.6}/src/buz/event/consumer.py +0 -0
  43. {buz-2.15.5 → buz-2.15.6}/src/buz/event/dead_letter_queue/__init__.py +0 -0
  44. {buz-2.15.5 → buz-2.15.6}/src/buz/event/dead_letter_queue/dlq_criteria.py +0 -0
  45. {buz-2.15.5 → buz-2.15.6}/src/buz/event/dead_letter_queue/dlq_record.py +0 -0
  46. {buz-2.15.5 → buz-2.15.6}/src/buz/event/dead_letter_queue/dlq_repository.py +0 -0
  47. {buz-2.15.5 → buz-2.15.6}/src/buz/event/event.py +0 -0
  48. {buz-2.15.5 → buz-2.15.6}/src/buz/event/event_bus.py +0 -0
  49. {buz-2.15.5 → buz-2.15.6}/src/buz/event/exceptions/__init__.py +0 -0
  50. {buz-2.15.5 → buz-2.15.6}/src/buz/event/exceptions/event_not_published_exception.py +0 -0
  51. {buz-2.15.5 → buz-2.15.6}/src/buz/event/exceptions/event_restore_exception.py +0 -0
  52. {buz-2.15.5 → buz-2.15.6}/src/buz/event/exceptions/subscribers_not_found_exception.py +0 -0
  53. {buz-2.15.5 → buz-2.15.6}/src/buz/event/exceptions/term_signal_interruption_exception.py +0 -0
  54. {buz-2.15.5 → buz-2.15.6}/src/buz/event/exceptions/worker_execution_exception.py +0 -0
  55. {buz-2.15.5 → buz-2.15.6}/src/buz/event/infrastructure/__init__.py +0 -0
  56. {buz-2.15.5 → buz-2.15.6}/src/buz/event/infrastructure/buz_kafka/__init__.py +0 -0
  57. {buz-2.15.5 → buz-2.15.6}/src/buz/event/infrastructure/buz_kafka/async_buz_kafka_event_bus.py +0 -0
  58. {buz-2.15.5 → buz-2.15.6}/src/buz/event/infrastructure/buz_kafka/buz_kafka_event_bus.py +0 -0
  59. {buz-2.15.5 → buz-2.15.6}/src/buz/event/infrastructure/buz_kafka/consume_strategy/__init__.py +0 -0
  60. {buz-2.15.5 → buz-2.15.6}/src/buz/event/infrastructure/buz_kafka/consume_strategy/consume_strategy.py +0 -0
  61. {buz-2.15.5 → buz-2.15.6}/src/buz/event/infrastructure/buz_kafka/consume_strategy/kafka_on_fail_strategy.py +0 -0
  62. {buz-2.15.5 → buz-2.15.6}/src/buz/event/infrastructure/buz_kafka/consume_strategy/topic_and_subscription_group_per_subscriber_kafka_consumer_strategy.py +0 -0
  63. {buz-2.15.5 → buz-2.15.6}/src/buz/event/infrastructure/buz_kafka/exceptions/__init__.py +0 -0
  64. {buz-2.15.5 → buz-2.15.6}/src/buz/event/infrastructure/buz_kafka/exceptions/kafka_event_bus_config_not_valid_exception.py +0 -0
  65. {buz-2.15.5 → buz-2.15.6}/src/buz/event/infrastructure/buz_kafka/exceptions/max_consumer_retry_exception.py +0 -0
  66. {buz-2.15.5 → buz-2.15.6}/src/buz/event/infrastructure/buz_kafka/exceptions/retry_exception.py +0 -0
  67. {buz-2.15.5 → buz-2.15.6}/src/buz/event/infrastructure/buz_kafka/kafka_event_async_subscriber_executor.py +0 -0
  68. {buz-2.15.5 → buz-2.15.6}/src/buz/event/infrastructure/buz_kafka/kafka_event_subscriber_executor.py +0 -0
  69. {buz-2.15.5 → buz-2.15.6}/src/buz/event/infrastructure/buz_kafka/kafka_event_sync_subscriber_executor.py +0 -0
  70. {buz-2.15.5 → buz-2.15.6}/src/buz/event/infrastructure/buz_kafka/publish_strategy/__init__.py +0 -0
  71. {buz-2.15.5 → buz-2.15.6}/src/buz/event/infrastructure/buz_kafka/publish_strategy/publish_strategy.py +0 -0
  72. {buz-2.15.5 → buz-2.15.6}/src/buz/event/infrastructure/buz_kafka/publish_strategy/topic_per_event_kafka_publish_strategy.py +0 -0
  73. {buz-2.15.5 → buz-2.15.6}/src/buz/event/infrastructure/kombu/__init__.py +0 -0
  74. {buz-2.15.5 → buz-2.15.6}/src/buz/event/infrastructure/kombu/allowed_kombu_serializer.py +0 -0
  75. {buz-2.15.5 → buz-2.15.6}/src/buz/event/infrastructure/kombu/consume_strategy/__init__.py +0 -0
  76. {buz-2.15.5 → buz-2.15.6}/src/buz/event/infrastructure/kombu/consume_strategy/consume_strategy.py +0 -0
  77. {buz-2.15.5 → buz-2.15.6}/src/buz/event/infrastructure/kombu/consume_strategy/queue_per_subscriber_consume_strategy.py +0 -0
  78. {buz-2.15.5 → buz-2.15.6}/src/buz/event/infrastructure/kombu/kombu_consumer.py +0 -0
  79. {buz-2.15.5 → buz-2.15.6}/src/buz/event/infrastructure/kombu/kombu_event_bus.py +0 -0
  80. {buz-2.15.5 → buz-2.15.6}/src/buz/event/infrastructure/kombu/publish_strategy/__init__.py +0 -0
  81. {buz-2.15.5 → buz-2.15.6}/src/buz/event/infrastructure/kombu/publish_strategy/fanout_exchange_per_event_publish_strategy.py +0 -0
  82. {buz-2.15.5 → buz-2.15.6}/src/buz/event/infrastructure/kombu/publish_strategy/publish_strategy.py +0 -0
  83. {buz-2.15.5 → buz-2.15.6}/src/buz/event/infrastructure/kombu/retry_strategy/__init__.py +0 -0
  84. {buz-2.15.5 → buz-2.15.6}/src/buz/event/infrastructure/kombu/retry_strategy/publish_retry_policy.py +0 -0
  85. {buz-2.15.5 → buz-2.15.6}/src/buz/event/infrastructure/kombu/retry_strategy/simple_publish_retry_policy.py +0 -0
  86. {buz-2.15.5 → buz-2.15.6}/src/buz/event/infrastructure/models/consuming_task.py +0 -0
  87. {buz-2.15.5 → buz-2.15.6}/src/buz/event/infrastructure/queue/__init__.py +0 -0
  88. {buz-2.15.5 → buz-2.15.6}/src/buz/event/meta_base_subscriber.py +0 -0
  89. {buz-2.15.5 → buz-2.15.6}/src/buz/event/meta_subscriber.py +0 -0
  90. {buz-2.15.5 → buz-2.15.6}/src/buz/event/middleware/__init__.py +0 -0
  91. {buz-2.15.5 → buz-2.15.6}/src/buz/event/middleware/async_consume_middleware.py +0 -0
  92. {buz-2.15.5 → buz-2.15.6}/src/buz/event/middleware/async_consume_middleware_chain_resolver.py +0 -0
  93. {buz-2.15.5 → buz-2.15.6}/src/buz/event/middleware/async_publish_middleware.py +0 -0
  94. {buz-2.15.5 → buz-2.15.6}/src/buz/event/middleware/async_publish_middleware_chain_resolver.py +0 -0
  95. {buz-2.15.5 → buz-2.15.6}/src/buz/event/middleware/base_async_consume_middleware.py +0 -0
  96. {buz-2.15.5 → buz-2.15.6}/src/buz/event/middleware/base_consume_middleware.py +0 -0
  97. {buz-2.15.5 → buz-2.15.6}/src/buz/event/middleware/base_publish_middleware.py +0 -0
  98. {buz-2.15.5 → buz-2.15.6}/src/buz/event/middleware/consume_middleware.py +0 -0
  99. {buz-2.15.5 → buz-2.15.6}/src/buz/event/middleware/consume_middleware_chain_resolver.py +0 -0
  100. {buz-2.15.5 → buz-2.15.6}/src/buz/event/middleware/exceptions/__init__.py +0 -0
  101. {buz-2.15.5 → buz-2.15.6}/src/buz/event/middleware/exceptions/event_already_in_progress_exception.py +0 -0
  102. {buz-2.15.5 → buz-2.15.6}/src/buz/event/middleware/publish_middleware.py +0 -0
  103. {buz-2.15.5 → buz-2.15.6}/src/buz/event/middleware/publish_middleware_chain_resolver.py +0 -0
  104. {buz-2.15.5 → buz-2.15.6}/src/buz/event/strategies/__init__.py +0 -0
  105. {buz-2.15.5 → buz-2.15.6}/src/buz/event/strategies/execution_strategy/__init__.py +0 -0
  106. {buz-2.15.5 → buz-2.15.6}/src/buz/event/strategies/execution_strategy/async_execution_strategy.py +0 -0
  107. {buz-2.15.5 → buz-2.15.6}/src/buz/event/strategies/execution_strategy/async_self_process_execution_strategy.py +0 -0
  108. {buz-2.15.5 → buz-2.15.6}/src/buz/event/strategies/execution_strategy/cyclic_iterator_execution_strategy.py +0 -0
  109. {buz-2.15.5 → buz-2.15.6}/src/buz/event/strategies/execution_strategy/execution_strategy.py +0 -0
  110. {buz-2.15.5 → buz-2.15.6}/src/buz/event/strategies/execution_strategy/self_process_execution_strategy.py +0 -0
  111. {buz-2.15.5 → buz-2.15.6}/src/buz/event/strategies/retry/__init__.py +0 -0
  112. {buz-2.15.5 → buz-2.15.6}/src/buz/event/strategies/retry/consume_retrier.py +0 -0
  113. {buz-2.15.5 → buz-2.15.6}/src/buz/event/strategies/retry/consumed_event_retry.py +0 -0
  114. {buz-2.15.5 → buz-2.15.6}/src/buz/event/strategies/retry/consumed_event_retry_repository.py +0 -0
  115. {buz-2.15.5 → buz-2.15.6}/src/buz/event/strategies/retry/max_retries_consume_retrier.py +0 -0
  116. {buz-2.15.5 → buz-2.15.6}/src/buz/event/strategies/retry/max_retries_negative_exception.py +0 -0
  117. {buz-2.15.5 → buz-2.15.6}/src/buz/event/strategies/retry/reject_callback.py +0 -0
  118. {buz-2.15.5 → buz-2.15.6}/src/buz/event/subscriber.py +0 -0
  119. {buz-2.15.5 → buz-2.15.6}/src/buz/event/sync/__init__.py +0 -0
  120. {buz-2.15.5 → buz-2.15.6}/src/buz/event/sync/sync_event_bus.py +0 -0
  121. {buz-2.15.5 → buz-2.15.6}/src/buz/event/transactional_outbox/__init__.py +0 -0
  122. {buz-2.15.5 → buz-2.15.6}/src/buz/event/transactional_outbox/event_to_outbox_record_translator.py +0 -0
  123. {buz-2.15.5 → buz-2.15.6}/src/buz/event/transactional_outbox/fqn_to_event_mapper.py +0 -0
  124. {buz-2.15.5 → buz-2.15.6}/src/buz/event/transactional_outbox/outbox_criteria/__init__.py +0 -0
  125. {buz-2.15.5 → buz-2.15.6}/src/buz/event/transactional_outbox/outbox_criteria/deliverable_records_outbox_criteria_factory.py +0 -0
  126. {buz-2.15.5 → buz-2.15.6}/src/buz/event/transactional_outbox/outbox_criteria/outbox_criteria.py +0 -0
  127. {buz-2.15.5 → buz-2.15.6}/src/buz/event/transactional_outbox/outbox_criteria/outbox_criteria_factory.py +0 -0
  128. {buz-2.15.5 → buz-2.15.6}/src/buz/event/transactional_outbox/outbox_criteria/outbox_sorting_criteria.py +0 -0
  129. {buz-2.15.5 → buz-2.15.6}/src/buz/event/transactional_outbox/outbox_record.py +0 -0
  130. {buz-2.15.5 → buz-2.15.6}/src/buz/event/transactional_outbox/outbox_record_finder/__init__.py +0 -0
  131. {buz-2.15.5 → buz-2.15.6}/src/buz/event/transactional_outbox/outbox_record_finder/outbox_record_stream_finder.py +0 -0
  132. {buz-2.15.5 → buz-2.15.6}/src/buz/event/transactional_outbox/outbox_record_finder/polling_outbox_record_stream_finder.py +0 -0
  133. {buz-2.15.5 → buz-2.15.6}/src/buz/event/transactional_outbox/outbox_record_to_event_translator.py +0 -0
  134. {buz-2.15.5 → buz-2.15.6}/src/buz/event/transactional_outbox/outbox_record_validation/__init__.py +0 -0
  135. {buz-2.15.5 → buz-2.15.6}/src/buz/event/transactional_outbox/outbox_record_validation/abstract_outbox_record_validator.py +0 -0
  136. {buz-2.15.5 → buz-2.15.6}/src/buz/event/transactional_outbox/outbox_record_validation/outbox_record_size_not_allowed_exception.py +0 -0
  137. {buz-2.15.5 → buz-2.15.6}/src/buz/event/transactional_outbox/outbox_record_validation/outbox_record_validation_exception.py +0 -0
  138. {buz-2.15.5 → buz-2.15.6}/src/buz/event/transactional_outbox/outbox_record_validation/outbox_record_validator.py +0 -0
  139. {buz-2.15.5 → buz-2.15.6}/src/buz/event/transactional_outbox/outbox_record_validation/size_outbox_record_validator.py +0 -0
  140. {buz-2.15.5 → buz-2.15.6}/src/buz/event/transactional_outbox/outbox_repository.py +0 -0
  141. {buz-2.15.5 → buz-2.15.6}/src/buz/event/transactional_outbox/transactional_outbox_event_bus.py +0 -0
  142. {buz-2.15.5 → buz-2.15.6}/src/buz/event/transactional_outbox/transactional_outbox_worker.py +0 -0
  143. {buz-2.15.5 → buz-2.15.6}/src/buz/event/worker.py +0 -0
  144. {buz-2.15.5 → buz-2.15.6}/src/buz/handler.py +0 -0
  145. {buz-2.15.5 → buz-2.15.6}/src/buz/kafka/__init__.py +0 -0
  146. {buz-2.15.5 → buz-2.15.6}/src/buz/kafka/domain/exceptions/__init__.py +0 -0
  147. {buz-2.15.5 → buz-2.15.6}/src/buz/kafka/domain/exceptions/not_all_partition_assigned_exception.py +0 -0
  148. {buz-2.15.5 → buz-2.15.6}/src/buz/kafka/domain/exceptions/not_valid_kafka_message_exception.py +0 -0
  149. {buz-2.15.5 → buz-2.15.6}/src/buz/kafka/domain/exceptions/not_valid_partition_number_exception.py +0 -0
  150. {buz-2.15.5 → buz-2.15.6}/src/buz/kafka/domain/exceptions/topic_already_created_exception.py +0 -0
  151. {buz-2.15.5 → buz-2.15.6}/src/buz/kafka/domain/exceptions/topic_not_found_exception.py +0 -0
  152. {buz-2.15.5 → buz-2.15.6}/src/buz/kafka/domain/models/__init__.py +0 -0
  153. {buz-2.15.5 → buz-2.15.6}/src/buz/kafka/domain/models/auto_create_topic_configuration.py +0 -0
  154. {buz-2.15.5 → buz-2.15.6}/src/buz/kafka/domain/models/consumer_initial_offset_position.py +0 -0
  155. {buz-2.15.5 → buz-2.15.6}/src/buz/kafka/domain/models/create_kafka_topic.py +0 -0
  156. {buz-2.15.5 → buz-2.15.6}/src/buz/kafka/domain/models/kafka_connection_config.py +0 -0
  157. {buz-2.15.5 → buz-2.15.6}/src/buz/kafka/domain/models/kafka_connection_credentials.py +0 -0
  158. {buz-2.15.5 → buz-2.15.6}/src/buz/kafka/domain/models/kafka_connection_plain_text_credentials.py +0 -0
  159. {buz-2.15.5 → buz-2.15.6}/src/buz/kafka/domain/models/kafka_connection_sasl_credentials.py +0 -0
  160. {buz-2.15.5 → buz-2.15.6}/src/buz/kafka/domain/models/kafka_consumer_record.py +0 -0
  161. {buz-2.15.5 → buz-2.15.6}/src/buz/kafka/domain/models/kafka_poll_record.py +0 -0
  162. {buz-2.15.5 → buz-2.15.6}/src/buz/kafka/domain/models/kafka_supported_compression_type.py +0 -0
  163. {buz-2.15.5 → buz-2.15.6}/src/buz/kafka/domain/models/kafka_supported_sasl_mechanisms.py +0 -0
  164. {buz-2.15.5 → buz-2.15.6}/src/buz/kafka/domain/models/kafka_supported_security_protocols.py +0 -0
  165. {buz-2.15.5 → buz-2.15.6}/src/buz/kafka/domain/services/__init__.py +0 -0
  166. {buz-2.15.5 → buz-2.15.6}/src/buz/kafka/domain/services/async_kafka_producer.py +0 -0
  167. {buz-2.15.5 → buz-2.15.6}/src/buz/kafka/domain/services/kafka_admin_client.py +0 -0
  168. {buz-2.15.5 → buz-2.15.6}/src/buz/kafka/domain/services/kafka_admin_test_client.py +0 -0
  169. {buz-2.15.5 → buz-2.15.6}/src/buz/kafka/domain/services/kafka_producer.py +0 -0
  170. {buz-2.15.5 → buz-2.15.6}/src/buz/kafka/infrastructure/__init__.py +0 -0
  171. {buz-2.15.5 → buz-2.15.6}/src/buz/kafka/infrastructure/aiokafka/__init__.py +0 -0
  172. {buz-2.15.5 → buz-2.15.6}/src/buz/kafka/infrastructure/aiokafka/aiokafka_producer.py +0 -0
  173. {buz-2.15.5 → buz-2.15.6}/src/buz/kafka/infrastructure/aiokafka/rebalance/__init__.py +0 -0
  174. {buz-2.15.5 → buz-2.15.6}/src/buz/kafka/infrastructure/aiokafka/rebalance/kafka_callback_rebalancer.py +0 -0
  175. {buz-2.15.5 → buz-2.15.6}/src/buz/kafka/infrastructure/aiokafka/translators/__init__.py +0 -0
  176. {buz-2.15.5 → buz-2.15.6}/src/buz/kafka/infrastructure/aiokafka/translators/consumer_initial_offset_position_translator.py +0 -0
  177. {buz-2.15.5 → buz-2.15.6}/src/buz/kafka/infrastructure/cdc/__init__.py +0 -0
  178. {buz-2.15.5 → buz-2.15.6}/src/buz/kafka/infrastructure/cdc/cdc_message.py +0 -0
  179. {buz-2.15.5 → buz-2.15.6}/src/buz/kafka/infrastructure/cdc/cdc_payload.py +0 -0
  180. {buz-2.15.5 → buz-2.15.6}/src/buz/kafka/infrastructure/cdc/cdc_schema.py +0 -0
  181. {buz-2.15.5 → buz-2.15.6}/src/buz/kafka/infrastructure/deserializers/__init__.py +0 -0
  182. {buz-2.15.5 → buz-2.15.6}/src/buz/kafka/infrastructure/deserializers/byte_deserializer.py +0 -0
  183. {buz-2.15.5 → buz-2.15.6}/src/buz/kafka/infrastructure/deserializers/bytes_to_message_deserializer.py +0 -0
  184. {buz-2.15.5 → buz-2.15.6}/src/buz/kafka/infrastructure/deserializers/implementations/__init__.py +0 -0
  185. {buz-2.15.5 → buz-2.15.6}/src/buz/kafka/infrastructure/deserializers/implementations/cdc/cdc_record_bytes_to_event_deserializer.py +0 -0
  186. {buz-2.15.5 → buz-2.15.6}/src/buz/kafka/infrastructure/deserializers/implementations/cdc/not_valid_cdc_message_exception.py +0 -0
  187. {buz-2.15.5 → buz-2.15.6}/src/buz/kafka/infrastructure/deserializers/implementations/json_byte_deserializer.py +0 -0
  188. {buz-2.15.5 → buz-2.15.6}/src/buz/kafka/infrastructure/deserializers/implementations/json_bytes_to_message_deserializer.py +0 -0
  189. {buz-2.15.5 → buz-2.15.6}/src/buz/kafka/infrastructure/interfaces/__init__.py +0 -0
  190. {buz-2.15.5 → buz-2.15.6}/src/buz/kafka/infrastructure/interfaces/async_connection_manager.py +0 -0
  191. {buz-2.15.5 → buz-2.15.6}/src/buz/kafka/infrastructure/interfaces/connection_manager.py +0 -0
  192. {buz-2.15.5 → buz-2.15.6}/src/buz/kafka/infrastructure/kafka_python/__init__.py +0 -0
  193. {buz-2.15.5 → buz-2.15.6}/src/buz/kafka/infrastructure/kafka_python/exception/consumer_interrupted_exception.py +0 -0
  194. {buz-2.15.5 → buz-2.15.6}/src/buz/kafka/infrastructure/kafka_python/kafka_python_admin_client.py +0 -0
  195. {buz-2.15.5 → buz-2.15.6}/src/buz/kafka/infrastructure/kafka_python/kafka_python_admin_test_client.py +0 -0
  196. {buz-2.15.5 → buz-2.15.6}/src/buz/kafka/infrastructure/kafka_python/kafka_python_producer.py +0 -0
  197. {buz-2.15.5 → buz-2.15.6}/src/buz/kafka/infrastructure/kafka_python/translators/__init__.py +0 -0
  198. {buz-2.15.5 → buz-2.15.6}/src/buz/kafka/infrastructure/kafka_python/translators/consumer_initial_offset_position_translator.py +0 -0
  199. {buz-2.15.5 → buz-2.15.6}/src/buz/kafka/infrastructure/serializers/byte_serializer.py +0 -0
  200. {buz-2.15.5 → buz-2.15.6}/src/buz/kafka/infrastructure/serializers/implementations/cdc_record_bytes_to_event_serializer.py +0 -0
  201. {buz-2.15.5 → buz-2.15.6}/src/buz/kafka/infrastructure/serializers/implementations/json_byte_serializer.py +0 -0
  202. {buz-2.15.5 → buz-2.15.6}/src/buz/kafka/infrastructure/serializers/kafka_header_serializer.py +0 -0
  203. {buz-2.15.5 → buz-2.15.6}/src/buz/locator/__init__.py +0 -0
  204. {buz-2.15.5 → buz-2.15.6}/src/buz/locator/handler_fqn_not_found_exception.py +0 -0
  205. {buz-2.15.5 → buz-2.15.6}/src/buz/locator/locator.py +0 -0
  206. {buz-2.15.5 → buz-2.15.6}/src/buz/locator/message_fqn_not_found_exception.py +0 -0
  207. {buz-2.15.5 → buz-2.15.6}/src/buz/locator/pypendency/__init__.py +0 -0
  208. {buz-2.15.5 → buz-2.15.6}/src/buz/locator/pypendency/container_locator.py +0 -0
  209. {buz-2.15.5 → buz-2.15.6}/src/buz/locator/pypendency/container_locator_resolution_configuration.py +0 -0
  210. {buz-2.15.5 → buz-2.15.6}/src/buz/locator/pypendency/handler_not_found_exception.py +0 -0
  211. {buz-2.15.5 → buz-2.15.6}/src/buz/locator/pypendency/handler_not_registered_exception.py +0 -0
  212. {buz-2.15.5 → buz-2.15.6}/src/buz/locator/sync/__init__.py +0 -0
  213. {buz-2.15.5 → buz-2.15.6}/src/buz/locator/sync/handler_already_registered_exception.py +0 -0
  214. {buz-2.15.5 → buz-2.15.6}/src/buz/locator/sync/handler_not_registered_exception.py +0 -0
  215. {buz-2.15.5 → buz-2.15.6}/src/buz/locator/sync/instance_locator.py +0 -0
  216. {buz-2.15.5 → buz-2.15.6}/src/buz/message.py +0 -0
  217. {buz-2.15.5 → buz-2.15.6}/src/buz/middleware/__init__.py +0 -0
  218. {buz-2.15.5 → buz-2.15.6}/src/buz/middleware/middleware.py +0 -0
  219. {buz-2.15.5 → buz-2.15.6}/src/buz/middleware/middleware_chain_builder.py +0 -0
  220. {buz-2.15.5 → buz-2.15.6}/src/buz/py.typed +0 -0
  221. {buz-2.15.5 → buz-2.15.6}/src/buz/query/__init__.py +0 -0
  222. {buz-2.15.5 → buz-2.15.6}/src/buz/query/asynchronous/__init__.py +0 -0
  223. {buz-2.15.5 → buz-2.15.6}/src/buz/query/asynchronous/base_query_handler.py +0 -0
  224. {buz-2.15.5 → buz-2.15.6}/src/buz/query/asynchronous/middleware/__init__.py +0 -0
  225. {buz-2.15.5 → buz-2.15.6}/src/buz/query/asynchronous/middleware/base_handle_middleware.py +0 -0
  226. {buz-2.15.5 → buz-2.15.6}/src/buz/query/asynchronous/middleware/handle_middleware.py +0 -0
  227. {buz-2.15.5 → buz-2.15.6}/src/buz/query/asynchronous/middleware/handle_middleware_chain_resolver.py +0 -0
  228. {buz-2.15.5 → buz-2.15.6}/src/buz/query/asynchronous/query_bus.py +0 -0
  229. {buz-2.15.5 → buz-2.15.6}/src/buz/query/asynchronous/query_handler.py +0 -0
  230. {buz-2.15.5 → buz-2.15.6}/src/buz/query/asynchronous/self_process/__init__.py +0 -0
  231. {buz-2.15.5 → buz-2.15.6}/src/buz/query/asynchronous/self_process/self_process_query_bus.py +0 -0
  232. {buz-2.15.5 → buz-2.15.6}/src/buz/query/more_than_one_query_handler_related_exception.py +0 -0
  233. {buz-2.15.5 → buz-2.15.6}/src/buz/query/query.py +0 -0
  234. {buz-2.15.5 → buz-2.15.6}/src/buz/query/query_response.py +0 -0
  235. {buz-2.15.5 → buz-2.15.6}/src/buz/query/synchronous/__init__.py +0 -0
  236. {buz-2.15.5 → buz-2.15.6}/src/buz/query/synchronous/base_query_handler.py +0 -0
  237. {buz-2.15.5 → buz-2.15.6}/src/buz/query/synchronous/middleware/__init__.py +0 -0
  238. {buz-2.15.5 → buz-2.15.6}/src/buz/query/synchronous/middleware/base_handle_middleware.py +0 -0
  239. {buz-2.15.5 → buz-2.15.6}/src/buz/query/synchronous/middleware/handle_middleware.py +0 -0
  240. {buz-2.15.5 → buz-2.15.6}/src/buz/query/synchronous/middleware/handle_middleware_chain_resolver.py +0 -0
  241. {buz-2.15.5 → buz-2.15.6}/src/buz/query/synchronous/query_bus.py +0 -0
  242. {buz-2.15.5 → buz-2.15.6}/src/buz/query/synchronous/query_handler.py +0 -0
  243. {buz-2.15.5 → buz-2.15.6}/src/buz/query/synchronous/self_process/__init__.py +0 -0
  244. {buz-2.15.5 → buz-2.15.6}/src/buz/query/synchronous/self_process/self_process_query_bus.py +0 -0
  245. {buz-2.15.5 → buz-2.15.6}/src/buz/query/synchronous/synced_async/__init__.py +0 -0
  246. {buz-2.15.5 → buz-2.15.6}/src/buz/query/synchronous/synced_async/synced_async_query_bus.py +0 -0
  247. {buz-2.15.5 → buz-2.15.6}/src/buz/queue/__init__.py +0 -0
  248. {buz-2.15.5 → buz-2.15.6}/src/buz/queue/in_memory/in_memory_multiqueue_repository.py +0 -0
  249. {buz-2.15.5 → buz-2.15.6}/src/buz/queue/in_memory/in_memory_queue_repository.py +0 -0
  250. {buz-2.15.5 → buz-2.15.6}/src/buz/queue/multiqueue_repository.py +0 -0
  251. {buz-2.15.5 → buz-2.15.6}/src/buz/queue/queue_repository.py +0 -0
  252. {buz-2.15.5 → buz-2.15.6}/src/buz/serializer/message_to_bytes_serializer.py +0 -0
  253. {buz-2.15.5 → buz-2.15.6}/src/buz/serializer/message_to_json_bytes_serializer.py +0 -0
  254. {buz-2.15.5 → buz-2.15.6}/src/buz/wrapper/__init__.py +0 -0
  255. {buz-2.15.5 → buz-2.15.6}/src/buz/wrapper/async_to_sync.py +0 -0
  256. {buz-2.15.5 → buz-2.15.6}/src/buz/wrapper/event_loop.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: buz
3
- Version: 2.15.5
3
+ Version: 2.15.6
4
4
  Summary: Buz is a set of light, simple and extensible implementations of event, command and query buses.
5
5
  License: MIT
6
6
  Author: Luis Pintado Lozano
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "buz"
3
- version = "2.15.5"
3
+ version = "2.15.6"
4
4
  description = "Buz is a set of light, simple and extensible implementations of event, command and query buses."
5
5
  readme = "README.md"
6
6
  authors = ["Luis Pintado Lozano <luis.pintado.lozano@gmail.com>", "Gerardo Parra <gprauxiliar@gmail.com>"]
@@ -33,6 +33,13 @@ T = TypeVar("T", bound=Event)
33
33
 
34
34
  class BaseBuzAIOKafkaAsyncConsumer(AsyncConsumer):
35
35
  __FALLBACK_PARTITION_ASSIGNORS = (RoundRobinPartitionAssignor,)
36
+ __DEFAULT_MAX_POLL_INTERVAL = 30 * 60 * 1000
37
+ __DEFAULT_SESSION_TIMEOUT_MS = 1000 * 120
38
+ __DEFAULT_HEARTBEAT_INTERVAL = int(__DEFAULT_SESSION_TIMEOUT_MS / 5)
39
+ __SECONDS_BETWEEN_EXECUTIONS_IF_THERE_ARE_NO_TASKS_IN_THE_QUEUE = 1
40
+ __SECONDS_BETWEEN_POLLS_IF_THERE_ARE_TASKS_IN_THE_QUEUE = 1
41
+ __SECONDS_BETWEEN_POLLS_IF_THERE_ARE_NO_NEW_TASKS = 1
42
+ __MAX_NUMBER_OF_CONCURRENT_POLLING_TASKS = 20
36
43
 
37
44
  def __init__(
38
45
  self,
@@ -48,10 +55,14 @@ class BaseBuzAIOKafkaAsyncConsumer(AsyncConsumer):
48
55
  health_check_port: Optional[int],
49
56
  consumer_initial_offset_position: ConsumerInitialOffsetPosition,
50
57
  auto_create_topic_configuration: Optional[AutoCreateTopicConfiguration] = None,
51
- seconds_between_executions_if_there_are_no_tasks_in_the_queue: int = 1,
52
- seconds_between_polls_if_there_are_tasks_in_the_queue: int = 1,
53
- seconds_between_polls_if_there_are_no_new_tasks: int = 1,
54
- max_number_of_concurrent_polling_tasks: int = 20,
58
+ seconds_between_executions_if_there_are_no_tasks_in_the_queue: Optional[int] = None,
59
+ seconds_between_polls_if_there_are_tasks_in_the_queue: Optional[int] = None,
60
+ seconds_between_polls_if_there_are_no_new_tasks: Optional[int] = None,
61
+ max_number_of_concurrent_polling_tasks: Optional[int] = None,
62
+ session_timeout_ms: Optional[int] = None,
63
+ max_poll_interval_ms: Optional[int] = None,
64
+ heartbeat_interval_ms: Optional[int] = None,
65
+ wait_for_connection_to_cluster_ms: Optional[int] = None,
55
66
  ):
56
67
  self.__connection_config = connection_config
57
68
  self.__consume_strategy = consume_strategy
@@ -60,34 +71,47 @@ class BaseBuzAIOKafkaAsyncConsumer(AsyncConsumer):
60
71
  self._logger = logger
61
72
  self.__health_check_port = health_check_port
62
73
  self.__consumer_initial_offset_position = consumer_initial_offset_position
63
- self.__max_records_retrieved_per_poll = 1
64
74
  self.__executor_per_consumer_mapper: dict[AIOKafkaConsumer, KafkaEventSubscriberExecutor] = {}
65
75
  self.__queue_per_consumer_mapper: dict[
66
76
  AIOKafkaConsumer, MultiqueueRepository[TopicPartition, KafkaPollRecord]
67
77
  ] = {}
68
- self.__max_records_retrieved_per_poll = max_records_retrieved_per_poll
69
- self.__max_queue_size = max_queue_size
70
- self.__should_stop = AsyncIOEvent()
78
+ self.__max_records_retrieved_per_poll: int = max_records_retrieved_per_poll
79
+ self.__session_timeout_ms: int = session_timeout_ms or self.__DEFAULT_SESSION_TIMEOUT_MS
80
+ self.__max_poll_interval_ms: int = max_poll_interval_ms or self.__DEFAULT_MAX_POLL_INTERVAL
81
+ self.__heartbeat_interval_ms: int = heartbeat_interval_ms or self.__DEFAULT_HEARTBEAT_INTERVAL
82
+ self.__max_queue_size: int = max_queue_size
83
+ self.__should_stop: AsyncIOEvent = AsyncIOEvent()
71
84
  self.__start_kafka_consumers_elapsed_time: Optional[timedelta] = None
72
85
  self.__initial_coroutines_created_elapsed_time: Optional[timedelta] = None
73
86
  self.__events_processed: int = 0
74
87
  self.__events_processed_elapsed_time: timedelta = timedelta()
75
- self.__kafka_admin_client = kafka_admin_client
76
- self.__auto_create_topic_configuration = auto_create_topic_configuration
77
- self.__seconds_between_executions_if_there_are_no_tasks_in_the_queue = (
88
+ self.__kafka_admin_client: Optional[KafkaAdminClient] = kafka_admin_client
89
+ self.__auto_create_topic_configuration: Optional[AutoCreateTopicConfiguration] = auto_create_topic_configuration
90
+ self.__seconds_between_executions_if_there_are_no_tasks_in_the_queue: int = (
78
91
  seconds_between_executions_if_there_are_no_tasks_in_the_queue
92
+ or self.__SECONDS_BETWEEN_EXECUTIONS_IF_THERE_ARE_NO_TASKS_IN_THE_QUEUE
79
93
  )
80
- self.__seconds_between_polls_if_there_are_tasks_in_the_queue = (
94
+ self.__seconds_between_polls_if_there_are_tasks_in_the_queue: int = (
81
95
  seconds_between_polls_if_there_are_tasks_in_the_queue
96
+ or self.__SECONDS_BETWEEN_POLLS_IF_THERE_ARE_TASKS_IN_THE_QUEUE
82
97
  )
83
- self.__seconds_between_polls_if_there_are_no_new_tasks = seconds_between_polls_if_there_are_no_new_tasks
84
- self.__polling_tasks_semaphore = Semaphore(max_number_of_concurrent_polling_tasks)
98
+ self.__seconds_between_polls_if_there_are_no_new_tasks: int = (
99
+ seconds_between_polls_if_there_are_no_new_tasks or self.__SECONDS_BETWEEN_POLLS_IF_THERE_ARE_NO_NEW_TASKS
100
+ )
101
+ self.__max_number_of_concurrent_polling_tasks: int = (
102
+ max_number_of_concurrent_polling_tasks or self.__MAX_NUMBER_OF_CONCURRENT_POLLING_TASKS
103
+ )
104
+ self.__wait_for_connection_to_cluster_ms: Optional[int] = wait_for_connection_to_cluster_ms
105
+ self.__polling_tasks_semaphore = Semaphore(self.__max_number_of_concurrent_polling_tasks)
85
106
  self.__task_execution_mutex = Lock()
107
+ self.__is_worked_initialized = False
86
108
 
87
- async def configure_health_check_server(self, health_check_port: int) -> web.TCPSite:
109
+ async def configure_http_check_server(self, health_check_port: int) -> web.TCPSite:
88
110
  self._logger.info(f"Starting health check server on port {health_check_port}")
89
111
  app = web.Application()
90
112
  app.router.add_get("/health", lambda request: self.__health_check())
113
+ app.router.add_get("/ready", lambda request: self.__is_ready())
114
+
91
115
  runner = web.AppRunner(app)
92
116
  await runner.setup()
93
117
  site = web.TCPSite(runner, "localhost", health_check_port)
@@ -95,12 +119,14 @@ class BaseBuzAIOKafkaAsyncConsumer(AsyncConsumer):
95
119
  return site
96
120
 
97
121
  async def run(self) -> None:
122
+ self.__print_worker_configuration()
98
123
  start_time = datetime.now()
99
- await self.__generate_kafka_consumers()
100
124
  health_check_server: Optional[web.TCPSite] = None
101
125
 
102
126
  if self.__health_check_port is not None:
103
- health_check_server = await self.configure_health_check_server(self.__health_check_port)
127
+ health_check_server = await self.configure_http_check_server(self.__health_check_port)
128
+
129
+ await self.__generate_kafka_consumers()
104
130
 
105
131
  self.__initial_coroutines_created_elapsed_time = datetime.now() - start_time
106
132
 
@@ -108,14 +134,39 @@ class BaseBuzAIOKafkaAsyncConsumer(AsyncConsumer):
108
134
  self._logger.error("There are no valid subscribers to execute, finalizing consumer")
109
135
  return
110
136
 
137
+ self.__is_worked_initialized = True
138
+
111
139
  start_consumption_time = datetime.now()
112
140
  worker_errors = await self.__run_worker()
113
141
  self.__events_processed_elapsed_time = datetime.now() - start_consumption_time
114
142
 
143
+ await self.__handle_graceful_stop(worker_errors)
144
+
115
145
  if health_check_server is not None:
116
146
  await health_check_server.stop()
117
147
 
118
- await self.__handle_graceful_stop(worker_errors)
148
+ def __print_worker_configuration(self) -> None:
149
+ self._logger.info(
150
+ f"Consumer configuration:\n"
151
+ f" - Consume strategy: {self.__consume_strategy}\n"
152
+ f" - Max queue size: {self.__max_queue_size}\n"
153
+ f" - Max records retrieved per poll: {self.__max_records_retrieved_per_poll}\n"
154
+ f" - Kafka partition assignors: {self.__kafka_partition_assignors}\n"
155
+ f" - Consumer initial offset position: {self.__consumer_initial_offset_position}\n"
156
+ f" - Session timeout ms: {self.__session_timeout_ms}\n"
157
+ f" - Max poll interval ms: {self.__max_poll_interval_ms}\n"
158
+ f" - Heartbeat interval ms: {self.__heartbeat_interval_ms}\n"
159
+ f" - Seconds between executions if there are no tasks in the queue: "
160
+ f"{self.__seconds_between_executions_if_there_are_no_tasks_in_the_queue}\n"
161
+ f" - Seconds between polls if there are tasks in the queue: "
162
+ f"{self.__seconds_between_polls_if_there_are_tasks_in_the_queue}\n"
163
+ f" - Seconds between polls if there are no new tasks: "
164
+ f"{self.__seconds_between_polls_if_there_are_no_new_tasks}\n"
165
+ f" - Max number of concurrent polling tasks: {self.__max_number_of_concurrent_polling_tasks}\n"
166
+ f" - Wait for connection to cluster ms: {self.__wait_for_connection_to_cluster_ms}\n"
167
+ f" - Health check port: {self.__health_check_port}\n"
168
+ f" - Number of subscribers: {len(self.__subscribers)}"
169
+ )
119
170
 
120
171
  async def __handle_graceful_stop(self, worker_errors: tuple[Optional[Exception], Optional[Exception]]) -> None:
121
172
  self._logger.info("Stopping kafka consumers...")
@@ -160,36 +211,44 @@ class BaseBuzAIOKafkaAsyncConsumer(AsyncConsumer):
160
211
  self.__start_kafka_consumers_elapsed_time = datetime.now() - start_time
161
212
 
162
213
  async def __generate_kafka_consumer_for_subscriber(self, subscriber: MetaSubscriber) -> None:
163
- try:
164
- executor = await self._create_kafka_consumer_executor(subscriber)
165
- topics = self.__consume_strategy.get_topics(subscriber)
166
- kafka_consumer = AIOKafkaConsumer(
167
- consumer_group=self.__consume_strategy.get_subscription_group(subscriber),
168
- topics=topics,
169
- connection_config=self.__connection_config,
170
- initial_offset_position=self.__consumer_initial_offset_position,
171
- partition_assignors=self.__kafka_partition_assignors + self.__FALLBACK_PARTITION_ASSIGNORS,
172
- logger=self._logger,
173
- kafka_admin_client=self.__kafka_admin_client,
174
- auto_create_topic_configuration=self.__auto_create_topic_configuration,
175
- on_partition_revoked=self.__on_partition_revoked,
176
- )
177
-
178
- self.__executor_per_consumer_mapper[kafka_consumer] = executor
179
-
180
- self.__queue_per_consumer_mapper[kafka_consumer] = InMemoryMultiqueueRepository()
214
+ executor = await self._create_kafka_consumer_executor(subscriber)
215
+ topics = self.__consume_strategy.get_topics(subscriber)
216
+ kafka_consumer = AIOKafkaConsumer(
217
+ consumer_group=self.__consume_strategy.get_subscription_group(subscriber),
218
+ topics=topics,
219
+ connection_config=self.__connection_config,
220
+ initial_offset_position=self.__consumer_initial_offset_position,
221
+ partition_assignors=self.__kafka_partition_assignors + self.__FALLBACK_PARTITION_ASSIGNORS,
222
+ logger=self._logger,
223
+ kafka_admin_client=self.__kafka_admin_client,
224
+ auto_create_topic_configuration=self.__auto_create_topic_configuration,
225
+ on_partition_revoked=self.__on_partition_revoked,
226
+ session_timeout_ms=self.__session_timeout_ms,
227
+ max_poll_interval_ms=self.__max_poll_interval_ms,
228
+ heartbeat_interval_ms=self.__heartbeat_interval_ms,
229
+ wait_for_connection_to_cluster_ms=self.__wait_for_connection_to_cluster_ms,
230
+ )
181
231
 
182
- except Exception:
183
- self._logger.exception(
184
- f"Unexpected error during Kafka subscriber '{subscriber.fqn()}' creation. Skipping it: {traceback.format_exc()}"
185
- )
232
+ self.__executor_per_consumer_mapper[kafka_consumer] = executor
233
+
234
+ self.__queue_per_consumer_mapper[kafka_consumer] = InMemoryMultiqueueRepository()
235
+
236
+ self._logger.info(
237
+ f"initializing consumer group: '{kafka_consumer.get_consumer_group()}' subscribed to the topics: '{kafka_consumer.get_topics()}'"
238
+ )
239
+
240
+ await kafka_consumer.init()
241
+
242
+ self._logger.info(
243
+ f"Initialized consumer group: '{kafka_consumer.get_consumer_group()}' subscribed to the topics: '{kafka_consumer.get_topics()}'"
244
+ )
186
245
 
187
246
  @abstractmethod
188
247
  async def _create_kafka_consumer_executor(self, subscriber: MetaSubscriber) -> KafkaEventSubscriberExecutor:
189
248
  pass
190
249
 
191
250
  async def __polling_task(self) -> None:
192
- self._logger.info("Initializing subscribers")
251
+ self._logger.info("Creating polling tasks")
193
252
  try:
194
253
  polling_task_per_consumer = [
195
254
  create_task(self.__polling_consuming_tasks(consumer))
@@ -204,18 +263,6 @@ class BaseBuzAIOKafkaAsyncConsumer(AsyncConsumer):
204
263
 
205
264
  async def __polling_consuming_tasks(self, consumer: AIOKafkaConsumer) -> None:
206
265
  queue = self.__queue_per_consumer_mapper[consumer]
207
-
208
- try:
209
- self._logger.info(
210
- f"initializing consumer group: '{consumer.get_consumer_group()}' subscribed to the topics: '{consumer.get_topics()}'"
211
- )
212
- await consumer.init()
213
- self._logger.info(f"initialized '{consumer.get_consumer_group()}'")
214
- except Exception:
215
- self._logger.exception(
216
- f"Unexpected error during Kafka subscriber '{consumer.get_consumer_group()}' initialization. Skipping it: {traceback.format_exc()}"
217
- )
218
-
219
266
  while not self.__should_stop.is_set():
220
267
  total_size = sum([queue.get_total_size() for queue in self.__queue_per_consumer_mapper.values()])
221
268
  if total_size >= self.__max_queue_size:
@@ -240,7 +287,7 @@ class BaseBuzAIOKafkaAsyncConsumer(AsyncConsumer):
240
287
  await sleep(self.__seconds_between_polls_if_there_are_no_new_tasks)
241
288
 
242
289
  async def __consume_events_task(self) -> None:
243
- self._logger.info("Initializing consuming task")
290
+ self._logger.info("Creating consuming task")
244
291
  blocked_tasks_iterator = self.__generate_blocked_consuming_tasks_iterator()
245
292
 
246
293
  async for consuming_task in blocked_tasks_iterator:
@@ -300,9 +347,22 @@ class BaseBuzAIOKafkaAsyncConsumer(AsyncConsumer):
300
347
 
301
348
  return web.Response(text=json.dumps(health_information), content_type="application/json")
302
349
 
350
+ async def __is_ready(self) -> web.Response:
351
+ is_ready = self.__is_worked_initialized
352
+ status_code = 200 if is_ready else 503
353
+
354
+ self._logger.info(f"Health check is_ready: {is_ready}, status_code: {status_code}")
355
+
356
+ return web.Response(
357
+ text=json.dumps({"is_ready": is_ready}), content_type="application/json", status=status_code
358
+ )
359
+
303
360
  def __print_statistics(self) -> None:
304
- self._logger.info("Number of subscribers: %d", len(self.__subscribers))
305
- self._logger.info(f"Start kafka consumers elapsed time: {self.__start_kafka_consumers_elapsed_time}")
306
- self._logger.info(f"Initial coroutines created elapsed time: {self.__initial_coroutines_created_elapsed_time}")
307
- self._logger.info(f"Events processed: {self.__events_processed}")
308
- self._logger.info(f"Events processed elapsed time: {self.__events_processed_elapsed_time}")
361
+ self._logger.info(
362
+ f"System startup summary:\n"
363
+ f" - Number of subscribers: {len(self.__subscribers)}\n"
364
+ f" - Start Kafka consumers elapsed time: {self.__start_kafka_consumers_elapsed_time}\n"
365
+ f" - Initial coroutines created elapsed time: {self.__initial_coroutines_created_elapsed_time}\n"
366
+ f" - Events processed: {self.__events_processed}\n"
367
+ f" - Events processed elapsed time: {self.__events_processed_elapsed_time}"
368
+ )
@@ -47,11 +47,15 @@ class BuzAIOKafkaAsyncConsumer(BaseBuzAIOKafkaAsyncConsumer):
47
47
  consume_retrier: Optional[ConsumeRetrier] = None,
48
48
  reject_callback: Optional[RejectCallback] = None,
49
49
  auto_create_topic_configuration: Optional[AutoCreateTopicConfiguration] = None,
50
- seconds_between_executions_if_there_are_no_tasks_in_the_queue: int = 1,
51
- seconds_between_polls_if_there_are_tasks_in_the_queue: int = 1,
52
- seconds_between_polls_if_there_are_no_new_tasks: int = 1,
53
- max_number_of_concurrent_polling_tasks: int = 20,
50
+ seconds_between_executions_if_there_are_no_tasks_in_the_queue: Optional[int] = None,
51
+ seconds_between_polls_if_there_are_tasks_in_the_queue: Optional[int] = None,
52
+ seconds_between_polls_if_there_are_no_new_tasks: Optional[int] = None,
53
+ max_number_of_concurrent_polling_tasks: Optional[int] = None,
54
+ session_timeout_ms: Optional[int] = None,
55
+ max_poll_interval_ms: Optional[int] = None,
56
+ heartbeat_interval_ms: Optional[int] = None,
54
57
  health_check_port: Optional[int] = None,
58
+ wait_for_connection_to_cluster_ms: Optional[int] = None,
55
59
  ):
56
60
  super().__init__(
57
61
  connection_config=connection_config,
@@ -68,7 +72,11 @@ class BuzAIOKafkaAsyncConsumer(BaseBuzAIOKafkaAsyncConsumer):
68
72
  seconds_between_polls_if_there_are_tasks_in_the_queue=seconds_between_polls_if_there_are_tasks_in_the_queue,
69
73
  seconds_between_polls_if_there_are_no_new_tasks=seconds_between_polls_if_there_are_no_new_tasks,
70
74
  max_number_of_concurrent_polling_tasks=max_number_of_concurrent_polling_tasks,
75
+ session_timeout_ms=session_timeout_ms,
76
+ max_poll_interval_ms=max_poll_interval_ms,
77
+ heartbeat_interval_ms=heartbeat_interval_ms,
71
78
  health_check_port=health_check_port,
79
+ wait_for_connection_to_cluster_ms=wait_for_connection_to_cluster_ms,
72
80
  )
73
81
  self.__on_fail_strategy = on_fail_strategy
74
82
  self.__consume_middlewares = consume_middlewares
@@ -48,11 +48,15 @@ class BuzAIOKafkaMultiThreadedConsumer(BaseBuzAIOKafkaAsyncConsumer):
48
48
  consume_retrier: Optional[ConsumeRetrier] = None,
49
49
  reject_callback: Optional[RejectCallback] = None,
50
50
  auto_create_topic_configuration: Optional[AutoCreateTopicConfiguration] = None,
51
- seconds_between_executions_if_there_are_no_tasks_in_the_queue: int = 1,
52
- seconds_between_polls_if_there_are_tasks_in_the_queue: int = 1,
53
- seconds_between_polls_if_there_are_no_new_tasks: int = 1,
54
- max_number_of_concurrent_polling_tasks: int = 20,
55
- health_check_port: Optional[int] = 3123,
51
+ seconds_between_executions_if_there_are_no_tasks_in_the_queue: Optional[int] = None,
52
+ seconds_between_polls_if_there_are_tasks_in_the_queue: Optional[int] = None,
53
+ seconds_between_polls_if_there_are_no_new_tasks: Optional[int] = None,
54
+ max_number_of_concurrent_polling_tasks: Optional[int] = None,
55
+ session_timeout_ms: Optional[int] = None,
56
+ max_poll_interval_ms: Optional[int] = None,
57
+ heartbeat_interval_ms: Optional[int] = None,
58
+ health_check_port: Optional[int] = None,
59
+ wait_for_connection_to_cluster_ms: Optional[int] = None,
56
60
  ):
57
61
  super().__init__(
58
62
  connection_config=connection_config,
@@ -70,6 +74,10 @@ class BuzAIOKafkaMultiThreadedConsumer(BaseBuzAIOKafkaAsyncConsumer):
70
74
  seconds_between_polls_if_there_are_no_new_tasks=seconds_between_polls_if_there_are_no_new_tasks,
71
75
  max_number_of_concurrent_polling_tasks=max_number_of_concurrent_polling_tasks,
72
76
  health_check_port=health_check_port,
77
+ session_timeout_ms=session_timeout_ms,
78
+ max_poll_interval_ms=max_poll_interval_ms,
79
+ heartbeat_interval_ms=heartbeat_interval_ms,
80
+ wait_for_connection_to_cluster_ms=wait_for_connection_to_cluster_ms,
73
81
  )
74
82
  self.__on_fail_strategy = on_fail_strategy
75
83
  self.__consume_middlewares = consume_middlewares
@@ -1,5 +1,6 @@
1
1
  from __future__ import annotations
2
2
 
3
+ import asyncio
3
4
  from logging import Logger
4
5
  from typing import Awaitable, Callable, Optional, Sequence, cast
5
6
 
@@ -25,8 +26,6 @@ from buz.kafka.infrastructure.aiokafka.translators.consumer_initial_offset_posit
25
26
 
26
27
  class AIOKafkaConsumer:
27
28
  __DEFAULT_POLL_TIMEOUT_MS = 0
28
- __DEFAULT_SESSION_TIMEOUT_MS = 1000 * 120
29
- __DEFAULT_MAX_POLL_INTERVAL = 30 * 60 * 1000
30
29
 
31
30
  def __init__(
32
31
  self,
@@ -38,9 +37,12 @@ class AIOKafkaConsumer:
38
37
  initial_offset_position: ConsumerInitialOffsetPosition,
39
38
  partition_assignors: tuple,
40
39
  logger: Logger,
41
- session_timeout_ms: int = __DEFAULT_SESSION_TIMEOUT_MS,
40
+ session_timeout_ms: int,
41
+ max_poll_interval_ms: int,
42
+ heartbeat_interval_ms: int,
42
43
  on_partition_revoked: Callable[[AIOKafkaConsumer, set[TopicPartition]], Awaitable[None]],
43
44
  auto_create_topic_configuration: Optional[AutoCreateTopicConfiguration] = None,
45
+ wait_for_connection_to_cluster_ms: Optional[int] = None,
44
46
  ) -> None:
45
47
  self.__consumer_group = consumer_group
46
48
  self.__topics = topics
@@ -52,6 +54,9 @@ class AIOKafkaConsumer:
52
54
  self.__session_timeout_ms = session_timeout_ms
53
55
  self.__auto_create_topic_configuration = auto_create_topic_configuration
54
56
  self.__on_partitions_revoked_callback = on_partition_revoked
57
+ self.__max_poll_interval_ms = max_poll_interval_ms
58
+ self.__heartbeat_interval_ms = heartbeat_interval_ms
59
+ self.__wait_for_connection_to_cluster_ms = wait_for_connection_to_cluster_ms
55
60
  self.__check_kafka_admin_client_is_needed()
56
61
  self.__consumer = self.__generate_consumer()
57
62
 
@@ -98,10 +103,10 @@ class AIOKafkaConsumer:
98
103
  self.__initial_offset_position
99
104
  ),
100
105
  session_timeout_ms=self.__session_timeout_ms,
101
- heartbeat_interval_ms=int(self.__session_timeout_ms / 5),
106
+ heartbeat_interval_ms=self.__heartbeat_interval_ms,
102
107
  partition_assignment_strategy=list(self.__partition_assignors),
103
- max_poll_interval_ms=self.__DEFAULT_MAX_POLL_INTERVAL,
104
- rebalance_timeout_ms=self.__DEFAULT_MAX_POLL_INTERVAL,
108
+ max_poll_interval_ms=self.__max_poll_interval_ms,
109
+ rebalance_timeout_ms=self.__max_poll_interval_ms,
105
110
  )
106
111
 
107
112
  return consumer
@@ -148,7 +153,11 @@ class AIOKafkaConsumer:
148
153
  )
149
154
 
150
155
  self.__logger.info(f"initializing connection of consumer with group_id={self.__consumer_group}")
151
- await self.__consumer.start()
156
+
157
+ if self.__wait_for_connection_to_cluster_ms is not None:
158
+ await asyncio.wait_for(self.__consumer.start(), self.__wait_for_connection_to_cluster_ms / 1000)
159
+ else:
160
+ await self.__consumer.start()
152
161
 
153
162
  async def __on_partitions_assigned(
154
163
  self,
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes