首页
Preview

Kafka 搜索

我写的每篇文章都提到了 Kafka 在 Trendyol 中的无处不在。Trendyol 有很多技术栈。每个后端团队都使用了很多服务,但最重要的是 Kafka。

每次,搜索都是一个问题。现在,有一些解决方案可以在 Kafka 中进行搜索。首先,让我们来看看它们。

每个事件都传输到 ElasticSearch:

  • 你可以通过 Kafka 连接器传输事件。
  • 乍一看似乎是更好的选择,但你必须维护一个新的大型服务。此外,你还要分配一些集群资源,并确保每个事件都被插入到 ElasticSearch 中。
  • 当你无法在 ElasticSearch 中找到事件时。你会怀疑自己,"如果它没有被传递怎么办?"

Offset Explorer

  • 如果你没有任何访问生产环境的问题,可以在本地安装并使用它。但是,它太慢了。
  • 根据我的经验,从中获取搜索结果需要约 4 分钟,并且在每个步骤中都会冻结。

Kowl 或其他:

  • 你可以用它进行搜索,但是,当你开始搜索具有大量消息的主题时,它们可能无法多次响应用户。
  • 根据我的经验,从中获取搜索结果只需要不到一分钟。在获取结果期间,它们崩溃了一次。

问题在哪里?

如果主题具有高消息计数或多个用户同时使用,则上述应用程序或方法运行缓慢。有时它们无法响应 UI 并崩溃,因为在具有 10 亿条消息的主题中搜索任何单词是一个长期的过程,而且它是 CPU 绑定过程。它会消耗每个 CPU 资源。

另一个问题是主题在哪里?Trendyol 使用多个集群。当我们在主题中搜索单词时,我们必须知道哪个集群拥有该主题,否则我们无法搜索。当你使用上述应用程序时,必须逐个集群地搜索。

我们试图在这里实现什么?

我为 Kafka 中的事件搜索开发了一个宏服务。你可以在指定的主题中搜索任何键或值,而无需冻结、崩溃或缓慢。

这里的不同之处在哪里?

这里,我们将搜索过程和服务过程分开。搜索是一个真正消耗 CPU 资源的过程。两个应用程序(API/搜索消费者)正在使用 Kafka 和 Redis。当我们请求 API 开始搜索时,我们将进程传递给搜索消费者。我们在搜索期间不使用 API 的资源。因此,搜索过程不会影响 API。

它是如何工作的:

我发送了此请求 http://localhost:8080/search?topicName=product.spda.enricher.invalidateListing.1&value=843078897 并刷新页面以在几秒钟内获得结果

API 和消费者通过 Redis 共享搜索数据。当消费者开始在主题中搜索值并找到数据时,将数据保存到 Redis 中。API 从 Redis 获取数据并向用户呈现数据。

API 设计

首先,让我们谈谈 API;有两种搜索方案。

一个是“开始搜索”

API 提供了如果是第一次搜索请求,则发送一个事件到 Kafka 以在消费者中开始搜索。

另一个是“获取结果”

API 提供了如果之前已经开始搜索,则从 Redis 中获取结果并将其返回给用户。

API UML 顺序图:

消费者设计

其次,让我们谈谈消费者;有一个搜索方案。

这是“开始搜索”

在用户指定的主题中以并行方式开始搜索。如果任何事件包含用户指定的关键字,则将其插入到 Redis 中。

消费者 UML 顺序图:

关于性能

我进行了 10 亿个事件的基准测试。如果你想了解结果,可以在此处阅读此文章。

Kafka 消费者的性能:10 亿条消息

“说得好听没用,给我看代码。” - Linus Torvalds

API 链接:https://github.com/ferditatlisu/kafka-search-api-python消费者链接:https://github.com/ferditatlisu/kafka-search-consumer-go

结束

译自:https://medium.com/trendyol-tech/kafka-search-a949d6e4e8c9

版权声明:本文内容由TeHub注册用户自发贡献,版权归原作者所有,TeHub社区不拥有其著作权,亦不承担相应法律责任。 如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

点赞(0)
收藏(0)
菜鸟一只
你就是个黄焖鸡,又黄又闷又垃圾。

评论(0)

添加评论