每天3.5亿消息
合着者:Abdulsamet Ileri,Nihat Alim
在本文中,您将阅读一个有关我们如何通过从Scala迁移到Scala的情况下将记忆使用量减少约50%的故事,CPU效率提高了〜%80,而TP提高了〜20。
介绍
Trentyol目前拥有超过1.7亿销售和2亿个现成产品。正如我们所说的那样,在任何时候,通过促销,股票和价格等不同的事件,可能会发生变化或无效。通过变化,我们的意思是数百万,如果需要确切的话,每天约3.5亿。作为Trentyol索引团队,我们需要几乎实时应用这些更改,因为任何延迟都可能导致产品数据不正确地显示。我们甚至不想考虑写错误的价格。
在所有这些更改的中间是我们的应用,perses。在希腊神话中,珀斯是希腊巨人的破坏神。像破坏神一样,我们的应用程序驾驶会破坏旧产品数据并用新版本取代它。
从下面的perses的每日吞吐量图中可以看到,Perses每天进行数百万个I/O操作。正确执行它们至关重要,而无需任何延迟才能向用户显示正确的产品数据。为了实现我们拥有高性能应用程序的目的,Perses被设计为多部署应用程序,以便每个部署都可以独立扩展并且不会互相阻止彼此无效。
从所有这些中,我们可以很容易地说,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结果的比较。
结论
由于迁移过程,我们优化了以下资源
- 内存使用情况:降低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 Odabas和Mert Bulut的支持ð
如果您有兴趣加入我们的团队,则可以申请后端开发人员角色或我们当前的任何open positions。