当前位置: 首页 > 知识库问答 >
问题:

Apache Kafka是否适合用作无序任务队列?

冀崇凛
2023-03-14

Kafka根据制作者分配的分区将传入的消息分成多个分区。来自分区的消息随后被不同使用者组中的使用者消费。

这种体系结构使我对使用Kafka作为工作/任务队列保持警惕,因为我必须在生产时指定分区,这间接限制了哪些使用者可以在其上工作,因为一个分区只发送给一个使用者组中的一个使用者。我宁愿不要提前指定分区,这样任何一个可以接受该任务的使用者都可以这样做。有没有一种方法可以在Kafka体系结构中构造分区/生产者,在Kafka体系结构中,任务可以由下一个可用的使用者拉动,而不必在工作产生时通过选择分区提前对工作进行拆分

在本主题中只使用一个分区会将所有任务放在同一个队列中,但使用者的数量被限制为每个使用者组中的1个,因此每个使用者必须位于不同的组中。然后所有的任务都分配给每个消费者组,这不是我要找的那种工作队列。

Apache Kafka是否适合用作任务队列?

共有1个答案

吴开宇
2023-03-14

对任务队列使用Kafka是个坏主意。用RabbitMQ代替,它做得更好,更优雅。

尽管您可以将Kafka用于任务队列,但您会遇到一些问题:Kafka不允许多个使用者(按设计)使用单个分区,因此,例如,如果一个分区被多个任务填满,而拥有该分区的使用者很忙,那么该分区中的任务将会“饿死”。这也意味着主题中任务的消耗顺序与任务产生的顺序不相同,如果任务需要按特定顺序消耗,可能会导致严重的问题(在Kafka中,为了完全实现您必须只有一个使用者和一个分区--这意味着仅由一个节点进行串行消耗。如果您有多个使用者和多个分区,则在主题级别中任务消耗的顺序将无法得到保证)。

事实上,Kafka的主题并不是计算机科学中的队列。队列意味着先进先出--这不是你在主题层面的Kafka中得到的。

另一个问题是很难动态更改分区的数量。添加或删除新员工应是动态的。如果您想确保新的工作者将在Kakfa中获得任务,您将不得不将分区号设置为最大可能的工作者。这不够优雅。

所以底线--改用RabbitMQ或其他队列。

在说了所有这些之后,Samza(由linkedin提供)正在使用kafka作为某种基于流的任务队列:Samza

编辑:尺度考虑:我忘了提到Kakfa是一个大数据/大尺度工具。如果你的就业率很高,那么Kafka可能是你的好选择,尽管我前面写过,因为处理巨大的规模是非常有挑战性的,而Kafka在这方面做得很好。如果我们谈论的是较小的规模(例如,每秒几个剂量/数百个工作),那么与RabbitMQ相比,Kafka也是一个糟糕的选择。

 类似资料:
  • 问题内容: 我需要知道laravel 5队列管理系统是否适合大型项目(拥有约100.000用户)。我想每天一次执行类似消息传递(不是垃圾邮件:))用户的操作。 Redis是否足以胜任这项工作(排队)?还是最好使用专门用于排队的库(例如beantalkd)? 问题答案: 为了公平起见,并尝试对此问题发布合理的答案,我们应该考虑以下几点: 订阅人数 要交付的内容 运行同时队列所需的系统资源 100,0

  • 我发现Http 207可以用于批量插入/删除/。。。等等。从业务角度来看,我们可能会插入多个项目,并且部分成功。 我想知道如果我们有API Post调用一些外部服务,是否同样适用? 业务场景示例: 我们有正在创建订单的HttpPost终结点。 现在我们假设,除了创建订单之外,这个endpoint还将调用外部服务来打印该订单的标签,另一个endpoint将通过REST向外部第三方系统发送某种确认。

  • 问题内容: 正如前面所讨论的,确认电子邮件应该有一个独特的,(几乎)未猜测的代码- 基本上是一个一次性密码 --in确认链接。 UUID.randomUUID()文档说: 使用加密强度高的伪随机数生成器生成UUID。 这是否意味着在正确实现的JVM中的UUID随机生成器适合用作唯一的(实际上)不可猜测的OTP? 问题答案: 否。 根据UUID规范: 不要以为UUID很难猜测;例如,它们不应用作安全

  • 我正试图通过服务提供者API在运行时由加载一个jar。然而,结果却是失败的。 以下是我所做的: null 我尝试了抽象类而不是我的SPI接口的接口,当我无法实现我的目标时,将它改回接口; 我已尝试获取资源并将我的作为输入参数传递,但没有工作; 我尝试了Apache实现的,但它也找不到适当的资源; 我的问题是如何通过从外部jar加载资源?SPI可能是一种解决方案吗?

  • 问题内容: 我想使用需要不时进行排序的数据结构。数据结构的大小几乎不会超过1000个项目。 哪一个是更好的- 或者? 哪种排序算法更好用? 问题答案: 在Java 7之前,它没有什么区别,因为它将列表的内容转储到数组中。 在Java 8中,使用会稍微快一些,因为它将调用并具有专门的版本,该版本可以直接对后备数组进行排序,从而保存副本。 因此,根据Java版本的不同,底线更好,因为它可以提供相似或更

  • 我已经设置了一些服务和入口来尝试SSL终止。我对作为后端的负载平衡器和节点端口服务没有任何问题,但它与ClusterIP服务完全不起作用。 尽管入口的后端被描述为正常,但我得到的HTTP错误不是来自我的应用程序。 HTTP错误如下: 我的问题很简单:它应该与ClusterIP服务一起工作吗?如果它应该或多或少地写在文档中,我应该在哪里解决这个问题? 非常感谢。