我有一个可以转换XML文档的服务。
它从N个队列中接收消息,并且根据从哪个队列中获取消息来运行转换之一。
现在,我将其重构为在Docker容器中运行的微服务。
我想我可以通过两种方式做到这一点,但我不知道在使用容器时哪种方法更好。
我正在.NET Core 2.2中执行此操作。我还不知道我们是否会在生产中使用docker-swarm或kubernetes。
我看到的优点:
所需的代码更改次数更少,而docker-compose更简单-一种服务而不是N。仅一个配置文件。
缺点:
如果对其中一种转换有更高的要求,或者有
更高的优先级我不能只是扩展容器。新副本
将从所有队列中提取消息,而不仅仅是我要扩展的消息。
他们每个人都会听一个队列并进行一次转换。我可以重构它,以便
唯一的代码差异在于注册服务时的启动。根据配置,我可以
注册IXmlTransformers之一。
优点:
我可以扩展一个队列转换。
如果其中一个转换出现问题,并且容器重新启动,则所有其他转换将正常工作。
我认为它更干净-一幅图像正在完成一次转换-单一责任规则。
缺点:
因此,在某些环境中,大约会有10种不同的转换
将有很多配置文件-可能使用卷添加到每个正在运行的容器中?
Docker的撰写将非常漫长。
有什么更好的方法呢?也许还有其他更好的选择?
编辑:
我想我不清楚我的问题,所以我试图更好地解释它。
在这两个选项中,我都有一个容器镜像。区别在于运行时。只有配置会有所不同。
假设我正在使用XSLT将XML转换为CSV或将XML转换为XML。
CSV格式和XSLT是配置的一部分。我可以有许多CSV格式(许多配置)和许多不同的XSLT(还是许多配置)
因此,我有两个ITransformer实现(CSV,XSLT),并且它们读取配置以运行其转换。
我的问题是,为一个配置使用一个正在运行的容器实例还是将所有这些配置放入一个监视N个队列或监视一个队列并读取某种元数据来确定要运行的转换的容器是否更好。
最佳答案
The cons: If there is a higher demand for one of transformations or if it has higher priority I can't just scale it's container. New replicas would be pulling messages from all queues instead of just one that I want to scale for.
为什么所有队列都被拉出是一个问题?是因为您通常在队列中有大量积压的订单,还是害怕提供过多的容量?当所有队列都处于最新状态且正在处理时,无论如何都应该只选择要扩展的一个队列。
万一您无法做到这一点,我仍然会使用可从所有队列中提取的通用服务,但尝试根据队列长度,队列条目的时间戳或您需要的任何适当条件来合并加权或其他规则集以什么优先级拉出哪个队列。如果公开了此逻辑的正确结果参数,则如果该参数太落后,它也可以用于自动扩展群集。
根据队列进行手动缩放的替代方法听起来可能会成为管理员的噩梦。
关于docker - 一项微服务执行许多转换还是许多微服务执行一项转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54179638/