2012-07-27 2 views
0

내 시스템은 별도의 핸들러로 명령 패턴을 사용합니다. 내 명령은 현재 모든 명령을 처리하는 CommandService에서 실행됩니다.간단한 비동기 명령 처리를 위해 서비스 버스가 필요합니까?

  1. 는 팩스 3 자 웹과
  2. 의 상호 작용을 보냅니다 PDF 파일을 생성 이메일을 보냅니다

    나는 느린 작업이다 이런 것들을 적어도 1을 특정 명령을 서비스

이러한 모든 명령을 처리가 불완전하게 처리하여 UI가 더 이상적으로 보이게하고 싶습니다.

이러한 명령에만 메시징 버스를 사용해야합니까? 아니면 처리 중 명령 처리기를 BeginInvoke()으로 호출해야합니까?

편집 - 추가 정보

시스템은 소수의 사용자 (바쁜 하루에 아마 100 개의 동시)을 가지고 있으므로 큐 가능성이 매우 긴 얻을하지 않을 것입니다. 여기서 중요한 점은 첨부 된 PDF (문제의 명령)가 포함 된 전자 메일을 보낼 때 UI가 차단되는 시간을 줄이는 것입니다. 직원들은 하루에 여러 번 명령을 실행해야합니다.

  1. 모든 UI 상호 작용들이 같은 생각 작동하는지 확인하기 위해 접촉해야 할 것 : 마음에 전체 상황

    는, 나는 여러 가지 이유로 지금 BeginInvoke() 함께 갈 것 같네요 명령이 성공했습니다. "이 문서를 보내야 함"알림은 UI의 여러 위치에 있으며 보고서를 보내면 전체 페이지를 새로 고칩니다.
  2. 내 고객의 바쁜 시즌의 중간입니다 (여름에 연간 비즈니스의 50 % 이상을 처리 함). 따라서 현 시점에서 완전히 새로운 인프라를 소개하는 것이 현명하지 않습니다. 관리에 익숙하지 않다.

하지만 내가로부터 서비스 버스를 사용하는 새로운 시스템에서, 지금 알고있는 것을 알고있는 느린 명령 (거의 모든 시스템이 이메일을 보낼 필요)에 대한 GET-가서 UI를 설계 명령을 할 수 있도록 동기식에서 비동기식 처리로보다 쉽게 ​​전환 될 수 있습니다. 구현시, 이는 기본적으로 모든 POST가 AJAX이고 UI에서 액션을 성공한 것처럼 수행한다는 것을 의미합니다. (예를 들어 페이스 북이 댓글을 처리하는 방법을 확인하십시오.)

+0

시간적 커플 링 및 관련 문제는 당신이 조사해야하는 것입니다. –

답변

2

두 가지 솔루션에 장단점이 있습니다.

  • BeginInvoke는 치명적인 간단한 해결책이며 그 의미는 명령으로 직접 처리기를 호출하는 것과 같습니다. 하지만이 솔루션은 스레딩 인프라에 의존합니다. 최대 스레드 수, IO 리소스에 동시 액세스로 인한 고정 된 스레드 등.
  • MessageBus는 프로세스를 처리하는 명령의 모든 측면을 제어 할 수있는 매우 유연하고 강력한 솔루션입니다.그러나 더 단순한 의미가 더 좋은 경우를 대비해 다른 기술 추상화 레이어를 소개합니다.

시스템로드 요구 사항, 이러한 백그라운드 작업 수, 증가하는 요인 등을 예상하는 것이 좋습니다. 결정을 내린다.

하지만 개인적인 견해로는 케이스의 80 %에 맞는 버스 솔루션을 도입했습니다. 필요할 경우 다음 반복까지 확장 할 수있는 순진한 버스 구현을 도입 할 수 있습니다.

2

아마 메시지 버스쪽으로 당신을 밀어 줄 더 많은 신뢰성 문제 일 겁니다. 원래 트랜잭션 (BeginInvoke를 수행 한 트랜잭션)이 성공했다면 서버 호출이 중간에 중단되고 시스템에 메모리가 없어서 전자 메일을 보내거나 PDF를 생성해야합니다. .

메시지 버스는 두 번째 트랜잭션을 대기열로 롤백 할 수 있으므로 서버가 다시 시작될 때 이메일을 다시 보내 게됩니다.