2017-03-24 6 views
0

간단한 작업 대기열을 갖고 싶습니다. 여러 컴퓨터에서 실행되는 여러 소비자가 있지만 각 작업을 한 번만 소비해야합니다.Google PubSub을 사용하는 작업 대기열

동일한 구독 ID를 사용하는 주제에서 여러 명의 구독자가있을 경우 메시지가 두 번 읽힐 가능성이 있습니까? 나는이 라인을 따라 무언가를 성공적으로 테스트했지만 동기화 문제가있을 수 있다고 우려하고 있습니다. GCP의 약속에-최소 한 번 배달 : 짧은에서

client = SubscriberClient.create(SubscriberSettings.defaultBuilder().build()); 
subName = SubscriptionName.create(projectId, "Queue"); 
client.createSubscription(subName, topicName, PushConfig.getDefaultInstance(), 0); 

Thread subscriber = new Thread() { 
    public void run() { 
    while (!interrupted()) { 
     PullResponse response = subscriberClient.pull(subscriptionName, false, 1); 
     List<ReceivedMessage> messages = response.getReceivedMessagesList(); 
     mess = messasges.get(0); 
     client.acknowledge(subscriptionName, ImmutableList.of(mess.getAckId())); 
     doSomethingWith(mess.getMessage().getData().toStringUtf8()); 
    } 
    } 
}; 
subscriber.start(); 

답변

1

는, 그래 일부 메시지가 중복됩니다 기회가있다. 정확한 배포는 모든 분산 시스템에서 이론적으로 불가능합니다. 가능한 경우 중복 메시지가 문제가되지 않도록 가능한 한 멱수가되도록 doSomethingWith 코드를 디자인해야합니다.

메시지 처리가 끝나면 메시지를 확인해야합니다. acknowledge 이후에 컴퓨터가 사망하고 doSomethingWith이 반환되기 전에 발생하는 상황은 무엇입니까? 당신의 메시지는 사라질 것입니다! (이 근본적인 아이디어는 정확히 한 번 배송이 불가능한 이유입니다).

메시지 처리를 두 번 처리하는 것이 바람직하지 않은 경우 잠금 프로세스를 추가 할 수 있습니다 (일관된 데이터베이스에 "처리 된"토큰 쓰기). 메시지 처리 전에 쓰기가 처리되면 실패 할 수 있습니다. 그러나 현재로서는 안정성을 위해 최적화되지 않고 한 번에 설계된 메시징 기술을 찾을 수 있습니다.