1

我想实现快速、流畅的搜索。搜索到的项目并不多:最多约 100 个。每个项目都包含 facebook 事件将包含的数据量。它们都会在初始加载时出现(可能是无限滚动)。数据不会经常变化。不超过 100 个并发用户。

在上述条件下,搜索结果的最佳缓存策略是什么?

最具扩展性的策略是什么?

  • 前端:Nuxt (VueJS) + InstantSearch(没有 Algolia!)
  • 后端:春季启动
  • 码头化

可能的解决方案

  1. 后端的额外缓存服务(例如 reddis、memcached)+ 使 UI 在每次搜索操作时都转到服务器。这基本上会在每次击键时向后端发送垃圾邮件
  2. 将所有项目加载到本地存储(例如Vuex)并直接在那里搜索。这将增加应用程序的内存占用,并可能导致混乱的超时。
  3. 两者的结合?
4

1 回答 1

2

缓存层绝对不会受到伤害。用户数量应该不是问题。即使是 aws 上最小的 ec2-instance 也可以轻松处理。

您可以尝试在文本框中添加一点延迟,以便不是每次击键都会触发搜索,但可能会留出约 50 毫秒的余地?必须尝试看看在搜索栏中输入时的感觉。

对于 100 个项目,Vuex 也可以非常快,只要您不将图像等静态资产直接加载到 Vuex 中。JSON 数据中约 100 个项目并不多 - 但如果您的应用突然有 10000 个项目,它的扩展性也不会很好。

我认为最好的情况:

  • Redis 缓存,因为很多请求将非常相似甚至相同。您只需要找到缓存有效时间的最佳点
  • 如果 CPU 使用率超过某个阈值,则对后端和前端进行负载平衡,即按需创建更多 docker-image 实例以处理请求中的潜在峰值
  • 如果您的后端不仅仅是搜索,请将搜索外包给一个专用实例,这样它就不会干扰“常规请求”
  • 非常重要:在您的数据库中创建索引以获得更快的搜索结果,尽可能避免全面扫描!
  • 如果您的应用程序没有 24/7 的流量,也许可以考虑使用无服务器

编辑: - 让 api、缓存和数据库彼此靠近,因此实例之间的通信不必走很远。

于 2020-04-21T10:56:19.693 回答