2012-11-19 18 views
10

Jaka jest algorytmiczna złożoność czasowa stosowania selektorów JMS podczas pobierania wiadomości z kolejki, w odniesieniu do głębokości kolejki n? W szczególności czy jest liniowy (O (n)) na odczyt? Czy jest zależny od wdrożenia (od dostawcy JMS) i czy zależy od tego, które pola są wymagane?W jaki sposób selektory JMS skalują się z głębokością kolejki?

(jeśli zależy od implementacji, szczególnie interesuje mnie zachowanie Websphere MQ i Solace, ale z przyjemnością przyjmuję odpowiedzi dotyczące konkretnego dostawcy JMS, szczególnie jeśli masz linki do dokumentacji opisującej złożoność!).

Motywacja: każda wiadomość ma dwie właściwości: invocationID i batchName. Partia składa się z kilku inwokacji. Klienci chcą konsumować wiadomości na jeden z dwóch sposobów; albo przez invocationID lub przez batchName. W momencie, w którym powstają wiadomości, nie wiem, jaką metodą zostaną one wykorzystane.

ten może być realizowany przez selektorów:

invocationID=42 

Or

batchName="reconciliation" 

... i mogę przyspieszyć jeden z nich się za pomocą identyfikatora korelacji zamiast właściwości niestandardowej, ale jestem zaniepokojony, że drugi pozostanie powolny.

+0

Świetne pytanie! Podejrzewam, że bardzo trudno jest uzyskać dobrą odpowiedź, ale oczywiście ma fundamentalne znaczenie dla podejmowania pewnych decyzji architektonicznych. –

+0

Dzięki @TomAnderson! – bacar

Odpowiedz

3

According to the docs, wiadomości są wyszukiwane sekwencyjnie. WMQ jednak indeksuje pola MessageID i CorrelID. Centrum informacyjnym opisuje zachowanie się następująco:

Wybór wiadomości z kolejki wymaga WebSphere MQ do sekwencyjnego sprawdzać każdą wiadomość w kolejce. Wiadomości są sprawdzane, dopóki nie zostanie znaleziony komunikat zgodny z kryteriami wyboru lub nie ma więcej wiadomości do sprawdzenia. W związku z tym wydajność przesyłania komunikatów jest zagrożona, jeśli wybrano wybór wiadomości w głębokich kolejkach.

Aby zoptymalizować wybór wiadomość na głębokich kolejek gdy wybór jest oparty na JMSCorrelationID lub JMSMessageID użyć ciąg dobór formie JMSCorrelationID = ... lub JMSMessageID = ... i odniesienie tylko jedną właściwość.

Ta metoda zapewnia znaczącą poprawę wydajności w zakresie wyboru w JMSCorrelationID i oferuje marginalną poprawę ulepszenia dla JMSMessageID.

Chciałbym zrozumieć więcej na temat wymagań dotyczących kolejek multipleksowych. Złożony selektor wpłynie na wydajność na czyjejkolwiek implementacji, a alternatywa użycia wielu otwartych uchwytów za pomocą prostszych selektorów nie różni się od kodu aplikacji, niż przy użyciu wielu kolejek. Oczywiście dla WMQ dynamiczne kolejki lub wiele stale zdefiniowanych kolejek nie stanowi problemu. Bardzo często, gdy widzę ten wymóg, pochodzi on ze sklepów, które używały pewnych innych transportów, gdzie wydajność wymaga poważnego nurkowania z wieloma zdefiniowanymi kolejkami i istnieje założenie, że jest to prawdą również w przypadku WMQ. W innych przypadkach wymóg został spełniony z subskrypcjami Pub/Sub i trwałymi subskrypcjami. Nie sugeruję, że nie ma żadnych ważnych przypadków dotyczących tego wymogu, tylko zastanawiam się, co go napędza.

+0

Świetna odpowiedź, dzięki za link! Same selektory nie będą skomplikowane (prawdopodobnie tylko równość na 1 własności) - to po prostu niekoniecznie będzie na korelacji! (który jest już używany). – bacar

+0

Moje selektory nie są złożone; Dodałem trochę szczegółów na temat mojej motywacji i usunąłem wzmiankę o multipleksowaniu, ponieważ było to trochę niedokładne. – bacar

+0

Dzięki za wyjaśnienie! Brzmi prawie jak problem Pub/Sub. Jedna kopia wiadomości może zostać umieszczona w kolejce przy użyciu subskrypcji administracyjnej, a klienci mogą pobierać wiadomości za pomocą CorrelID. Klienci zainteresowani inną nieruchomością mogą po prostu zapisać się do niej jako tematu. Mogłyby to być subskrypcje dynamiczne lub trwałe, ale ponieważ wybór byłby oceniany w momencie publikacji, każdy klient otrzymałby jedynie wiadomości, którymi był zainteresowany i mógł po prostu odczytać swoją kolejkę subskrypcji FIFO. Oczywiście, jeśli selekcje zmieniają się w czasie wykonywania, to nie działa. –

2

Wszystko zależy od implementacji. Wielu dostawców JMS przechowuje wiadomości w bazie danych SQL, aby mogli używać SQL do implementacji selektora. W takim przypadku musisz sprawdzić, w jaki sposób twój konkretny przypadek jest odwzorowany na SQL.

Co do WebSphereMQ - implementacja selektora to O (log n) dla JMSMessageID = sth i JMSCorrelationID = sth, dla innych nie posiadam żadnej konkretnej wiedzy. Z doświadczenia wynika jednak, że O (n).

+0

Dzięki. Skąd znasz złożoność WMQ dla tych pól - czy masz linki do dowolnej dokumentacji, czy jest to oparte na profilowaniu/zgadywaniu? – bacar

+1

@bacar Kilka (więcej jak dziesięć lat temu) brałem udział w projekcie, który bardzo często wykorzystywał WMQ i przeprowadziliśmy testy wydajności. Analiza pokazała nam, że złożoność jest taka, jak napisałem. Nie znalazłem go jednak w żadnej dokumentacji. – ShyJ

1

W wersji 7 produktu WebSphere MQ zmieniono implementację selektorów. Za pomocą klienta JMS v7 i menedżera kolejki v7 QueueManager przetwarzanie wyboru jest wykonywane po stronie QueueManager. W przypadku klienta JMS v6 (lub w rzeczywistości klienta v7 pracującego w jego migracji) wszystkie komunikaty są przesyłane do klienta do przetwarzania. Jeśli współczynnik trafień pasującej wiadomości był niski, było dużo zmarnowanego wysiłku. Tak więc

Po v7 przetwarzanie jest wykonywane po stronie QueueManager, więc tylko te komunikaty, które są zgodne, są wysyłane do klienta.

Należy pamiętać, że QueueManager nie przechowuje złożonych indeksów właściwości wiadomości, tak jak baza danych. Więc prostsze selektory są lepsze.

+0

Dzięki. Wszystkie przydatne informacje, ale nadal mogą być liniowe, niezależnie od tego, czy używam wersji v6, czy v7 - to znaczy, podczas gdy v7 może wykonywać pracę na serwerze, a nie na kliencie, być może bardziej wydajnie, praca może nadal obejmować skanowanie wszystkich wiadomości w kolejce (O (n)), aby znaleźć taki, który pasuje do selektora. – bacar