2016-07-28 6 views
2

Messenger 채팅 봇을 클라우드 환경에 작성하는 맥락에서 몇 가지 동시성 문제가 있습니다.채팅 봇 : 클러스터 된 환경에서 대화 단위로 메시지를 직렬 처리하도록 보장

특히, 동일한 대화의 수신 메시지가 하나씩 처리되도록하고 싶습니다.

제약 조건으로 Cloud 환경에서 작업자와 메시지를 처리하고 있습니다 (예 : 작업자 풀의 크기가 가변적이며 작업 인스턴스가 수명이 짧아서 충돌 할 수 있습니다). 또한 대기 시간도 중요합니다.

그래서 조금 추상화, 내 요구 사항은 다음과 같습니다

  • 나는 수신 메시지
  • 의 흐름이 이러한 메시지 중 각각 '주제 키'(대화 ID)의
  • 세트를 가지고 주제를 미리 알 수 없으며 사실상 무한합니다.
  • 같은 주제의 메시지가 순전히 처리되도록하려는 경우
  • 잠정적 인 임시 작업자 클러스터에
  • 가능한 경우 각 메시지가 정확히 한 번 처리되도록하는 등의 신뢰성 보장을 원합니다.

내 질문은 :

  1. 이름이 동시성 시나리오이 있습니까?
  2. 이 상자를 즉시 ​​구현하는 기술 (메시지 브로커, 조정 서비스 등)이 있습니까?
  3. 그렇지 않은 경우, 무엇을 낮은 수준의 동시성 도구 위에 구현할 수 있습니까? (분산 자물쇠, 배우, 대기열 등)

답변

1

시나리오에 널리 사용되는 이름을 모르지만 그 유형의 문제를 해결하는 일반적인 전략은 메시지를 라우팅하여 동일한 주제 키를 가진 모든 메시지가 끝나도록하는 것입니다 같은 목적지에서.당신을 위해 이것을 할 것입니다 기술의 몇 :

일부 메시지 브로커 업체 will also ensure all messages with the same topic key are processed in-order by the same consumer메시지로이 요구 사항을 참조 파티션 키와 같은 키 ancing.

약한 배달 메시징 시스템에 또 다른 일반적인 전략/주문 보장 (Amazon SQS를 같은) 간단하게 순서를 다시하고 필요에 따라 메시지를 누락 요청 재 전달하는 메시지의 시퀀스 번호를 포함하고 대상에 그것을두고하는 것입니다.

+0

감사합니다. ActiveMQ 또는 HornetQ에 의해 구현 된 메시지 그룹화가 필요한 항목입니다. –

+1

나는 내 자신의 검색으로 답을 완성 할 자유를 얻었다. –

0

대기열과 세트를 사용하여이 문제를 해결할 수 있다고 생각합니다. 내가 생각할 수있는 것은 모든 메시지 객체를 큐에 넣고 먼저 처리하는 것입니다. 그러나 대기열에 추가하는 동안 항목 이름이 집합에 추가되고 처리 중에 항목 이름이 집합에서 제거됩니다. 이제 주제가 설정되어있는 경우 동일한 주제의 다른 메시지 객체를 대기열에 추가하지 마십시오. 도움이되기를 바랍니다. 모든 베스트 :)

+0

기본적으로 이것은 A - 모든 주제에 분산 잠금을 사용하고 B - 잠금을 확보하지 못한 모든 메시지를 즉시 삭제합니다. 나는 A를 좋아하지 않고, B는 유스 케이스에서는 받아 들일 수 없다. –