卡夫卡消费者的新获胜者:Scala to Go Insours-
#go #并发性 #kafka #scala

每天3.5亿消息

合着者:Abdulsamet IleriNihat Alim

在本文中,您将阅读一个有关我们如何通过从Scala迁移到Scala的情况下将记忆使用量减少约50%的故事,CPU效率提高了〜%80,而TP提高了〜20。


介绍

Trentyol目前拥有超过1.7亿销售和2亿个现成产品。正如我们所说的那样,在任何时候,通过促销,股票和价格等不同的事件,可能会发生变化或无效。通过变化,我们的意思是数百万,如果需要确切的话,每天约3.5亿。作为Trentyol索引团队,我们需要几乎实时应用这些更改,因为任何延迟都可能导致产品数据不正确地显示。我们甚至不想考虑写错误的价格。

在所有这些更改的中间是我们的应用,perses。在希腊神话中,珀斯是希腊巨人的破坏神。像破坏神一样,我们的应用程序驾驶会破坏旧产品数据并用新版本取代它。

perses设计

从下面的perses的每日吞吐量图中可以看到,Perses每天进行数百万个I/O操作。正确执行它们至关重要,而无需任何延迟才能向用户显示正确的产品数据。为了实现我们拥有高性能应用程序的目的,Perses被设计为多部署应用程序,以便每个部署都可以独立扩展并且不会互相阻止彼此无效。

perses pers'每日吞吐量

从所有这些中,我们可以很容易地说,Perses在Trendyol’s invalidation process中起着重要作用。


我们做出这一迁移决定的原因有几个。

  • 以前,通过迁移我们的其他较小的消费者项目,在资源使用和绩效方面获得更好的结果。
  • 学习和维护GO比为我们的团队维护旧的Scala项目更容易。

我们的实施步骤

我们将以5个步骤解释我们的重新平台旅程。

1.如果没有监视,就无法解决谋杀案。

在Scala Peres中,使用Akka流(v2.12)分批进行了消费操作。您可以在下面的代码块中看到实现。

我们一旦实施了批量消费,我们就测试并比较了这两个(via kafka-go,但结果震惊了我们。尽管Scala Perses在每个POD中一分钟处理13K消息,但GO只能处理4K。 ¢

看到结果后,我们监视了应用程序,并在Kafka producer part中看到了瓶颈。当我们潜入生产者in the Kafka library的代码库时,我们意识到生产操作是同步完成的。这意味着我们要去经纪人获取每条消息,这对表演有害。

2.抓住了杀手!等等,还有更多!

我们决定将生产者实施从同步更改为异步和批处理。消息队列当时包含发送到两个不同主题的消息。

完成实施后,我们立即进行了负载测试,但结果仍然令人失望。 Go Perses在每个POD的一分钟内处理了9K消息,但我们仍然没有达到Scala Perses 13k。 ð

3.跟随面包屑

我们分开了主题的消息频道。当时我们只有两个主题,因此我们每通道创建了两个消息频道和一个goroutine。

此更改后,我们尝试了不同的批量大小和批处理持续时间参数以实现最佳性能。几次尝试后,我们看到批处理大小的最佳值为500,批处理持续时间为500ms。当我们使用36个分区和12个POD的最终参数再次进行负载测试时,我们在10分钟内使用136K吞吐量处理了1.094.800的消息。 Scala的性能更高,其156K吞吐量可以在8分钟内处理相同数量的消息。

4.这不是死胡同

我们正在使用Uber’s automaxprocs库进行其他GO项目之一,并看到了性能提高,因此我们也想尝试使用它来进行perses。不幸的是,吞吐量没有更改,因为珀斯比CPU绑定更具I/O结合。 ð¢

5.胜利的甜味

因为我们仍然无法获得理想的结果,所以我们决定专注于建筑设计以找出该怎么做。

在体系结构的第一部分中,goroutine不断地倾听主题,并使用内部消息队列获取新消息。我们认为我们可以尝试tuning the queue size here,因此我们决定配置它。

在架构的第二部分中,在获取的消息来到频道之后,Goroutines处理它们。在这里,我们认为我们可以调整channel buffer size和工人的数量。

更改调谐过程中的配置后,我们对结果感到惊讶。您可以在下表中看到我们的试验及其结果。

您可以在下面看到最出色的Scala pers和Go Perses结果的比较。

scala pers pers pers pers plast

go pers pers pers pers pers pers

结论

由于迁移过程,我们优化了以下资源

  • 内存使用情况:降低50%(从1.127 GB到0.622 GB)
  • CPU:〜80%效率(从1.72到0.379)
  • TP:〜增加20%(从156K到189k)

我们很高兴对在高负载下有效的多个部署代码库进行优化。

我们学到了什么!

  • 我们意识到当它帮助我们解决Kafka生产者问题时,监视的重要性。
  • 通过潜入我们的项目设计,我们意识到仍然需要调整一些关键参数以提高性能。

感谢您阅读ðð7

我们在kafka-konsumer开放了一些with a built-in retry manager的经验。我们很高兴获得您的反馈。

感谢Kutlu AraslıEmre OdabasMert Bulut的支持ð

如果您有兴趣加入我们的团队,则可以申请后端开发人员角色或我们当前的任何open positions