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.
Co to jest DeliveryCount i LockDuration określone w kolejce? –
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
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? –