숨겨진 AJAX는 가짜 성능을 요구하는 것이 얼마나 안전합니까?


48

숨겨진 AJAX 요청은 무엇입니까?

사용자의 작업이 즉시 발생하도록 설계된 숨겨진 AJAX 요청의 사용이 증가한 것으로 나타났습니다. 이 유형의 AJAX 요청을 비 블로킹이라고합니다. 사용자가 발생하고 있음을 인식하지 않고 AJAX 요청이며 백그라운드에서 수행되며 작업이 조용합니다 ( AJAX 호출이 성공적으로 완료되었음을 나타내는 자세한 내용은 없습니다 ). 목표는 작업이 실제로 완료되지 않았을 때 즉시 발생했음을 표시하는 것입니다.

다음은 비 차단 AJAX 요청의 예입니다.

  • 사용자는 이메일 모음에서 삭제를 클릭합니다. 항목이받은 편지함에서 즉시 사라지고 다른 작업을 계속할 수 있습니다. 한편 AJAX 요청은 백그라운드에서 항목 삭제를 처리 중입니다.
  • 사용자는 새 레코드 양식을 작성합니다. 저장을 클릭하십시오. 새 항목이 목록에 즉시 나타납니다. 사용자는 계속 새 레코드를 추가 할 수 있습니다.

명확히하기 위해 AJAX 요청을 차단하는 예가 있습니다.

  • 사용자는 이메일 모음에서 삭제를 클릭합니다. 모래 시계 커서가 나타납니다. AJAX 요청이 이루어지고 응답 할 때 모래 시계 커서가 꺼집니다. 사용자는 작업이 완료 될 때까지 잠시 기다려야합니다.
  • 사용자는 새 레코드 양식을 작성합니다. 저장을 클릭하십시오. AJAX 로더 애니메이션이 적용되면 양식이 회색으로 바뀝니다. "데이터가 저장되었습니다"라는 메시지가 표시되고 새 레코드가 목록에 나타납니다.

위의 두 시나리오의 차이점은 비 차단 AJAX 설정은 운영 수행에 대한 피드백을 제공하지 않으며 차단 AJAX 설정은 그렇지 않다는 것입니다.

숨겨진 AJAX 요청의 위험

이 스타일의 AJAX 요청의 가장 큰 위험은 AJAX 요청이 실패하면 웹 애플리케이션이 완전히 다른 상태에있을 수 있다는 것입니다.

예를 들어, 비 차단 예;

  • 사용자는 많은 이메일을 선택합니다. 삭제 버튼을 클릭하십시오. 작업이 즉시 발생하는 것처럼 보입니다 (항목이 목록에서 사라짐). 그런 다음 사용자는 편지 쓰기 버튼을 클릭하고 새 이메일을 입력하기 시작합니다. 현재 JavaScript 코드가 AJAX 요청이 실패했음을 발견했습니다. 스크립트가 오류 메시지를 표시 할 수 있지만 현재로서는 의미가 없습니다.

대안 적으로, 차단 예;

  • 사용자는 많은 이메일을 선택합니다. 삭제 버튼을 클릭하십시오. 모래 시계가 보이지만 작동하지 않습니다. "error. blah blah blah"라는 오류 메시지가 나타납니다. 이메일 목록으로 되돌아 가고 삭제하려는 이메일이 여전히 선택되어 있습니다. 다시 삭제를 시도 할 수 있습니다.

비 차단 AJAX 요청을 수행 할 때 다른 기술적 위험도 있습니다. 사용자는 브라우저를 닫고 다른 웹 사이트로 이동할 수 있으며 현재 웹의 다른 위치로 이동하여 오류 응답의 컨텍스트를 무의미하게 만들 수 있습니다.

그렇다면 왜 그렇게 인기가 있습니까?

Facebook, Google, Microsoft 등.이 모든 대형 도메인은 비 차단 AJAX 요청을 점점 더 많이 사용하여 작업 즉각적으로 수행되는 것처럼 보이게 합니다. 또한 저장 또는 제출 버튼없는 양식 편집기가 증가했습니다 . 필드를 떠나거나 Enter 키를 누르 자마자. 값이 저장됩니다. 어떤이 프로필이 업데이트되었습니다 메시지 또는 저장하는 단계.

AJAX 요청은 확실하지 않으며 완료 될 때까지 성공한 것으로 취급해서는 안되지만 많은 주요 웹 응용 프로그램이 그렇게 작동합니다.

비 차단 AJAX 호출을 사용하여 반응 형 응용 프로그램을 시뮬레이션하는 웹 사이트가 빠른 비용으로 불필요한 위험을 감수합니까?

이것이 경쟁력을 유지하기 위해 우리가 따라야하는 디자인 패턴입니까?


20
이것은 성공적인 운영이 훨씬 가능성이 높다는 사실에 의해 정당화되며, 따라서 지나치게 낙관적 인 피드백의 경우를 피하기 위해 속도를 늦추는 것은 나쁜 트레이드 오프입니다. 개인적인 관계로 바뀐 당신은 차분하고 햇볕이 잘 드는 사람이나 잘못 될 수있는 모든 것이 잘못되고 그에 따라 행동한다고 ​​전적으로 가정하는 사람과 대화하고 싶습니까?
Kilian Foth

1
나에게 어려움을 겪고있는 것은 데스크톱 응용 프로그램에 작업과 오류가 즉시 발생한다는 것입니다. 웹 응용 프로그램을 사용하면 작업이 즉시 발생하지만 오류가 발생합니다. 그러나 사이트는 데스크톱 응용 프로그램 디자인으로 작동합니다.
Reactgular

7
데스크탑 응용 프로그램이 디스크에 쓸 때 실제로 OS 버퍼에 들어가고 디스크가 플래터에 기록되기 전에 실패하는 경우 어떻게되는지 생각해 보셨습니까? 또는 그 문제로 인해 바이트가 플래터에 기록 된 후 디스크가 실패합니다. 두 경우 모두 사용자 는 실제로 발생하지 않았을 때 어떤 일이 발생 했다고 생각 합니다.
kdgregory

2
@KilianFoth 나는 "써니"사람이 당신을 펀치하고 문제의 첫 징후에 당신의 지갑을 훔칠 것이라면 모든 것이 잘못 될 수 있다고 생각하는 사람을 선호합니다. 따라서 실패에 대한 페이지 반응의 규모에 따라 다릅니다.
이즈 카타

1
@ButtleButkus 나는 메시지를 저장하는 것이 새로운 것이라고 생각합니다. 내가 질문을 할 때 거기에 없었습니다. 최근 Google에서 더 많은 피드백을 추가하여 백그라운드에서 작업하고 있음을 알았습니다.
Reactgular

답변:


62

실제 반응만큼 "가짜"성능은 아닙니다. 인기있는 이유는 여러 가지가 있습니다.

  • 오늘날 인터넷 연결은 상당히 안정적입니다. AJAX 요청 실패의 위험이 매우 낮습니다.
  • 수행되는 작업은 실제로 안전에 중요하지 않습니다. 이메일이 서버에서 삭제되지 않으면 최악의 경우 다음에 페이지에 올 때 다시 삭제해야합니다.
  • 요청이 실패하면 작업을 실행 취소하도록 페이지를 디자인 할 수 있지만 서버와의 연결이 끊겼다는 것을 의미하기 때문에 실제로 미묘 할 필요는 없습니다. "연결이 끊어졌습니다. 최근 변경 사항을 저장할 수 없습니다. 나중에 다시 시도하십시오."라고 말하는 것이 더 쉽습니다.
  • 보류중인 AJAX 요청을 하나만 허용하도록 페이지를 설계 할 수 있으므로 상태가 서버와 너무 동기화되지 않습니다.
  • AJAX 요청이 보류중인 동안 페이지를 닫거나 다른 곳으로 이동하려고하면 브라우저가 경고합니다.

AJAX 보류 경고


8
마지막으로 모든 브라우저가 기본적으로 그렇게합니까?
Svish

모르겠어요 IE9 및 최신 크롬에서만 테스트했습니다.
Karl Bielefeldt

3
당신은 분명히 호주의 인터넷에 익숙하지 않으며, 가난하고, 개발되고, 고립 된 장소는 말할 것도없고, 움직이는 차량을
타고

2
@hippietrail 글쎄, 당신은 모든 사람을 항상 행복하게 할 수는 없습니다.
KOVIKO

1
사용자가 요청을 보낼 때 항상 새 페이지를 요구하지는 않습니다. 잘 디자인 된 AJAX 응용 프로그램을 사용하면 더 재밌을 때보 다 더 효율적으로 진행되는 상황을 사용자에게 알릴 수 있다고 생각합니다.
Frederik.L

32

서버가 응답 할 때까지 사용자가 다른 작업을 수행하는 것을 차단하는 것보다 원격에서 장애가 발생하는 경우 무언가가 작동하고 오류를 표시한다고 가정합니다.

전자 메일 클라이언트는 실제로 이에 대한 좋은 예입니다. 5 개의 전자 메일이있는 목록이 있고 최상위 전자 메일을 선택 DEL하면 처음 세 개의 전자 메일을 세 번 칠 때 삭제 될 것으로 예상합니다 . "비 차단 AJAX"를 사용하면이 기능이 제대로 작동합니다. 키를 누를 때마다 선택한 이메일이 즉시 제거됩니다. 문제가 발생하면 오류가 표시되고 제대로 삭제되지 않은 전자 메일이 다시 표시되거나 페이지가 다시로드되어 일관성이없는 로컬 상태가 제거됩니다.

따라서 가장 일반적인 경우 , 즉 성공은 유용성을 향상시킵니다. 에서 드문 경우 - 실패 - 유용성이 저하됩니다 (삭제 된 요소를 다시 표시하거나 응용 프로그램이 "다시 시작"한다)는 보통 일반적인 경우에 대한 최적의 사용성을 갖고 싶어하는 응용 프로그램을 작성하지 오류가 발생하는 경우에 때.


1
+1 문제의 핵심입니다. 기본적으로 사람들은 요즘 구현하는 안전이 너무 많아 최악의 시나리오에서는 여전히 실제 사용자 실수를 위험에 빠뜨리지 않습니다. 이메일 클라이언트가 삭제에 실패하고 로컬 상태가 잘못되었다고 가정하고 잘못 정렬 된 이메일 4를 삭제하십시오 서버를 사용하면 대다수의 백엔드 개발자는 사용자가 절대 원하는 것을 삭제하기 위해 안전을 잡을 수 있습니다. 따라서이 잘못된 정렬로 인해 잘못된 삭제가 발생하지 않습니다 (오류가 발생할 수는 있지만 삭제되지는 않습니다) .
Jimmy Hoffa

@JimmyHoffa 삭제 요청에 고유 한 이메일 ID를 사용합니다. 받은 편지함에있는 전자 메일의 임의 표시 순서에 따라 삭제 요청을 보내는 것은 실제로 좋지 않습니다.
Buttle Butkus

14

사용자는 소프트웨어가 무대 뒤에서하는 일에 신경 쓰지 않습니다. 즉, 자신의 행동이 눈에 띄는 영향을 미치고 자신의 속도에 맞게 작업하기를 원합니다.

이메일 삭제와 같이 클라이언트 측에서 작업이 성공한 경우 서버 측에서도 작업을 수행하는 것이 좋습니다. 삭제가 실패한 이유는 무엇입니까? 어떤 종류의 제한으로 인해 (예를 들어, 보관 된 전자 메일을 제거 할 수없는 경우), 사용자는 자신의 작업이 실패 하기 전에 이를 알고 있어야합니다 .

오류가 더 심각한 것으로 인해 발생한 경우 (데이터베이스 충돌이라고 함) 작업을 저장하고 시스템이 다시 작동 할 때 다시 시도하는 방법이 있어야합니다.

이를 관리하는 좋은 예는 Facebook이 채팅을 처리하는 방법입니다. 사용자가 갑자기 연결을 끊는 것을 막을 방법이 없으므로 사용자가 떠나기 전에 보낸 메시지를 읽을 수 없습니다. 시스템은 오류를 표시하는 대신 모든 해당 메시지를 저장하고 사용자가 돌아올 때 사용할 수 있도록합니다. 데이터가 손실되지 않습니다.


2
+1. 훌륭한 채팅 예. 대부분의 사용자는 자신의 메시지를 모든 사람이 즉시 사용할 수 있기를 기대하며, 이러한 메시지는 거의 실패하지 않으므로 사용자에게는 그러한 환상이 주어집니다.
Neil

1
@Niphra, "왜 삭제가 실패 했습니까?" 네트워크는 여러 가지 이유로 실패 할 수 있으며 애플리케이션과 관련이 없습니다. 없습니다 아무것도 당신이를 중지 할 수는.
Pacerier

5

두 옵션 사이에서 타협 할 수 있습니다. 예를 들어, 사용자가 이메일을 삭제 한 경우 서버에서 확인을받을 때까지 이메일을 빨간색 또는 회색으로 표시 한 다음 목록에서만 제거 할 수 있습니다. 한 작업이 보류중인 동안에도 사용자는 다른 작업을 수행 할 수 있으므로 차단되지는 않지만 아직 사용자의 작업이 아직 커밋되지 않았다는 알림이 약간 남습니다.

Amazon AWS는 다음과 같은 접근 방식을 취합니다. 인스턴스를 중지 / 시작할 때 인스턴스를 선택할 수있는 확인란이 스피너로 바뀌므로 (몇 초 동안 아무 작업도 수행 할 수 없음) 다른 인스턴스와 상호 작용


XHR이 진행되는 동안 gmail에 "Saving ..."텍스트가 표시되고 완료된 후 "Saved"가 표시되는 방식과 비슷합니다. 항상 "저장 됨"이라고 말하면 누가 믿겠습니까?
Buttle Butkus

3

필자는 이것이 기존 사이트보다 응용 프로그램처럼 작동하고 브라우저에서 양식 데이터 확인과 같이 더 많은 처리를 수행하는 점점 더 많은 웹 사이트와 함께 제공된다고 생각합니다. 코드가 신뢰할 수 있고 정상적인 조건에서 코드가 성공할 것으로 예상되는 한 문제가 너무 많지는 않습니다.

"현재 JavaScript 코드가 AJAX 요청 실패를 감지했습니다. 스크립트에 오류 메시지가 표시 될 수 있지만 현재로서는 의미가 없습니다."

왜 무의미해야합니까? 이메일 목록으로 돌아가서 삭제를 다시 수행 할 수 있습니다. 왜 대신 기다려? 실제로 "위험"은 많지 않으며 빠르다고 "보이지"않고 실제로 더 빠르게 작동합니다. 활동이 "중요하지"않다면 왜 느려 집니까?


1
어쩌면 무의미한 말이 맞지 않았을 수도 있지만, 의미하는 바는 오류 메시지에 상대적인 컨텍스트가 없다는 것입니다. 사용자는 이제 완전히 다른 것을하고 있기 때문입니다. 나는 무식한 웹 사용자에게 이메일이 성공적으로 삭제되었다고 생각한다는 것입니다. 이제 왜 나중에 "본 것"이 제거되었다는 오류 메시지가 나타납니다. 프로그래머에게는 이해하지만 gmail을 사용하는 할아버지에게는 이해할 수 없습니다.
Reactgular

대부분의 사람들은 일이 즉시 발생하는 응용 프로그램을 사용하고 시스템은 반응이 좋으며 값이 변경 될 때마다 1 초 동안 멈추는 응용 프로그램보다 UI가 이상한 방식으로 업데이트 될 가능성이 10,000 분의 1입니다.
로봇 고트

1

제 2c는 : "비 차단"Ajax 작업과 나쁜 디자인 선택이있는 다른 상황을 갖는 것이 더 좋은 상황입니다. 예 : YouTube 동영상 투표 작은 시작을 클릭하는 동안 페이지의 어떤 부분도 막히고 싶지 않습니다. 조용히 실패하는 것이 좋습니다. 확인 메시지조차도 과잉 상태입니다. 그러나 이메일 삭제에 대한 귀하의 예는 차단 유형 Ajax 요청에 대한 필수 자격이 있습니다.

Mongo DB는 이와 같은 작업을 수행합니다 (데스크톱 애플리케이션 예제로 간주 될 수 있음). 작업에 대해 다양한 "쓰기 문제"가 있으며, "즉시 반환하고 아무 것도 기다리지 않음"에서 "네트워크 전송 성공을 확인할 때까지 차단"에 이르기까지 각 작업에 대해 다른 값으로 구성 할 수 있습니다. "반환"을 클릭하여 "원격 시스템에서 디스크 쓰기를위한 내용이 예약 될 때까지 기다렸다가 다시옵니다". 분명히 Mongo 드라이버를 사용하여 C ++와 같은 데스크톱 씩 클라이언트를 만드는 경우 최소한 "중요도"(예 : 새 전자 메일 확인) 및 기타 엄격한 쓰기 문제에 대한 DB 작업에 대해 가장 가벼운 쓰기 문제를 설정해야합니다. .

비 차단 Ajax의 유용성을 보았지만 너무 많이 발생한다는 데 동의합니다. 어느 시점에서 사진 업로드를 위해이 작업을 수행하는 유명한 "소셜 네트워킹"사이트가 하나 이상있었습니다. 업로드 할 사진을 선택한 다음 bam을 선택하면 즉시 완료되었음을 알리고 다음 날 더 많은 사진을 추가하고 싶거나 다음에 이미 추가했다고 생각했을 때 충분히 사용하십시오. 찾을 수 없었습니다. 나중에 그들은 포기하고 실제로 응답을 기다리는 데 시간이 걸렸습니다 (실제로는 "사진 업로드 실패, 나중에 시도"와 같은 메시지가 표시 될 수 있습니다).


내 길을 보는 +1 :). 사진 업로드가 실패의 좋은 예입니다.
Reactgular

1
차단 업로드가 바람직한 이유는 무엇입니까? Picasa를 (웹 인터페이스), 당신은에서 사진을 드래그 할 수 있으며, 백그라운드에서 업로드하는 동안, 당신은 더 많은에 드래그 할 수 있습니다, 또는 완료 태그 사진 등은 차단 업로드 작업 만들 것 그 끔찍한 UX
BLSully
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.