我有一个可以转换XML文档的服务。 它从N个队列中接收消息,并根据从哪个队列中获取消息来运行转换之一。
现在,我将其重构为在docker容器中运行的微服务。 我想我可以通过两种方式做到这一点,但我不知道在使用容器时哪种方法更好。
我正在.NET Core 2.2中执行此操作。我还不知道我们是否会在生产中使用docker-swarm或kubernetes。
我可以像现在一样保留大部分代码,并将其作为一个容器运行。 AppSettings.config将包含每个队列转换对的设置。
我看到的优点: 所需的代码更改次数更少,而docker-compose更简单-一种服务而不是N。仅一个配置文件。
缺点: 如果对其中一种转换有更高的要求,或者有 更高的优先级我不能只是扩展容器。新副本 将从所有队列中提取消息,而不仅仅是我要扩展的消息。
我可以重构代码并构建N个不同的容器映像。 他们每个人都会听一个队列并进行一次转换。我可以重构它,以便 唯一的代码差异在于注册服务时的启动。根据配置,我可以 注册IXmlTransformers之一。
优点: 我可以扩展一个队列转换。 如果其中一个转换存在问题,并且容器重新启动,则所有其他转换将正常工作。 我认为它更干净-一幅图像正在完成一次转换-单一责任规则。
缺点: 因此,在某些环境中,大约会有10种不同的转换 将有很多配置文件-可能使用卷添加到每个正在运行的容器中? Docker的撰写将非常漫长。
有什么更好的方法呢?也许还有其他更好的选择?
编辑:
我想我不清楚我的问题,所以我试图更好地解释它。 在这两个选项中,我都会有一个容器图像。区别在于运行时。只有配置会有所不同。 假设我正在使用XSLT将XML转换为CSV或将XML转换为XML。 CSV格式和XSLT是配置的一部分。我可以有许多CSV格式(许多配置)和许多不同的XSLT(还是许多配置) 因此,我有两个ITransformer实现(CSV,XSLT),并且它们读取配置以运行其转换。 我的问题是,为一个配置使用一个正在运行的容器实例还是将所有这些配置放入一个监视N个队列或监视一个队列并读取某种元数据来决定要运行哪个转换的容器是否更好。
答案 0 :(得分:1)
缺点:如果对其中一种转换有更高的要求,或者 它具有更高的优先级,我不能仅仅缩放它的容器。新副本 将从所有队列中提取消息,而不仅仅是我 想扩大规模。
为什么所有队列都被拉出是一个问题?是因为您通常在队列中有大量积压的订单,还是害怕提供过多的容量?当所有队列都在处理最新状态时,无论如何应该只选择要扩展的一个队列。
如果您无法做到这一点,我仍然会使用可以从所有队列中提取的通用服务,但是请尝试根据队列长度,队列条目的时间戳或适合您的任何内容来合并加权或其他规则集情况来规范以什么优先级拉动哪个队列。如果公开了此逻辑的正确结果参数,那么如果该参数太落后,它也可以用于自动扩展群集。
基于队列的手动缩放的替代方法听起来可能会成为管理员的噩梦。
答案 1 :(得分:1)
当您具有应在队列或事件名下运行的作业的上下文时,在具有相同配置的多个容器中使用相同代码也不是问题。我不知道您的设置,但是我会避免将一个容器绑定到一个队列。在可以避免使用状态的情况下,不应使用状态来部署容器。
根据文件和金钱的数量,您还可以将Amazon Lambda和S3结合使用。当您使用S3和不同的存储桶名称时,不需要任何消息排队或拥有自己的基础结构,这些名称将触发上载的lambda函数。这不是更好的方法,只是一种不同的方法,几乎不取决于您的需求。它可能比您的方法更便宜或更昂贵,这也取决于您的用例。