2011-01-13 6 views
1

면책 조항 : 이것은 my other question about NServiceBus에서 후속 질문 인 answered very thoroughly입니다.NServiceBus, NHibernate 및 GuidComb()

내 현재 질문 : 웹 사이트가 위에 언급 된 문서처럼 '벙어리'로 작성된 경우 다음 시나리오가 어떻게 작동합니까?

사용자는 관련 세부 정보가있는 양식을 작성하여 웹 사이트에 등록합니다. 사용자가 양식의 '제출'버튼을 클릭하면 웹 응용 프로그램은 양식 데이터를 가져 와서 NServiceBus 및 Bus.Send()를 사용하여 응용 프로그램 계층에 보내는 메시지를 작성합니다. 애플리케이션 계층은 새로운 사용자를 생성하고 사용자가 생성 한 이벤트 (Bus.Publish())를 게시하여 다른 프로세스가 자신의 일을 할 수 있도록합니다 (새 사용자를 이메일로 보내고 검색 색인에 사용자를 추가하는 작업). , 등).

이제이 시나리오의 웹 응용 프로그램은 새로운 사용자 인스턴스를 만드는 응용 프로그램 계층에 완전히 의존하므로 사용자의 ID를 어떻게 알 수 있습니까? 이 시나리오에서 NServiceBus를 사용하지 않고 웹 사이트가 DAL에 대한 in-process 호출을하도록하면 NHibernate의 GuidComb() 전략을 사용하여 새 사용자의 식별자를 생성 한 후 데이터 베이스. 새 사용자를 생성하라는 명령을받는 메시지 처리기 응용 프로그램 (현재 시나리오에서)이 동일한 전략을 사용하는 경우 userId가 웹 응용 프로그램으로 어떻게 다시 전달됩니까?

이와 같은 시나리오에서 식별자를 관리하기 위해 다른 전략을 적용해야합니까?

답변

3

correlation identifier으로 사용할 ID를 웹 응용 프로그램의 메시지에 입력하여 자유롭게 처리 할 수 ​​있습니다.이 프로세스를 통해 메시지가 시작될 때마다 처리 할 수 ​​있습니다.

그런 식으로 상관 ID 만 제공하면 시스템의 다른 이벤트와 상관시킬 수 있습니다.

그러나 동일한 웹 요청에서 사용자 ID가 으로 다시 전송되도록하려는 것 같습니다. 이는 메시징에서 제공하는 비동기 백엔드로 쉽게 수행 할 수 없습니다.

사용자가 생성되었을 때 사용자 세션을 재개하는 일종의 게이트웨이에 대한 (비밀) 링크가 포함 된 전자 메일을 사용자에게 보내면 안됩니까?

+0

안녕하세요. 이는 좋은 생각입니다. 두 시스템간에 오류가 전달되고 각 시스템에서 다른 식별자로 유지되는 예외 차폐와 비슷한 것을 사용했습니다. 그러나이 시나리오에서 상관 식별자의 수명은 얼마입니까? 동일한 웹 요청에서 사용자 ID가 나에게 다시 입력되도록 할 필요는 없습니다.하지만 실제 ID를 사용하는 대신 실제 userId를 최대한 많이 사용하고 싶습니다. 콤비네이션. 그렇지 않으면 두 개의 ID에 대해 색인을 생성해야합니다 ... 흠! 생각할 거리. 좋은 제안. 감사! –

+0

사용자 작성 프로세스와 관련된 메시지/이벤트를 상관 시키려면 상관 ID _only_를 사용해야합니다. – mookid8000

+0

사용자가 생성되고 사용자 ID가 알려지 자마자 사용자를 생성하는 프로세스에 "로컬"이므로 상관 ID를 버려야한다고 말하고 싶습니다. – mookid8000

0

"사용자가 만든"이벤트에 대해 UI가 버스를 청취 할 수 없습니까? 그런 다음 이벤트에 "사용자 생성 요청 됨"이벤트로 다시 연결되는 일종의 이벤트 ID 또는 이벤트의 다른 잘 알려진 데이터 (예 : 사용자 이름)가 포함될 수 있습니다. 아마도 "사용자 생성 실패"이벤트와 같은 여러 이벤트를 청취해야 할 수도 있습니다.

이것은 웹 브라우저에서 일반적인 AJAX 처리와 다르지 않습니다. 기술적으로, 대역 외 콜백을 웹 서버로 차단하지 않습니다. 호출을 호출하면 비동기 적으로 콜백을 기다립니다.

+0

그래도 작동하려면 스레드를 생존 상태로 유지해야합니까? 내 생각에 그럴 수는 없지만, 기쁘게 생각합니다. –

+0

자, 이것이 ASP.NET WebForms 페이지라고 가정합시다. 이 개념은 페이지 내에서 비동기 처리를 위해 이미 존재합니다. 예를 들어, 3 개의 SQL 명령을 초기화하고 비동기가 모두 완료 될 때까지 기다릴 수 있다는 아이디어 (비동기 응답을 동시에 실행하거나 연속적으로 실행한다는 생각입니다.) 일반적으로 비동기 응답을 기다리는 일종의 시간 초과가 있습니다. exceeced, 당신은 여전히 ​​다시 구독하고 응답 메시지를 다시 기다리는 새로 고침 옵션을 사용할 수 있습니다. – Rich