Architecture 如何在系统中的节点之间连续分发一组固定的标签?

Architecture 如何在系统中的节点之间连续分发一组固定的标签?,architecture,scalability,distributed-computing,Architecture,Scalability,Distributed Computing,我不确定这样的设计问题是否适合这里,但据我所知,这并不是完全禁止的 在我的系统中,有许多节点可以下载并处理大型文件。每个文件都由唯一的标签标识。基于该标签,节点可以构建适当的URL并下载相应的文件。这些文件会随着时间的推移(经常)发生变化,因此节点必须不断下载并继续处理 在我当前的架构中,我有不同的标签集(不重叠)分配给不同的节点。但这不是一个理想的解决方案,因为文件的大小会发生变化,所以工作并不总是均匀分布的。此外,由于我需要为每个处理节点提供热备份以进行故障转移,因此处理容错性也更加复杂 一

我不确定这样的设计问题是否适合这里,但据我所知,这并不是完全禁止的

在我的系统中,有许多节点可以下载并处理大型文件。每个文件都由唯一的标签标识。基于该标签,节点可以构建适当的URL并下载相应的文件。这些文件会随着时间的推移(经常)发生变化,因此节点必须不断下载并继续处理

在我当前的架构中,我有不同的标签集(不重叠)分配给不同的节点。但这不是一个理想的解决方案,因为文件的大小会发生变化,所以工作并不总是均匀分布的。此外,由于我需要为每个处理节点提供热备份以进行故障转移,因此处理容错性也更加复杂

一个可能的解决方案是,有一个标签的队列(FIFO),每个节点将从头中取出一个标签,进行它的处理,然后将它返回到队列的末尾。 此解决方案解决了工作分布均匀的问题,但又引入了另一个容错问题。如果一个节点在处理过程中失败,那么我们将丢失标签,这在这个特定的系统中是不可接受的。现在,我们可以有一个进程来监视队列的内容,如果它有所有的标签


但我正在寻找一个更优雅、更合理的解决方案,它可以解决这个特定系统中工作分布均匀和容错性不太复杂的问题。有什么想法吗?

我会继续使用队列方法,但会通过确认机制添加容错功能,例如在(请参阅)或(请参阅,在“消息确认”下)中找到的机制

其思想是,当消费者从队列中提取某个项目时,该项目不会从队列中删除。只有在消费者确认成功处理该项目后,该项目才会从队列中删除。如果消费者提取某个项目,并且在某个规定的时间段内未确认,则该消息将在t中再次可用他排队,另一个消费者将处理该消息

请注意,这可能会造成同一消息被处理两次的情况。如果处理操作是幂等的(即,执行两次操作会产生与执行一次操作相同的结果),则可以这样做,但如果不是,则需要添加自定义保护来处理此情况


简而言之,如果您关心可靠性,请使用上述可用的可靠队列服务之一。

我将继续使用队列方法,但通过确认机制添加容错功能,如(请参阅)或(请参阅“消息确认”下的)中的机制

其思想是,当消费者从队列中提取项目时,该项目不会从队列中移除。只有在消费者确认成功处理该项目后,才会将其从队列中删除。如果消费者提取一个项目,并且在特定的规定时间内没有确认,则消息将再次在队列中可用,而另一个消费者将处理该消息

请注意,这可能会造成同一消息被处理两次的情况。这是可以的。如果处理操作是幂等的(即,两次操作产生的结果与一次操作相同),但如果不是,则需要添加自定义保护来处理这种情况


简而言之,如果您担心可靠性,请使用上述可用的可靠队列服务之一。

>我们丢失了标签,这在这个特定系统中是不可接受的-如何将标签添加到系统中?如果node未能下载,为什么它会丢失?在这种情况下,它不是没有下载吗?>我们丢失了标签,这在这个特定的系统中是不可接受的-如何将标签添加到系统中?如果node未能下载它,它为什么会丢失?在这种情况下,它不是没有下载吗?