Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asynchronous 如何平衡处理多个同时进行的任务? 问题_Asynchronous_Apache Kafka_Parallel Processing_Rabbitmq_Concurrent Processing - Fatal编程技术网

Asynchronous 如何平衡处理多个同时进行的任务? 问题

Asynchronous 如何平衡处理多个同时进行的任务? 问题,asynchronous,apache-kafka,parallel-processing,rabbitmq,concurrent-processing,Asynchronous,Apache Kafka,Parallel Processing,Rabbitmq,Concurrent Processing,我们的处理服务为用户界面、API和内部客户端提供服务,并监听来自卡夫卡的命令。 很少有API客户端可能会在短时间内创建大量生成任务(一个任务是N条消息)。使用Kafka,我们无法控制命令的分发,因为每个命令都到达一个处理实例(aka worker)使用的分区。因此,在处理API请求时,UI请求可能会等待太长时间 在理想的实现中我们应该平均处理所有任务,而不管任务大小。处理服务的容量分布在所有活动任务中。而且,即使集群负载很重,我们始终知道,已经到达的新任务几乎可以立即开始处理,至少在所有其他任务

我们的处理服务为用户界面、API和内部客户端提供服务,并监听来自卡夫卡的命令。 很少有API客户端可能会在短时间内创建大量生成任务(一个任务是N条消息)。使用Kafka,我们无法控制命令的分发,因为每个命令都到达一个处理实例(aka worker)使用的分区。因此,在处理API请求时,UI请求可能会等待太长时间

在理想的实现中我们应该平均处理所有任务,而不管任务大小。处理服务的容量分布在所有活动任务中。而且,即使集群负载很重,我们始终知道,已经到达的新任务几乎可以立即开始处理,至少在所有其他任务的处理结束之前


解决方案 相反,我们需要一个更像下图的体系结构,其中每个客户和端点的组合都有单独的队列。这种体系结构为我们提供了更好的隔离,以及根据每个客户动态调整吞吐量的能力。 在制作人方面

  • 任务来自客户机
  • 立即为此任务创建队列
  • 将所有消息发送到此队列
消费者方面

  • 在一个过程中,您不断更新队列列表
  • 在其他流程中,您遵循此列表并使用来自每个队列的消息(例如1条消息)
  • 规模消费者

问题
这样的问题有什么共同的解决办法吗?使用RabbitMQ或任何其他工具。历史上,我们在项目中使用Kafka,因此如果有任何方法使用-这是令人惊讶的,但我们可以使用任何技术来解决问题。

正如我所理解的问题,您希望使用动态分配的队列与客户创建请求隔离,这将允许每个客户任务独立执行。这个问题看起来类似于网络中的问题

动态分配队列比较困难。这还可能导致队列数量激增,从而给基础架构带来负担。此外,一些队列可能是空的或负载很小。RabbitMQ在这里没有帮助,它是一个与kafka协议不同的队列

一种替代方法是使用kafka中的自定义分区器,它可以查看分区负载,并基于该负载平衡任务。如果任务本质上是独立的,并且worker中没有状态存储,那么这种方法是有效的


另一种选择是在客户级别实现负载平衡。在这种情况下,您可以为一组客户选择一组专用的预定义队列。具有特定ID的客户将得到一组队列的服务。这样做的缺点是,某些队列的负载可能比其他队列小。这个解决方案类似于网络,

我的理解是,对消息进行分区并不能确保均衡的负载平衡。我认为,您应该避免创建过度工程和一些自定义的东西,这些东西将出现在Kafka分区器之上,而应该考虑一个好的分区键,它将允许您高效地使用Kafka。

为什么不使用spark来执行任务中的消息?我的想法是,每个工作者创建一个spark上下文,然后将消息并行化。映射的函数可以基于用户使用的卡夫卡主题。但是,我怀疑您的队列中可能包含混合了消息、UI、API调用等的任务。这将导致更复杂的映射函数。如果您没有使用独立集群,并且正在使用纱线或类似的东西,则可以更改spark master正在使用的排队方法

尝试阅读有关ApachePulsar的文章。与Kafka相比,它有许多优点,其中之一是自动负载平衡。阅读:。