2016-08-03 49 views
7

Mam projekt Azure WebJob, który uruchamiam lokalnie na moim komputerze. Słucha kolejki komunikatów Azure Service Bus. Nic tak jak Topics, tylko najbardziej podstawowa kolejka wiadomości.Jak zapobiec przetwarzaniu Azure przez webmasterów tej samej wiadomości wiele razy jednocześnie

Odbiera/przetwarza tę samą wiadomość wiele razy, uruchamiając się dwa razy natychmiast po otrzymaniu wiadomości, a następnie sporadycznie, gdy wiadomość jest przetwarzana.

Pytania:

  • Jak to się stało, że otrzymuję ten sam komunikat wielokrotnie natychmiast? Wydaje się, że to ponowne pobieranie przed zastosowaniem PeekLock?
  • Jak to się dzieje, że wiadomość jest ponownie odbierana, mimo że jest nadal przetwarzana? Czy mogę ustawić czas trwania PeekLock lub jakoś zablokować wiadomość tak, aby była przetwarzana tylko raz? Jak mogę zagwarantować, że każdy komunikat w kolejce jest przetwarzany tylko raz?
  • Chcę móc przetwarzać wiele wiadomości jednocześnie, ale nie tyle razy, ale ustawienie MaxConcurrentCalls na 1 nie wydaje się być moją odpowiedzią, czy też nie rozumiem tej właściwości?

Używam funkcji asynchronicznej, prosty wtryskiwacz i niestandardową JobActivator, więc zamiast statycznej metody void, mój podpis funkcji jest następująca:

public async Task ProcessQueueMessage([ServiceBusTrigger("AnyQueue")] MediaEncoderQueueItem message, TextWriter log) {...} 

Wewnątrz pracy, to porusza się kilka plików wokół w usłudze BLOB i wywoływanie (i czekanie) na koder mediów z usług multimedialnych. Tak więc, chociaż samo zadanie sieciowe nie zajmuje dużo czasu, zajmuje sporo czasu (15 minut, w przypadku niektórych plików).

Aplikacja uruchamia się, a po wysłaniu wiadomości do kolejki odpowiada. Jednakże, jest wyświetlany komunikat wiele razy tak szybko, jak jest odbierany komunikat:

Executing: 'Functions.ProcessQueueMessage' - Reason: 'New ServiceBus message detected on 'MyQueue'.' 
Executing: 'Functions.ProcessQueueMessage' - Reason: 'New ServiceBus message detected on 'MyQueue'.' 

Dodatkowo, podczas gdy zadanie jest uruchomione (i widzę wyjście z funkcjonalnością usług medialnych), będzie dostać inny „kopia” z kolejki.

Wreszcie po zakończeniu zadania nadal przetwarza tę samą wiadomość w sposób przerywany.

+1

Co to jest DeliveryCount i LockDuration określone w kolejce? –

+0

Muszę się temu przyjrzeć. Dziwne w LockDuration jest to, że pozornie dwa razy podnosi wiadomość prawie tak, jakby nie blokowała jej wcale. Zastanawiam się, czy to rzeczywiście problem ze sposobem, w jaki skonfigurowałem obsługę asynchroniczną? – AndrewP

+0

Brzmi nietypowo. Broker nigdy nie przekaże tej samej wiadomości więcej niż jednemu z konkurujących klientów, jeśli LockDuration nie wygasła. Podejrzewam, że dzieje się coś innego. Czy istnieje szansa, że ​​możesz udostępnić repro na GitHub lub BitBucket? –

Odpowiedz

7

Podejrzewam, co się dzieje: Maksymalnie DurationLock może być 5 minut. Jeśli przetwarzanie wiadomości zostanie wykonane w ciągu 5 minut, wiadomość zostanie oznaczona jako zakończona i usunięta z brokera. W przeciwnym razie wiadomość pojawi się ponownie, jeśli przetwarzanie potrwa dłużej niż 5 minut (straciliśmy blokadę wiadomości) i zostanie ponownie wykorzystana. Można to sprawdzić, patrząc na wiadomość o numerze: DeliveryCount.

Aby rozwiązać ten problem, można odnowić blokadę wiadomości tuż przed jej wygaśnięciem za pomocą BrokeredMessage.RenewLockAsync().

+0

Sprawdzę tę metodę i zajrzę do liczby dostawy i blokady czasu trwania. Dziwne jest to, że nie dzieje się to za każdym razem, i nie wydaje się, aby była ona bardzo spójna, kiedy to się dzieje, a także, że wydaje się przetwarzać tę samą wiadomość dwa razy natychmiast. Ale dzięki za wskazanie tej funkcji! – AndrewP

+0

@AndrewP Może to być również przypadek automatycznego ponawiania, jeśli twoja praca rzuca nieobsługiwany wyjątek, a identyfikator autokonfiguracji jest prawdziwy w konfiguracji magistrali usług. Możesz to sprawdzić, po prostu wyrzucając ex w funkcji wyzwalacza, a następnie wysyłając jedną wiadomość do tematu - powinieneś zobaczyć wykrywanie wiadomości aż do maksymalnej liczby prób. – JoeBrockhaus

+0

Czy zamek domyślnie nie jest automatycznie przedłużany? Po 5 minutach blokada zostanie automatycznie odnowiona, jeśli przetwarzanie nadal trwa. Czy może czegoś brakuje? – GETah