【发布时间】:2019-01-15 18:12:33
【问题描述】:
我有一个转换 XML 文档的服务。 它从 N 个队列接收消息,并根据从哪个队列获取消息,运行其中一种转换。
现在我将它重构为在 docker 容器中运行的微服务。 我认为我可以通过两种方式做到这一点,但我不知道在使用容器时哪种方式会更好。
我在 .NET Core 2.2 中执行此操作。我还不知道我们是否会在生产环境中使用 docker-swarm 或 kubernetes。
-
我可以将大部分代码保留为现在的样子,并将其作为一个容器运行。 AppSettings.config 将包含每个队列转换对的设置。
我看到的优点: 需要更少的代码更改和更简单的 docker-compose - 一项服务而不是 N。只有一个配置文件。
缺点: 如果对其中一种转换有更高的需求,或者它有 更高的优先级我不能只是扩展它的容器。新副本 将从所有队列中提取消息,而不仅仅是我想要扩展的队列。
-
我可以重构代码并构建 N 个不同的容器映像。 他们每个人都会听一个队列并运行一个转换。我可以重构它,以便 代码的唯一区别在于注册服务时的启动。根据配置我可以 注册 IXmlTransformers 之一。
优点: 我可以扩展一个队列转换。 如果其中一个转换出现问题并且容器重新启动,则所有其他转换都将正常工作。 我认为它更清洁 - 一个图像进行一个转换 - 单一责任规则。
缺点: 因此在某些环境中会有大约 10 种不同的转换 会有很多配置文件 - 可能使用卷添加到每个正在运行的容器中? Docker compose 会很长。
有什么更好的方法来做到这一点?或者也许还有其他更好的选择?
编辑:
我认为我的问题并不清楚,所以我尝试更好地解释它。 在这两个选项中,我都会有一个容器图像。区别在于运行时。只有配置会有所不同。 假设我正在使用 XSLT 将 XML 转换为 CSV 或 XML 转换为 XML。 CSV 格式和 XSLT 是配置的一部分。我可以有许多 CSV 格式(许多配置)和许多不同的 XSLT(同样是许多配置) 所以我有两个 ITransformer 实现(CSV、XSLT),它们读取配置来运行它们的转换。 我的问题是,最好为一个配置运行一个容器实例,还是将所有这些配置放入一个容器中,该容器监控 N 个队列或监控一个队列并读取某种元数据来决定运行哪种转换。
【问题讨论】:
-
先做,但是暴露队列配置,这样你就可以启动一个只监听这个队列的容器(或者在所有其他队列之前处理来自这个队列的消息)
-
这里有很大的“视情况而定”。正如您所指出的,可扩展性和单一职责原则会建议选项 2,但请尝试考虑有多少人将维护这些服务,他们有多少共同点以及他们可能多久改变一次经历所有这些,显然运行 N 服务的成本与 1 相比。如果它是一个小项目或不太可能改变,我会选择选项 1,只要它不会变得非常复杂。
-
我认为我使用了错误的词汇。我在选项 2 中说过,我将构建 N 个不同的容器映像。但我的意思是,在运行时我会运行其中 N 个,但它们会共享图像。只有配置会有所不同。在选项 1 中,将有一个图像和一个正在运行的容器。
标签: docker kubernetes .net-core microservices docker-swarm