现在,我有这样的config.yaml
kafka:
bootstrap_servers: "${BOOTSTRAP_SERVERS}"
group: "${GROUP_NAME_1}"
topics:
- name: "${TOPIC_1}"
consumers: "${CONSUMER_NUMBER_FOR_TOPIC_1}"
我的 Dynaconf 工作如下:
from dynaconf import Dynaconf
from dynaconf.validator import Validator
settings = Dynaconf(
envvar_prefix="service-a",
settings_files=['config.yaml'],
load_dotenv=True,
dotenv_path='.env',
validators=[
Validator(
"server.port", must_exist=True
)
]
)
然后,设置将像
一样使用def start_kafka_consumers():
topics = settings.kafka.topics
threads = []
for topic in topics:
topic_name = topic['name']
consumer_count = topic['consumers']
logger.info(f"{consumer_count} consumers will be started for topic {topic_name}")
for _ in range(consumer_count):
thread = threading.Thread(target=start_consumer_for_topic, args=(topic_name,))
thread.start()
threads.append(thread)
使用 config.yaml 文件的美妙之处在于我可以使用层次结构对一些属性进行分组。例如,我可以将主题“abc”与 1 个消费者分组在主题下。之后,我可以简单地添加主题“def”和 2 个消费者。并且代码将动态加载和使用它们。
我想使用占位符和 .env 文件来定义实际值的原因是,我想在本地运行它并使用相应的值。然后,稍后,当它上传到GCP云运行时,我可以使用环境变量(例如秘密管理器)来覆盖该值。
但是,${} 占位符无法按预期工作。 Dynaconf 不使用 .env 文件值来替换占位符文本。有什么建议吗?谢谢。
我找到了解决方案,我可以使用Dynaconf加载config.yaml文件,该文件将加载env变量名称。然后使用该名称从 .env 文件中读取该变量。我不确定是否还有其他方法。
正常情况下,不值得。但正如我在问题中提到的,对于我的情况,config.yaml 文件的层次结构为我提供了一种灵活的方法来实例化多个主题的使用者。