我写的每篇文章都提到了 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 亿个事件的基准测试。如果你想了解结果,可以在此处阅读此文章。
“说得好听没用,给我看代码。” - 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
评论(0)