aaron-y-chen commented on code in PR #71135: URL: https://github.com/apache/airflow/pull/71135#discussion_r3811631536
########## providers/amazon/src/airflow/providers/amazon/aws/triggers/kinesis.py: ########## @@ -0,0 +1,315 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +from __future__ import annotations + +import asyncio +import base64 +import hashlib +import json +from collections.abc import AsyncIterator +from typing import TYPE_CHECKING, Any + +from airflow.providers.amazon.aws.hooks.kinesis import KinesisHook +from airflow.providers.amazon.version_compat import AIRFLOW_V_3_0_PLUS + +if AIRFLOW_V_3_0_PLUS: + from airflow.triggers.base import BaseEventTrigger, TriggerEvent +else: + from airflow.triggers.base import ( # type: ignore + BaseTrigger as BaseEventTrigger, + TriggerEvent, + ) + +if TYPE_CHECKING: + from airflow.providers.amazon.aws.hooks.base_aws import BaseAwsConnection + +_CHECKPOINT_KEY_PREFIX = "kinesis_shard_sequence_numbers" +_ITERATOR_TYPES_WITHOUT_EXTRA_ARGS = frozenset({"LATEST", "TRIM_HORIZON"}) + + +class KinesisTrigger(BaseEventTrigger): + """ + Wait asynchronously for records on an Amazon Kinesis Data Stream. + + The trigger is long-running and emits one event for each non-empty shard response. Record data is + base64-encoded in the event payload and must be decoded by the consumer. Delivery is best-effort: + a triggerer failure can cause records to be repeated or missed around the failure window. + + When Airflow provides an asset state store for a single watched asset, the trigger checkpoints the + last sequence number read from each shard. The same asset and stream identity share one logical cursor; + do not configure multiple watchers that require independent progress for the same stream on one asset. + + :param stream_name: Name of the Kinesis Data Stream to watch. + :param aws_conn_id: AWS connection id. + :param shard_iterator_type: Position used when a shard has no checkpoint. ``LATEST`` only sees records + that arrive after the watcher starts; ``TRIM_HORIZON`` starts from the oldest retained record. + :param batch_size: Maximum records per ``GetRecords`` call and trigger event. Must be between 1 and + 10,000. Record data is base64-encoded before it is stored in the metadata database, so use a + conservative value for large records. + :param waiter_delay: Seconds between complete polling sweeps. Kinesis permits at most five + ``GetRecords`` calls per second per shard. When reading a backlog with ``TRIM_HORIZON``, draining + ``N`` records from one shard takes roughly ``ceil(N / batch_size) * waiter_delay`` seconds when + calls return full batches; with the defaults, 10,000 records take about 1,000 seconds. + :param region_name: AWS region for the Kinesis client. + :param verify: Whether to verify SSL certificates, or the path to a CA bundle. + :param botocore_config: Botocore configuration passed to the Kinesis client. + """ + + def __init__( + self, + stream_name: str, + aws_conn_id: str | None = "aws_default", + shard_iterator_type: str = "LATEST", + batch_size: int = 100, + waiter_delay: int = 10, + region_name: str | None = None, + verify: bool | str | None = None, + botocore_config: dict | None = None, + ) -> None: + super().__init__() + if shard_iterator_type not in _ITERATOR_TYPES_WITHOUT_EXTRA_ARGS: + raise ValueError( + "shard_iterator_type must be one of " + f"{sorted(_ITERATOR_TYPES_WITHOUT_EXTRA_ARGS)}; got {shard_iterator_type!r}" + ) + if not 1 <= batch_size <= 10_000: + raise ValueError("batch_size must be between 1 and 10000") + if waiter_delay < 1: Review Comment: Thanks, I bounded `waiter_delay`, I think it should be fixed. -- This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. To unsubscribe, e-mail: [email protected] For queries about this service, please contact Infrastructure at: [email protected]
