asynchronous - 如何均衡处理多个并发任务?

标签 asynchronous apache-kafka parallel-processing rabbitmq concurrent-processing

问题

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

在理想的实现中 ,我们应该均匀地处理所有任务,无论其大小。处理服务的容量分布在所有事件任务中。并且即使集群负载很重,我们总是明白,已经到达的新任务几乎可以立即开始处理,至少在所有其他任务的处理结束之前。 enter image description here

解决方案

相反,我们想要一个看起来更像下图的架构,其中每个客户和端点的组合都有单独的队列。这种架构为我们提供了更好的隔离,以及基于每个客户动态调整吞吐量的能力。
enter image description here
生产者这边

  • 任务来自客户端
  • 立即为此任务创建一个队列
  • 将所有消息发送到此队列

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


  • 问题

    这样的问题有什么通用的解决方案吗?使用 RabbitMQ 或任何其他工具。历史上,我们在项目中使用 Kafka,所以如果有任何方法使用 - 这很了不起,但我们可以使用任何技术来解决这个问题。

    最佳答案

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

    关于asynchronous - 如何均衡处理多个并发任务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62193451/

    相关文章:

    matlab - 我可以测量 matlab 中并行化的加速比吗?

    c++ - 忙等待现代处理器的优缺点

    在 dmapply(ddR 包)中运行聚合函数

    javascript - 如何同时异步触发多个 API 调用?

    javascript - Node js套接字解释

    apache-kafka - 如何在消费者组kafka中动态添加消费者

    java - 清除单元测试的kafka主题

    c# - 在 TaskCompletionSource.Task(已调用 .SetResult)上调用 ContinueWith 方法是否安全?

    c# - 取消异步检索 URL 的任务

    apache-kafka - 无法使用 CONDUKTOR UI 连接到 Kafka