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.
- {buz-2.15.5 → buz-2.15.6}/PKG-INFO +1 -1
- {buz-2.15.5 → buz-2.15.6}/pyproject.toml +1 -1
- {buz-2.15.5 → buz-2.15.6}/src/buz/event/infrastructure/buz_kafka/base_buz_aiokafka_async_consumer.py +119 -59
- {buz-2.15.5 → buz-2.15.6}/src/buz/event/infrastructure/buz_kafka/buz_aiokafka_async_consumer.py +12 -4
- {buz-2.15.5 → buz-2.15.6}/src/buz/event/infrastructure/buz_kafka/buz_aiokafka_multi_threaded_consumer.py +13 -5
- {buz-2.15.5 → buz-2.15.6}/src/buz/kafka/infrastructure/aiokafka/aiokafka_consumer.py +16 -7
- {buz-2.15.5 → buz-2.15.6}/LICENSE +0 -0
- {buz-2.15.5 → buz-2.15.6}/README.md +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/__init__.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/command/__init__.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/command/asynchronous/__init__.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/command/asynchronous/base_command_handler.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/command/asynchronous/command_bus.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/command/asynchronous/command_handler.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/command/asynchronous/middleware/__init__.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/command/asynchronous/middleware/base_handle_middleware.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/command/asynchronous/middleware/handle_middleware.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/command/asynchronous/middleware/handle_middleware_chain_resolver.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/command/asynchronous/self_process/__init__.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/command/asynchronous/self_process/self_process_command_bus.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/command/command.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/command/more_than_one_command_handler_related_exception.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/command/synchronous/__init__.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/command/synchronous/base_command_handler.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/command/synchronous/command_bus.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/command/synchronous/command_handler.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/command/synchronous/middleware/__init__.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/command/synchronous/middleware/base_handle_middleware.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/command/synchronous/middleware/handle_middleware.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/command/synchronous/middleware/handle_middleware_chain_resolver.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/command/synchronous/self_process/__init__.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/command/synchronous/self_process/self_process_command_bus.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/command/synchronous/synced_async/__init__.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/command/synchronous/synced_async/synced_async_command_bus.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/event/__init__.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/event/async_consumer.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/event/async_event_bus.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/event/async_subscriber.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/event/async_worker.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/event/base_async_subscriber.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/event/base_subscriber.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/event/consumer.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/event/dead_letter_queue/__init__.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/event/dead_letter_queue/dlq_criteria.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/event/dead_letter_queue/dlq_record.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/event/dead_letter_queue/dlq_repository.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/event/event.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/event/event_bus.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/event/exceptions/__init__.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/event/exceptions/event_not_published_exception.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/event/exceptions/event_restore_exception.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/event/exceptions/subscribers_not_found_exception.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/event/exceptions/term_signal_interruption_exception.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/event/exceptions/worker_execution_exception.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/event/infrastructure/__init__.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/event/infrastructure/buz_kafka/__init__.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/event/infrastructure/buz_kafka/async_buz_kafka_event_bus.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/event/infrastructure/buz_kafka/buz_kafka_event_bus.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/event/infrastructure/buz_kafka/consume_strategy/__init__.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/event/infrastructure/buz_kafka/consume_strategy/consume_strategy.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/event/infrastructure/buz_kafka/consume_strategy/kafka_on_fail_strategy.py +0 -0
- {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
- {buz-2.15.5 → buz-2.15.6}/src/buz/event/infrastructure/buz_kafka/exceptions/__init__.py +0 -0
- {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
- {buz-2.15.5 → buz-2.15.6}/src/buz/event/infrastructure/buz_kafka/exceptions/max_consumer_retry_exception.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/event/infrastructure/buz_kafka/exceptions/retry_exception.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/event/infrastructure/buz_kafka/kafka_event_async_subscriber_executor.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/event/infrastructure/buz_kafka/kafka_event_subscriber_executor.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/event/infrastructure/buz_kafka/kafka_event_sync_subscriber_executor.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/event/infrastructure/buz_kafka/publish_strategy/__init__.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/event/infrastructure/buz_kafka/publish_strategy/publish_strategy.py +0 -0
- {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
- {buz-2.15.5 → buz-2.15.6}/src/buz/event/infrastructure/kombu/__init__.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/event/infrastructure/kombu/allowed_kombu_serializer.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/event/infrastructure/kombu/consume_strategy/__init__.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/event/infrastructure/kombu/consume_strategy/consume_strategy.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/event/infrastructure/kombu/consume_strategy/queue_per_subscriber_consume_strategy.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/event/infrastructure/kombu/kombu_consumer.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/event/infrastructure/kombu/kombu_event_bus.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/event/infrastructure/kombu/publish_strategy/__init__.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/event/infrastructure/kombu/publish_strategy/fanout_exchange_per_event_publish_strategy.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/event/infrastructure/kombu/publish_strategy/publish_strategy.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/event/infrastructure/kombu/retry_strategy/__init__.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/event/infrastructure/kombu/retry_strategy/publish_retry_policy.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/event/infrastructure/kombu/retry_strategy/simple_publish_retry_policy.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/event/infrastructure/models/consuming_task.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/event/infrastructure/queue/__init__.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/event/meta_base_subscriber.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/event/meta_subscriber.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/event/middleware/__init__.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/event/middleware/async_consume_middleware.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/event/middleware/async_consume_middleware_chain_resolver.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/event/middleware/async_publish_middleware.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/event/middleware/async_publish_middleware_chain_resolver.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/event/middleware/base_async_consume_middleware.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/event/middleware/base_consume_middleware.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/event/middleware/base_publish_middleware.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/event/middleware/consume_middleware.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/event/middleware/consume_middleware_chain_resolver.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/event/middleware/exceptions/__init__.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/event/middleware/exceptions/event_already_in_progress_exception.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/event/middleware/publish_middleware.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/event/middleware/publish_middleware_chain_resolver.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/event/strategies/__init__.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/event/strategies/execution_strategy/__init__.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/event/strategies/execution_strategy/async_execution_strategy.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/event/strategies/execution_strategy/async_self_process_execution_strategy.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/event/strategies/execution_strategy/cyclic_iterator_execution_strategy.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/event/strategies/execution_strategy/execution_strategy.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/event/strategies/execution_strategy/self_process_execution_strategy.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/event/strategies/retry/__init__.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/event/strategies/retry/consume_retrier.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/event/strategies/retry/consumed_event_retry.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/event/strategies/retry/consumed_event_retry_repository.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/event/strategies/retry/max_retries_consume_retrier.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/event/strategies/retry/max_retries_negative_exception.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/event/strategies/retry/reject_callback.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/event/subscriber.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/event/sync/__init__.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/event/sync/sync_event_bus.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/event/transactional_outbox/__init__.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/event/transactional_outbox/event_to_outbox_record_translator.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/event/transactional_outbox/fqn_to_event_mapper.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/event/transactional_outbox/outbox_criteria/__init__.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/event/transactional_outbox/outbox_criteria/deliverable_records_outbox_criteria_factory.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/event/transactional_outbox/outbox_criteria/outbox_criteria.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/event/transactional_outbox/outbox_criteria/outbox_criteria_factory.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/event/transactional_outbox/outbox_criteria/outbox_sorting_criteria.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/event/transactional_outbox/outbox_record.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/event/transactional_outbox/outbox_record_finder/__init__.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/event/transactional_outbox/outbox_record_finder/outbox_record_stream_finder.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/event/transactional_outbox/outbox_record_finder/polling_outbox_record_stream_finder.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/event/transactional_outbox/outbox_record_to_event_translator.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/event/transactional_outbox/outbox_record_validation/__init__.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/event/transactional_outbox/outbox_record_validation/abstract_outbox_record_validator.py +0 -0
- {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
- {buz-2.15.5 → buz-2.15.6}/src/buz/event/transactional_outbox/outbox_record_validation/outbox_record_validation_exception.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/event/transactional_outbox/outbox_record_validation/outbox_record_validator.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/event/transactional_outbox/outbox_record_validation/size_outbox_record_validator.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/event/transactional_outbox/outbox_repository.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/event/transactional_outbox/transactional_outbox_event_bus.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/event/transactional_outbox/transactional_outbox_worker.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/event/worker.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/handler.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/kafka/__init__.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/kafka/domain/exceptions/__init__.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/kafka/domain/exceptions/not_all_partition_assigned_exception.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/kafka/domain/exceptions/not_valid_kafka_message_exception.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/kafka/domain/exceptions/not_valid_partition_number_exception.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/kafka/domain/exceptions/topic_already_created_exception.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/kafka/domain/exceptions/topic_not_found_exception.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/kafka/domain/models/__init__.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/kafka/domain/models/auto_create_topic_configuration.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/kafka/domain/models/consumer_initial_offset_position.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/kafka/domain/models/create_kafka_topic.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/kafka/domain/models/kafka_connection_config.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/kafka/domain/models/kafka_connection_credentials.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/kafka/domain/models/kafka_connection_plain_text_credentials.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/kafka/domain/models/kafka_connection_sasl_credentials.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/kafka/domain/models/kafka_consumer_record.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/kafka/domain/models/kafka_poll_record.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/kafka/domain/models/kafka_supported_compression_type.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/kafka/domain/models/kafka_supported_sasl_mechanisms.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/kafka/domain/models/kafka_supported_security_protocols.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/kafka/domain/services/__init__.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/kafka/domain/services/async_kafka_producer.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/kafka/domain/services/kafka_admin_client.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/kafka/domain/services/kafka_admin_test_client.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/kafka/domain/services/kafka_producer.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/kafka/infrastructure/__init__.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/kafka/infrastructure/aiokafka/__init__.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/kafka/infrastructure/aiokafka/aiokafka_producer.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/kafka/infrastructure/aiokafka/rebalance/__init__.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/kafka/infrastructure/aiokafka/rebalance/kafka_callback_rebalancer.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/kafka/infrastructure/aiokafka/translators/__init__.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/kafka/infrastructure/aiokafka/translators/consumer_initial_offset_position_translator.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/kafka/infrastructure/cdc/__init__.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/kafka/infrastructure/cdc/cdc_message.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/kafka/infrastructure/cdc/cdc_payload.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/kafka/infrastructure/cdc/cdc_schema.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/kafka/infrastructure/deserializers/__init__.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/kafka/infrastructure/deserializers/byte_deserializer.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/kafka/infrastructure/deserializers/bytes_to_message_deserializer.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/kafka/infrastructure/deserializers/implementations/__init__.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/kafka/infrastructure/deserializers/implementations/cdc/cdc_record_bytes_to_event_deserializer.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/kafka/infrastructure/deserializers/implementations/cdc/not_valid_cdc_message_exception.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/kafka/infrastructure/deserializers/implementations/json_byte_deserializer.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/kafka/infrastructure/deserializers/implementations/json_bytes_to_message_deserializer.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/kafka/infrastructure/interfaces/__init__.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/kafka/infrastructure/interfaces/async_connection_manager.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/kafka/infrastructure/interfaces/connection_manager.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/kafka/infrastructure/kafka_python/__init__.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/kafka/infrastructure/kafka_python/exception/consumer_interrupted_exception.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/kafka/infrastructure/kafka_python/kafka_python_admin_client.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/kafka/infrastructure/kafka_python/kafka_python_admin_test_client.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/kafka/infrastructure/kafka_python/kafka_python_producer.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/kafka/infrastructure/kafka_python/translators/__init__.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/kafka/infrastructure/kafka_python/translators/consumer_initial_offset_position_translator.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/kafka/infrastructure/serializers/byte_serializer.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/kafka/infrastructure/serializers/implementations/cdc_record_bytes_to_event_serializer.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/kafka/infrastructure/serializers/implementations/json_byte_serializer.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/kafka/infrastructure/serializers/kafka_header_serializer.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/locator/__init__.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/locator/handler_fqn_not_found_exception.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/locator/locator.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/locator/message_fqn_not_found_exception.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/locator/pypendency/__init__.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/locator/pypendency/container_locator.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/locator/pypendency/container_locator_resolution_configuration.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/locator/pypendency/handler_not_found_exception.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/locator/pypendency/handler_not_registered_exception.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/locator/sync/__init__.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/locator/sync/handler_already_registered_exception.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/locator/sync/handler_not_registered_exception.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/locator/sync/instance_locator.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/message.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/middleware/__init__.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/middleware/middleware.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/middleware/middleware_chain_builder.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/py.typed +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/query/__init__.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/query/asynchronous/__init__.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/query/asynchronous/base_query_handler.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/query/asynchronous/middleware/__init__.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/query/asynchronous/middleware/base_handle_middleware.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/query/asynchronous/middleware/handle_middleware.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/query/asynchronous/middleware/handle_middleware_chain_resolver.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/query/asynchronous/query_bus.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/query/asynchronous/query_handler.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/query/asynchronous/self_process/__init__.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/query/asynchronous/self_process/self_process_query_bus.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/query/more_than_one_query_handler_related_exception.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/query/query.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/query/query_response.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/query/synchronous/__init__.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/query/synchronous/base_query_handler.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/query/synchronous/middleware/__init__.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/query/synchronous/middleware/base_handle_middleware.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/query/synchronous/middleware/handle_middleware.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/query/synchronous/middleware/handle_middleware_chain_resolver.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/query/synchronous/query_bus.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/query/synchronous/query_handler.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/query/synchronous/self_process/__init__.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/query/synchronous/self_process/self_process_query_bus.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/query/synchronous/synced_async/__init__.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/query/synchronous/synced_async/synced_async_query_bus.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/queue/__init__.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/queue/in_memory/in_memory_multiqueue_repository.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/queue/in_memory/in_memory_queue_repository.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/queue/multiqueue_repository.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/queue/queue_repository.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/serializer/message_to_bytes_serializer.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/serializer/message_to_json_bytes_serializer.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/wrapper/__init__.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/wrapper/async_to_sync.py +0 -0
- {buz-2.15.5 → buz-2.15.6}/src/buz/wrapper/event_loop.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[tool.poetry]
|
|
2
2
|
name = "buz"
|
|
3
|
-
version = "2.15.
|
|
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>"]
|
{buz-2.15.5 → buz-2.15.6}/src/buz/event/infrastructure/buz_kafka/base_buz_aiokafka_async_consumer.py
RENAMED
|
@@ -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 =
|
|
52
|
-
seconds_between_polls_if_there_are_tasks_in_the_queue: int =
|
|
53
|
-
seconds_between_polls_if_there_are_no_new_tasks: int =
|
|
54
|
-
max_number_of_concurrent_polling_tasks: int =
|
|
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.
|
|
70
|
-
self.
|
|
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 =
|
|
84
|
-
|
|
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
|
|
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.
|
|
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
|
-
|
|
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
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
self.
|
|
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
|
-
|
|
183
|
-
|
|
184
|
-
|
|
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("
|
|
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("
|
|
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(
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
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
|
+
)
|
{buz-2.15.5 → buz-2.15.6}/src/buz/event/infrastructure/buz_kafka/buz_aiokafka_async_consumer.py
RENAMED
|
@@ -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 =
|
|
51
|
-
seconds_between_polls_if_there_are_tasks_in_the_queue: int =
|
|
52
|
-
seconds_between_polls_if_there_are_no_new_tasks: int =
|
|
53
|
-
max_number_of_concurrent_polling_tasks: int =
|
|
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 =
|
|
52
|
-
seconds_between_polls_if_there_are_tasks_in_the_queue: int =
|
|
53
|
-
seconds_between_polls_if_there_are_no_new_tasks: int =
|
|
54
|
-
max_number_of_concurrent_polling_tasks: int =
|
|
55
|
-
|
|
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
|
|
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=
|
|
106
|
+
heartbeat_interval_ms=self.__heartbeat_interval_ms,
|
|
102
107
|
partition_assignment_strategy=list(self.__partition_assignors),
|
|
103
|
-
max_poll_interval_ms=self.
|
|
104
|
-
rebalance_timeout_ms=self.
|
|
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
|
-
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{buz-2.15.5 → buz-2.15.6}/src/buz/command/asynchronous/self_process/self_process_command_bus.py
RENAMED
|
File without changes
|
|
File without changes
|
{buz-2.15.5 → buz-2.15.6}/src/buz/command/more_than_one_command_handler_related_exception.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{buz-2.15.5 → buz-2.15.6}/src/buz/command/synchronous/middleware/handle_middleware_chain_resolver.py
RENAMED
|
File without changes
|
|
File without changes
|
{buz-2.15.5 → buz-2.15.6}/src/buz/command/synchronous/self_process/self_process_command_bus.py
RENAMED
|
File without changes
|
|
File without changes
|
{buz-2.15.5 → buz-2.15.6}/src/buz/command/synchronous/synced_async/synced_async_command_bus.py
RENAMED
|
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
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{buz-2.15.5 → buz-2.15.6}/src/buz/event/infrastructure/buz_kafka/async_buz_kafka_event_bus.py
RENAMED
|
File without changes
|
|
File without changes
|
{buz-2.15.5 → buz-2.15.6}/src/buz/event/infrastructure/buz_kafka/consume_strategy/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{buz-2.15.5 → buz-2.15.6}/src/buz/event/infrastructure/buz_kafka/exceptions/retry_exception.py
RENAMED
|
File without changes
|
|
File without changes
|
{buz-2.15.5 → buz-2.15.6}/src/buz/event/infrastructure/buz_kafka/kafka_event_subscriber_executor.py
RENAMED
|
File without changes
|
|
File without changes
|
{buz-2.15.5 → buz-2.15.6}/src/buz/event/infrastructure/buz_kafka/publish_strategy/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{buz-2.15.5 → buz-2.15.6}/src/buz/event/infrastructure/kombu/consume_strategy/consume_strategy.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{buz-2.15.5 → buz-2.15.6}/src/buz/event/infrastructure/kombu/publish_strategy/publish_strategy.py
RENAMED
|
File without changes
|
|
File without changes
|
{buz-2.15.5 → buz-2.15.6}/src/buz/event/infrastructure/kombu/retry_strategy/publish_retry_policy.py
RENAMED
|
File without changes
|