많은 비동기 호출 대 API에 대한 단일 호출


12

우리는 자바 스크립트를 통해 HTML5 프론트 엔드에서 사용할 REST API를 개발하고 있습니다. 이 응용 프로그램은 조직 내에서 사용되며 일반적으로 약 300 명의 사용자가 있지만 최대 1000 명의 사용자까지 확장 할 수 있습니다.

일반적으로 API에 대한 연결은 LAN 내에서 이루어 지므로 연결 속도가 느리고 연결이 3G / 4G를 통해 지연 될 수있는 인터넷에서 가끔 사용되는 것을 배제하지는 않지만 연결 품질과 대기 시간은 양호합니다.

우리가 생각한 두 가지 옵션은 다음과 같습니다.

  1. 프론트 엔드는 인터페이스의 다양한 구성 요소를로드하기 위해 API에 대한 여러 개의 비동기 비동기 호출을 작성합니다.

    • 장점 : 단순성.
    • 단점 : 서버에 대한 추가 연결.
  2. 프론트 엔드의 컨트롤러는 API를 한 번 호출하여 객체를 가져와야하는 매개 변수로 전달합니다.

    • 장점 : 서버가 데이터베이스에 여러 번 연결하더라도 서버에 한 번만 연결됩니다.
    • 단점 : 프런트 엔드와 API 모두에 메커니즘이 필요합니다. 디자인이 복잡합니다.

추가 설명 : 다른 리소스가 있습니다 ... / 제품 ... / 위치 등.이 리소스는 단독으로 가져올 수 있지만 다른 추상 리소스가 있습니다 ... / screen?

답변:


14

다음과 같은 이유로 옵션 1 (여러 비동기 호출)이 가장 좋습니다.

  1. 각 개별 통화는 고유 한 엔터티 이므로 문제가 발생하면 개별적으로 다시 시도 할 수 있습니다. 단일체 '원콜'아키텍처에서 한 가지가 실패하면 전체 호출을 다시 수행해야합니다.
  2. 서버 측 코드가 더 간단 해집니다. 다시 한 번 모듈화 는 다른 개발자가 다른 API 리소스에서 작업 할 수 있음을 의미합니다.
  3. 일반적인 MVC 패턴 에서는 하나의 API 호출로 여러 개의 개별 리소스를 로드하는 것이 이치에 맞지 않습니다 . 당신이 요청을 할 수 있도록 예를 들어, /products페이지에 표시 할 제품의 목록을 얻으려면, 당신은 인기 제품 판매 지역의 목록을 표시하려면, 당신은 두 개의 별도의 자원을 가지고 ProductLocation. 동일한 페이지에 표시되지만 논리적으로 전화를 걸 /products거나 위치를 반환 하도록 할 수는 없습니다.
  4. 로깅 / 이용 보고서는 모듈 식 접근 방식에서 더 간단합니다. 요청을 /products하고 위치를로드 하는 경우 로그 파일이 실제로 혼란 스러울 수 있습니다
  5. 특정 리소스에 문제가있는 경우 원콜 방식을 사용하면 전체 페이지가 중단되고 사용자에게 문제가 무엇인지 명확하지 않게됩니다. 따라서 팀에서 문제를 해결하는 데 시간이 더 오래 걸립니다. 그러나 모듈 식 접근 방식에서 한 가지 문제가 발생하면 무엇이 깨 졌는지 명확하게 알 수 있으며 더 빨리 해결할 수 있습니다. 또한 페이지의 나머지 부분을 망치지 않습니다 (사물이 너무 밀접하게 결합되어 있지 않으면 ...)
  6. 사물이 분리되면 일반적으로 변경하는 것이 더 쉬울 것입니다. 한 번의 API 호출로 5 개의 리소스를로드하는 경우 무언가를 변경하려고 할 때 문제 를 해결하지 않는 방법을 파악하기가 더 어려워집니다

요점은 리소스가 분리되어 있고 REST 서버에서 단일 서버 경로에서 많은 개별 리소스를 반환하는 것은 "서버에 대한 연결을 저장하는"경우에도 의미가 없다는 것입니다. 그런데 매개 변수를 사용하여 조건에 따라 다른 리소스를로드하는 것은 RESTful이 아닙니다.

그러나 논리적 옵션은 리소스를 분리하기 위해 여러 개의 비동기 요청을 하는 것입니다 .

PS-특히 HTTP 연결의 오버 헤드가 매우 낮아 LAN에있는 경우 "서버에 대한 연결"을 미리 최적화하지 마십시오. 박쥐에서 더 단순한 디자인을 선택하는 대신 이런 종류의 사고는 나중에 문제를 일으킬 것입니다.


1
또한 모듈 식은 단위 테스트가 더 쉽습니다.
user949300

@ user949300 좋은 지적, 나는 그것을 생각하지 않았다! 사물이 분리되면 실제로 단위 테스트가 훨씬 쉬워집니다.
Chris Cirefice

빠르고 확장 된 답변에 감사드립니다. 나는 모든 것에 동의하지만, 나는 그것을 잘 설명하지 않았다고 생각합니다. 다른 자원 / Product / Locations 등이있을 것입니다.이 자원은 단독으로 가져올 수 있지만 한 번의 호출로 둘 다 가져올 다른 추상 자원 / screen? Product & Locations가 있습니다. 어쨌든 나는 또한 더 간단한 방법을 선호합니다.
mattinsalto

@mattinsalto의 접근법은 적어도 REST API를 개발 한 경험과 API를 사용한 웹 앱을 사용 /screen?Product&Locations하는 나쁜 접근 방식입니다. 순수한 모 놀리 식 관점에서 (예 : Ruby on Rails), 경로를 지정 /screen하면 리소스 ProductLocation리소스를 모두로드 할 수 있습니다. 그러나,에서 REST의 관점에서, 당신은 것입니다 결코 (한 번에 더 많은 데이터를 얻기 위해 테이블을 조인하지 않는 한) 경로가 하나보다 더로드 할 없습니다. 무엇을 /screen해야하는 것은 기본 레이아웃 페이지를로드하고 있습니다 (데이터를 얻을 수 귀하의 API 아약스 Product, Location등).
Chris Cirefice

@mattinsalto 웹앱 (및 기타)에서 사용할 REST API를 개발하는 경우 데이터 에만 집중하고 앱 에서 데이터 를 어떻게 사용할 지에 초점을 맞춰야 합니다. REST API는 각 자원에 대한 기본 조작 (필요에 따라)을 지원해야합니다. 그런 다음 웹 응용 프로그램 이 특정 페이지에 필요한 모든 자원의로드를 (예를 들어 할 것 /screen아약스 것 HTTP GET/products/popular하고 /locations). 예를 들어 웹 앱과 안드로이드에서 동일한 방식으로 데이터를 표시하지 않을 것이기 때문에 API는 여러로드를 수행하는 API가되어서는 안됩니다.
Chris Cirefice
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.