web-dev-qa-db-ja.com

kafka-pythonを使用して複数のkafkaワイルドカードパターンのリストを購読する方法は?

以下に示すように、Kafkaワイルドカードを使用したパターンを使用してサブスクライブしています。ワイルドカードは動的な顧客IDを表します。

consumer.subscribe(pattern='customer.*.validations')

トピック文字列から顧客IDを抽出できるので、これはうまく機能します。しかし、今度は機能を拡張して、少し異なる目的で同様のトピックを聞く必要があります。それをcustomer.*.additional-validationsと呼びましょう。多くの機能が共有されているため、コードは同じプロジェクトに存在する必要がありますが、キューのタイプに基づいて別のパスを使用できるようにする必要があります。

Kafkaのドキュメント では、一連のトピックをサブスクライブすることが可能であることがわかります。ただし、これらはハードコードされた文字列です。柔軟性を考慮したパターンではありません。

>>> # Deserialize msgpack-encoded values
>>> consumer = KafkaConsumer(value_deserializer=msgpack.loads)
>>> consumer.subscribe(['msgpackfoo'])
>>> for msg in consumer:
...     assert isinstance(msg.value, dict)

それで、どうにかして2つの組み合わせを実行することが可能であるかどうか疑問に思っていますか?このような種類(非機能):

consumer.subscribe(pattern=['customer.*.validations', 'customer.*.additional-validations'])
13
Ben Harrison

KafkaConsumerコードでは、トピックのリストまたはパターンをサポートしています。

https://github.com/dpkp/kafka-python/blob/68c8fa4ad01f8fef38708f257cb1c261cfac01ab/kafka/consumer/group.py#L717

   def subscribe(self, topics=(), pattern=None, listener=None):
        """Subscribe to a list of topics, or a topic regex pattern
        Partitions will be dynamically assigned via a group coordinator.
        Topic subscriptions are not incremental: this list will replace the
        current assignment (if there is one).

したがって、OR条件を|を使用して正規表現を作成できます。これは、内部でreモジュールを使用して一致するため、複数の動的トピックの正規表現のサブスクライブとして機能します。 。

(customer.*.validations)|(customer.*.additional-validations)

17
DhruvPathak