【发布时间】:2018-04-12 21:01:22
【问题描述】:
上下文
我正在开发一个具有AngularJS 前端和Laravel 后端以及MySQL 作为数据库的应用程序。后端基本上作为 REST API 工作。
问题
在搜索页面工作时,我遇到了一个问题,当用户单击多个过滤器、在搜索文本字段中书写或快速翻阅页面时,会发送多个请求,因为搜索响应会自动更新,而无需一个搜索按钮,这会大大减慢响应时间。
所以我尝试通过在另一个请求被触发时取消请求来解决这个问题。
这是使用Restangular的代码:
this.refresh = function(filter) {
if (abortGet){
abortGet.resolve(); // cancel the previous call through timeout HttpConfig
}
abortGet = $q.defer();
resource.rest = Service.withHttpConfig({timeout: abortGet.promise}).getList(filter);
resource.rest.then(function(data) {
...
});
};
问题是我认为请求仍然会到达后端,因此当请求的前端部分被取消时,数据库很慢。
我不希望应用程序感觉没有响应,因此我不希望在一段时间内阻止在前端发送的请求以确保用户完成查询。 p>
问题
- 如果来自同一用户的连续请求到达,是否有办法在后端阻止对 MySQL 的请求?
- 我认为这是高级搜索实施的典型问题,是否有多种策略可以解决?
【问题讨论】:
-
您可以做的第一件事是对用户输入使用去抖动功能。
-
我这样做了,但是,如果请求有点复杂、处理速度慢或者用户在选择选项时速度很慢,则会发送多个请求。我想我必须以某种方式在后端处理它。
-
我会尝试使用 Redis 来缓存数据库结果。
-
@Camilo 感谢您的建议,我们已经使用 Redis 来缓存大多数非快速变化的数据。但是,我询问的数据变化很快。
-
也许您可以在某些路线上设置rate limit。
标签: mysql angularjs laravel rest