먼저 내 요구 사항은 귀하의 것과 다릅니다. 내 문제는 백엔드 데이터베이스가 약간 느려지는 경향이 있었고 사용자의 응답 성은 매우 중요했습니다.
따라서 데이터베이스 상호 작용을 방정식에서 제거해야했습니다.
내 솔루션은 두 부분이 있습니다
데이터의 서버 측 캐시를 유지를
서버
과 상호 작용할 수있는 모든 데이터베이스 작업을 포함하는 별도의 프로세스를 만듭니다
별도의 프로세스는 Windows 서비스에서 호스팅하는 명명 된 파이프 WCF 서비스로 구현되었습니다.
기본 프로세스의 개요는 다음과 같습니다
- 사용자가 "저장"을 클릭, 아약스는 MVC 컨트롤러 컨트롤러는 캐시 데이터를 업데이트
- 에 양식을 게시 한 후 WCF 파이프
- 서비스를 호출 데이터를 동시 대기열 (세션 ID와 함께)로 푸시하고 guid 토큰을 반환합니다.
- 컨트롤러가 토큰을 JSON 응답으로 반환합니다.
- jQuery Ajax 처리기는 응답을 가로 채고 "저장된"양식을 나타내는 UI 요소에 토큰을 저장합니다.
서비스 자체는 다음과 같이 작동 시작에
- 는 타이머를 만들 수 있습니다.
- 타이머 틱 :
- 타이머를 중지하십시오.
- 가 "완료"에 상품을 추가 작업 프로세서
- 에 의해 처리 될 보내기 동시 큐
- 에서 각 항목을 모두 대기중인 작업 항목을 제거 또는 "오류가 있습니다"동시 사전은, 이전에 의해 키가 세션 ID (부실 데이터를 제거하는 데 필요한 시간을 유지해야 함) 여기에는 원래 작업 토큰이 포함됩니다.
- 타이머를 다시 시작하십시오.돌아 가기 사용자 땅에서
는 자바 스크립트 setInterval을 루프 실행이 :
- 서버에 Ajax 요청 (하트 비트 컨트롤러)
- 컨트롤러가 서비스에 연결하고 현재 세션 ID를 전달
- 이 서비스는
- 컨트롤러는 JSON 객체 배열과 같은 목록을 반환하는 "완료"와 "오류"사전에서 모든 항목을 반환
- javascript는 반환 된 목록을 반복하고 적절한 UI 업데이트를 수행하기 위해 토큰을 사용합니다.
최종 결과는 느린 백엔드 지속성 서버에도 불구하고 매우 반응적인 UI입니다.
구현 코드의 특정 부분을 원하면 알려주십시오.
컨트롤러를 비동기로 변경 하시겠습니까? –
나는 그렇지 않다. 비동기 컨트롤러가 도움이되지 않는다는 것을 이해합니다. 그렇지 않은가요? – mcottingham
여기에 정의 된 리소스에 의존한다고 가정합니다. '한 번에 하나의 요청 만 처리 할 수있는 리소스를 사용합니다.' 한 번에 하나씩 만 처리 할 수있는 리소스 또는 리소스 유형을 조금 더 밝힐 수 있습니까? –