【问题标题】:Split HTTP request with stack Angular/Express/MongoDB使用堆栈 Angular/Express/MongoDB 拆分 HTTP 请求
【发布时间】:2021-07-25 19:25:26
【问题描述】:

我有数百个元素可以从 MongoDB 数据库中获取并在前端打印出来。 将所有内容提取到单个请求中可能会降低性能,因为它在主体响应中携带大量有效负载。 因此,我正在寻找一种解决方案,将我的 Angular 请求拆分为多个,并且约束要同时进行。

例子:

蒙古数据库 集合:元素(_id、名称、孩子、...) 文档:10000+

但我们只需要 ~100-500 个元素

角度:

    const observables = [];
    const iteration = 5, idParent = 'eufe4839ffcdsj489483'; // example
    for (let i = 0; i < iteration; i++) {
      observables.push(
        this.myHttpService.customGetMethod<Element>(COLLECTION_NAME, endpoint, 'idParent=' + idParent + '&limit=??')); // url with query
    }

    forkJoin(observables).subscribe(
      data => {
           this.elements.push(data[0]);
           this.elements.push(data[1]);
      },
      err => console.error(err)
    );

我使用 forkJoin 是因为我需要同时请求以获得更好的性能。 想法是向后端发送多个请求,使用不同的限制参数值,最后将整组元素放入数据对象中。 唯一的目的是拆分请求以避免由于负载体的大小而导致的大延迟以及可能出现的错误。

如何继续使用给定的堆栈来执行此操作?我想避免使用 websockets。

【问题讨论】:

    标签: javascript angular mongodb performance http


    【解决方案1】:

    我认为fork.join 用于当您想要并行解决所有可观察对象时使用,但是您需要等待所有请求,如果一个失败怎么办? forkJoin 将在遇到第一个错误时立即完成,您有点不知道它来自哪个可观察对象,但如果您在内部可观察对象中处理错误,您可以轻松实现。

    const observables = [];
        const iteration = 5, idParent = 'eufe4839ffcdsj489483'; // example
        for (let i = 0; i < iteration; i++) {
          observables.push(
            this.myHttpService.customGetMethod<Element>(COLLECTION_NAME, endpoint, 'idParent=' + idParent + '&limit=??')).pipe(catchError(() => {
           throw `an Error request #: ${i}`;
         }); // url with query
        }
    
        forkJoin(observables).subscribe(
          data => {
               this.elements.push(data[0]);
               this.elements.push(data[1]);
          },
          err => console.error(err)
        );
    

    如果要将数据显示为列表,另一种方法是引入infinite-scrollngx-infinite-scroll

    如果符合您的要求,您还可以在前端添加分页。有一个库可以帮助你:Syncfusion grids。还有其他方法可以提高后端的性能。

    【讨论】:

    • 感谢错误处理程序提示。是的,我想并行化我的请求,因为每个请求都查询全局父对象的不同块。问题是:我需要小心不要得到相同的实体,也不要忘记一个。这就是限制参数在这里非常重要的原因。但我不知道如何将其实现为可靠的 Angular/Node/MongoDB 架构(考虑可以更新 DB、MongoDB 排序实现的并发请求......)
    • 这是什么意思 taking account concurrent request which can update DB, MongoDB sort implementationNode/MongoDB 这对于处理并发请求非常有用,这就是你拥有 Node.js 的原因。您应该使用精通并有效地提供数据并更新数据的猫鼬。
    • 对更新元素的并发请求可能会在获取期间造成麻烦。这是一个示例,但限制为 0-100、100-200、...、400-500 的 5 个请求不可靠,因为这些元素之一可以随时更改。所以,我正在寻找一种方法来避免这种情况。一种解决方案是在一次操作中从 DB 中获取 500 个元素,然后使用 NodeJS 将响应拆分为 Angular 请求。如果可能的话。
    • stackoverflow.com/a/60917515 第二段可能是我要查找的内容的一个想法,但对于 GET 请求。
    • 是的,我明白了,但你想在前端反向显示数据。每当数据中有任何更新时,只需将该部分发送到前端,它必须具有某种主键并使用该主键替换它。我只是想广泛地思考一下对于这种情况还可以做些什么。
    猜你喜欢
    • 1970-01-01
    • 2013-02-08
    • 2016-01-29
    • 1970-01-01
    • 1970-01-01
    • 2014-11-29
    • 2013-12-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多