2016-06-07 6 views
0

나는 메시지 A이 많은 메시지를 생성하기로되어있는 RabbitMQ 메시지 구조를 가지고 있는데, 이것들을 BC이라고 부르 자. 메시지 A은 작업자 프로세스에서 수신 한 다음 처리하고 메시지 BC을 생성합니다.RabbitMQ 후속 메시지의 원 자성

가상적인 워크 플로우 프로세스는 다음과 같다 :

  1. ack=False
  2. 시작 트랜잭션
  3. 실행하는 코드
  4. 생성 메시지 B
  5. 생성 메시지 C
  6. 있는 메시지 A 수신
  7. 보내기
  8. 완료 메시지 어떤 경우 작업자 프로세스가 메시지 A의 처리 중에 사망하거나 동안 아직 트랜잭션을 완료하지 않은됩니다에서 거래

에 대한- 나는 RabbitMQ과 같이 메시지 A를 치료하고 싶습니다 배달하지 않은 다음 다시 대기열에 넣으십시오.

RabbitMQ는 고 가용성 구성에서 실행됩니다.

또한, RabbitMQ도 예를 들어, 단 하나의 큐를 포함하는 거래의 경우에는 자성 보증을 제공하지 않습니다 :

왜 질문은 진술의 RabbitMQ 문서 here을 취소하려고 tx.commit 중에 오류가 발생하면 브로커를 다시 시작한 후 트랜잭션 게시의 하위 집합이 대기열에 표시 될 수 있습니다.

  • 내가 RabbitMQ 또는 시장에 다른 대기 소프트웨어의 맥락에서 원하는 동작을 달성 할 수있는 방법이 있습니까?
  • RabbitMQ를 사용하여 여러 대기열에서 사용할 수있는 방법이 있습니까?

답변

0

제대로 작동하려면 인프라 (코드)가 상당히 필요합니다. 그것은 다소 까다 롭습니다.

서비스 버스를 고려하고 싶을 수 있습니다. 여기에 무료 .net 오픈 소스 코드가 있습니다. http://shuttle.github.io/shuttle-esb/

.net 공간에 없거나 서비스 버스를 사용하지 않으려는 경우 코드 몇 개를 따라 가면 이러한 것들의 일부분을 볼 수 있습니다 Shuttle.Esb에 의해 처리 된 (

모든 전송 메시지 (핸들러로) 멱등 서버를 사용 https://github.com/Shuttle/Shuttle.Esb.SqlServer/blob/master/Shuttle.ESB.SqlServer/Idempotence/IdempotenceService.cs 트랜잭션 저장소에 저장됩니다 : 당신은 또한 여기에 IdempotenceService에서 살펴 봐야 할 수 있습니다 https://github.com/Shuttle/Shuttle.Esb

이 경우 SQL Server와 유사 함) 메시지 처리가 성공적으로 완료된 후에 만 ​​전송됩니다.

메시지 처리기 외부로 보내는 경우 트랜잭션 보낼 편지함 (SQL Server 테이블 기반 큐가 작동 함)을 사용할 수 있습니다.

요점은 당신이 당신의 디자인에 진지한 생각을 줄 필요가 있고 그것이 까다로울 것이라는 것입니다.

+0

저는 이것을 구현하는 방법을 정확히 알고 있습니다. SQL 지원 솔루션은 그것에 대한 순진한 해결책이 될 것입니다. 제 문제는 Postgres/MySQL보다는 RabbitMQ 성능 레벨에서 효율적으로 그렇게 할 수있는 적절한 소프트웨어를 찾는 것입니다. –

0

가장 보편적 인 제품을 타겟팅하여 실수를 저질렀습니다. ActiveMQ는 고 가용성 및 트랜잭션을 완벽하게 지원하므로 방금 전환했고 문제는 사라졌습니다.

0

우리의 기본 형식으로, 생산이 똑같이 일을 몇 가지 시스템을 가지고, •

  • 메시지
  • 작업을 수행 인정

    1. 가져 오기 메시지가

    여기서 2 단계가 실패하면 메시지 A는 "다시 대기"되고 다시 선택 될 수 있습니다.

    메시지가 대기열로 보내지고 성공적으로 수신되면 해당 메시지는 ready으로 표시됩니다. 그런 다음 소비자에게 전송되면 해당 소비자가 대기열에서 어느 지점에서 제거되었는지 확인하기 전까지 unacked으로 표시됩니다. 단계 # 6에서 메시지를 인정 때까지 당신의 예에서

    , 그것은 작업자 프로세스 단계 # 6 RabbitMQ에 다시 ready 상태로 미끄러 메시지가 표시되기 전에 사망 한 경우 의미하는 unacked 상태로 아직, 다른 작업자에게 보낼 준비가되었습니다.

    이 기능은 사용자가 수신 확인을 명시 적으로 사용하지 않도록 설정하지 않았다는 사실에 의존합니다. 그렇다면 메시지가 소비자에게 전송되면 즉시 대기열에서 제거됩니다.

  • +0

    메시지 A 다음에 후속 메시지 B를 보내려면 어떻게해야합니까? 분명히, 원자적인 방식으로 - "대답하고 게시하는 메시지 B"또는 "noack와 메시지 B가 출판 된 적이 없다"? –

    +0

    이 경우 "_ 작업 _"단계에서 메시지 B를 보내므로 메시지 A가 수신되면 메시지 B가 전송되었음을 알 수 있으며 그 반대의 경우도 마찬가지입니다. –

    +0

    메시지를 보낼 수는 있지만 작업을 수행 할 수없는 경우 어떻게해야합니까? –

    관련 문제