我在几个环境(dev、test、stage和preprod)上部署了一个消费者应用程序。它们都在消费相同的Kafka主题(意味着工作方式类似于同一主题的多个消费者)。
我对所有环境(dev、test、stage和preprod)都有单独的生产者应用程序。在有效负载中生成消息时,它有一个字段来提到生产者的ENV。
我们的要求是- Dev ENV的消费者应该只消费Dev ENV的生产者应用程序的消息。其他环境也是如此。
我的问题是-我应该使用消费者端过滤吗?这能保证我们的要求吗?它将如何确保我们的需求?
提前谢谢。
发布于 2020-03-11 23:57:01
对于如何处理此需求,您有多种选择。然而,我认为一般来说,为不同的环境设置一个主题并不是一个好主意。考虑到数据保护和访问权限,这听起来不像是一个好的设计。
无论如何,我看到了以下选项。
测试选项1:使用环境(开发,测试,...)作为主题的关键字,并告诉消费者按关键字过滤。
选项2:写入生产者将数据从每个环境发送到单独的分区,并告诉每个环境的消费者仅从特定分区读取数据。
但在实现选项2之前,我宁愿做选项3:为每个环境都有一个主题,让生产者/消费者从不同的主题中写入/读取。
发布于 2020-03-12 00:56:30
我同意mike的观点,即跨环境使用单一主题不是一个好主意。
但是,如果您打算这样做,那么我建议您使用流处理器为您的用户创建单独的主题。您可以在Kafka Streams、ksqlDB等中执行此操作。
ksqlDB将如下所示:
-- Declare stream over existing topic
CREATE STREAM FOO_ALL_ENVS WITH (KAFKA_TOPIC='my_source_topic', VALUE_FORMAT='AVRO');
-- Create derived stream & new topic populated with message just for DEV
-- You can explicitly provide the target Kafka topic name.
CREATE STREAM FOO_DEV WITH (KAFKA_TOPIC='foo_dev') AS SELECT * FROM FOO_ALL_ENVS WHERE ENV='DEV';
-- Create derived stream & new topic populated with message just for PROD
-- If you don't specify a Kafka topic name it will inherit from the
-- stream name (i.e. `FOO_PROD`)
CREATE STREAM FOO_PROD AS SELECT * FROM FOO_ALL_ENVS WHERE ENV='PROD';
-- etc现在您让您的生产者编写单个主题(如果您必须这样做),但是您的消费者可以使用特定于其环境的主题。ksqlDB语句是连续查询,因此将处理源主题中的所有现有消息以及到达的每条新消息。
https://stackoverflow.com/questions/60639846
复制相似问题