RabbitMQ AMQP.Podstawowe cechy.Wartości konstruktora

W kliencie Java RabbitMQ / AMQP możesz utworzyć AMQP.BasicProperties.Builder i użyć go do build() wystąpienia AMQP.BasicProperties. Ta wbudowana instancja właściwości może być następnie używana do różnego rodzaju ważnych rzeczy. Jest wiele metod w stylu "builder" dostępnych w tej klasie builder:

BasicProperties.Builder propsBuilder = new BasicProperties.Builder();
propsBuilder
    .appId(???)
    .clusterId(???)
    .contentEncoding(???)
    .contentType(???)
    .correlationId(???)
    .deliveryMode(2)
    .expiration(???)
    .headers(???)
    .messageId(???)
    .priority(???)
    .replyTo(???)
    .timestamp(???)
    .type(???)
    .userId(???);

Szukam, jakie pola te metody budowania pomagają "budować", i co najważniejsze, jakie ważne wartości istnieją dla każdego pola. Na przykład, co to jest clusterId i jakie są jego ważne wartości? Co to jest type, a jakie są jego ważne wartości? Itd.

Cały ranek przeszukiwałem:

We wszystkich tych dokumentach nie mogę znaleźć jasnych definicji (poza jakimś niejasnym wyjaśnieniem tego, co priority, contentEncoding i deliveryMode są) tego, czym jest każde z tych pól, oraz jakie są ich ważne wartości. Czy ktoś wie? Co ważniejsze, czy ktoś wie, gdzie są one w ogóle udokumentowane? Z góry dzięki!

Author: Renat Gilmanov, 2013-08-23

3 answers

Zazwyczaj używam bardzo prostego podejścia do zapamiętywania czegoś. Podam wszystkie szczegóły poniżej, ale oto prosty obraz pola i wartości podstawowych właściwości. Próbowałem również poprawnie podświetlić kontekst kolejki / serwera i aplikacji.

Tutaj wpisz opis obrazka

Jeśli chcesz, żebym go trochę powiększył-po prostu zostaw mały komentarz. To, czego naprawdę chcę, to dostarczyć jakiś wizualny klucz i uprościć zrozumienie.

Opis wysokiego poziomu (Źródło 1, źródło 2):

Zwróć uwagę, że CLUST ID jest przestarzały, więc go wykluczę.

  • ID aplikacji - identyfikator aplikacji, która wytworzyła wiadomość.
    • Context: zastosowanie aplikacji
    • wartość: może być dowolnym ciągiem znaków.
  • Content Encoding - kodowanie treści wiadomości
    • Context: zastosowanie aplikacji
    • wartość: kodowanie zawartości MIME (np. gzip)
  • Typ Zawartości - Typ treści wiadomości
    • Context: zastosowanie aplikacji
    • wartość: typ zawartości MIME (np. application/json)
  • Correlation ID - wiadomość skorelowana z tą, np. na jakie żądanie ta wiadomość jest odpowiedzią. Aplikacje są zachęcane do używania tego atrybutu zamiast umieszczania tych informacji w ładunku komunikatów.
    • Context: zastosowanie aplikacji
    • wartość: dowolna wartość
  • tryb dostawy - powinien wiadomość zostanie przesłana na dysk?
    • Context: queue implementation use
    • wartość: non-persistent (1) lub persistent (2)
  • Expiration - Czas wygaśnięcia, po którym wiadomość zostanie usunięta. Wartość pola wygaśnięcia opisuje okres TTL w milisekundach. Zobacz szczegóły poniżej.
    • Context: queue implementation use
  • Headers - Dowolna wiadomość specyficzna dla aplikacji nagłówki.
    • Context: zastosowanie aplikacji
  • Message ID - identyfikator wiadomości jako ciąg znaków. Jeśli aplikacje muszą identyfikować wiadomości, zaleca się, aby używały tego atrybutu zamiast umieszczania go w ładunku komunikatów.
    • Context: zastosowanie aplikacji
    • wartość: dowolna wartość
  • priorytet - priorytet wiadomości.
    • Context: queue implementation use
    • wartości: 0 do 9
  • ReplyTo - Nazwa kolejki inne aplikacje powinny wysłać odpowiedź. Często używany do nazwania kolejki odpowiedzi (lub innego identyfikatora, który pomaga aplikacji konsumenckiej skierować odpowiedź). Aplikacje są zachęcane do używania tego atrybutu zamiast umieszczania tych informacji w ładunku komunikatów.
    • Context: zastosowanie aplikacji
    • wartość: dowolna wartość
  • znacznik czasu - znacznik czasu momentu, w którym wiadomość została wysłane.
    • Context: zastosowanie aplikacji
    • wartość: sekundy od epoki.
  • Type - Typ wiadomości, np. jakiego typu zdarzenie lub polecenie reprezentuje ta wiadomość. Zalecany do stosowania przez aplikacje zamiast włączania tych informacji do ładunku wiadomości.
    • Context: zastosowanie aplikacji
    • wartość: może być dowolnym ciągiem znaków.
  • User ID - opcjonalny identyfikator użytkownika. Zweryfikowane przez RabbitMQ w stosunku do rzeczywistego nazwa użytkownika połączenia.
    • Context: queue implementation use
    • Value: Should be authenticated user.

BTW, w końcu udało mi się przejrzeć najnowszy kod sever (rabbitmq-server-3.1.5), jest przykład w rabbit_stomp_test_util.erl:

                content_type     = <<"text/plain">>,
                content_encoding = <<"UTF-8">>,
                delivery_mode    = 2,
                priority         = 1,
                correlation_id   = <<"123">>,
                reply_to         = <<"something">>,
                expiration       = <<"my-expiration">>,
                message_id       = <<"M123">>,
                timestamp        = 123456,
                type             = <<"freshly-squeezed">>,
                user_id          = <<"joe">>,
                app_id           = <<"joe's app">>,
                headers          = [{<<"str">>, longstr, <<"foo">>},
                                    {<<"int">>, longstr, <<"123">>}]
Dobrze wiedzieć, że ktoś chce znać wszystkie szczegóły. Ponieważ o wiele lepiej jest używać dobrze znanych atrybutów wiadomości, gdy jest to możliwe, zamiast umieszczać informacje w treści wiadomości. BTW, podstawowe właściwości wiadomości nie są jasne i użyteczne. Powiedziałbym, że lepiej jest użyć niestandardowego.

Tutaj wpisz opis obrazka

Dobry przykład (źródło)

Tutaj wpisz opis obrazka

Pole Update-Expiration

Ważna uwaga: expiration należy do kontekstu kolejki. Więc wiadomość może zostać upuszczona przez serwery.

Tutaj wpisz opis obrazka

README mówi co następuje:

expiration jest shortstr; ponieważ RabbitMQ będzie spodziewaj się, że będzie to zakodowanego ciągu, tłumaczymy ttl na reprezentację ciągu jego wartości całkowitej.

Źródła:

 73
Author: Renat Gilmanov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-17 16:15:17

W momencie pisania:

  1. najnowszym standardem AMQP jest AMQP 1.0 OASIS Standard .
  2. najnowszą wersją RabbitMQ jest 3.1.5 (serwer i klient), który twierdzi, że obsługuje AMQP 0.9.1 (Schematy pdf i XML spakowane).
  3. RabbitMQ dostarcza własny opis protokołu jako schemat XML zawierający rozszerzenia (tzn. Niestandardowy), plus schemat XML bez rozszerzeń (który jest identyczny ze schematem linkowanym przez (2)) i pdf doc .

W tej odpowiedzi:

  • Linki w (3) są głównym źródłem szczegółów
  • (2) pdf doc jest używany jako dodatkowy szczegół, jeśli (3) jest nieodpowiedni
  • Kod źródłowy (klient java, serwer erlang) jest używany jako trzeciorzędny szczegół, jeśli (2) jest nieodpowiedni.
  • (1) na ogół nie jest używany - protokół i schemat zostały (dość) znacząco rozwinięte Dla / przez Oasis i powinny mieć zastosowanie do przyszłych wersji RabbitMQ, ale nie mają zastosowania teraz. The two wyjątki, w których użyto (1) dotyczyły opisów tekstowych contentType i contentEncoding - co jest bezpieczne, ponieważ są to standardowe pola z dobrymi opisami w AMQP 1.0.

Poniższy tekst jest parafrazowany z tych źródeł przeze mnie, aby uczynić go bardziej zwięzłym lub jasnym.

  • content-type (AMQP XML type="shortstr"; java type="String"): opcjonalne. Typ MIME RFC-2046 dla sekcji application-data (body) wiadomości. Może zawierać parametr charset definiowanie używanego kodowania znaków: np. 'text / plain; charset= "utf-8"'. Jeśli typ zawartości jest Nieznany, nie należy ustawiać typu zawartości, umożliwiając odbiorcy określenie rzeczywistego typu. Jeśli sekcja jest znana jako prawdziwie nieprzezroczyste dane binarne, typ zawartości powinien być ustawiony na application / octet-stream.
  • content-encoding (AMQP XML type = "shortstr"; java type= "String"): opcjonalne. Gdy występuje, opisuje dodatkowe kodowania treści stosowane do application-data, a więc jakie mechanizmy dekodowania należy zastosować, aby uzyskać Typ nośnika, do którego odwołuje się pole nagłówka content-type. Używany głównie w celu umożliwienia skompresowania dokumentu bez utraty tożsamości jego podstawowego typu zawartości. Modyfikator typu treści, interpretowany zgodnie z sekcją 3.5 RFC 2616. Poprawne kodowanie treści jest rejestrowane w IANA. Implementacje nie powinny używać kodowania compress, z wyjątkiem tego, aby zachować zgodność z oryginalnymi komunikatami wysyłane z innymi protokołami, np. HTTP lub SMTP. Implementacje nie powinny określać wielu wartości kodowania zawartości, z wyjątkiem tego, aby były zgodne z komunikatami pierwotnie wysłanymi z innymi protokołami, np. HTTP lub SMTP.
  • headers (AMQP XML type="table"; Java type="Map"): opcjonalne. Zdefiniowana przez Aplikację Lista parametrów nagłówka i ich wartości. Mogą one być ustawione tylko do użytku aplikacji. Dodatkowo możliwe jest tworzenie kolejek z "Typu wymiany nagłówków" - gdy kolejka jest tworzona, otrzymuje szereg nazw właściwości nagłówka do dopasowania, każda z opcjonalnymi wartościami do dopasowania, tak że przekierowanie do tej kolejki odbywa się poprzez dopasowanie nagłówka.
  • deliveryymode (RabbitMQ XML type = "octet"; java type= "Integer"): 1 (nietrwałe) lub 2 (trwałe). Działa tylko dla kolejek, które implementują persistence. Trwała wiadomość jest bezpiecznie przechowywana na dysku i gwarantowana do dostarczenia nawet w przypadku poważnej awarii sieci, awaria serwera, przepełnienie itp.
  • priority (AMQP XML type="octet"; java type="Integer"): względny priorytet wiadomości ( 0 do 9 ). Komunikat o wysokim priorytecie to [może być?? - GB] wysyłane przed wiadomościami o niższym priorytecie czekającymi w tej samej kolejce wiadomości. Gdy wiadomości muszą zostać odrzucone w celu utrzymania określonego poziomu jakości usługi, Serwer najpierw odrzuci wiadomości o niskim priorytecie. Działa tylko dla kolejek, które implementują priorytety.
  • correlation-id (AMQP XML type = "octet"; java type = "String"): opcjonalne. Do użytku aplikacji, brak formalnego (RabbitMQ) zachowania. Identyfikator specyficzny dla klienta, który może być używany do oznaczania lub identyfikacji wiadomości między klientami.
  • replyTo (AMQP XML type="shortstr"; java type="String"): opcjonalne. W przypadku użycia aplikacji nie ma formalnego zachowania (RabbitMQ), ale może zawierać nazwę prywatnej kolejki odpowiedzi, gdy jest używana w wiadomościach żądania. Adres węzła do wyślij odpowiedzi do.
  • expiration (AMQP XML type="shortstr"; java type="String"): opcjonalne. RabbitMQ AMQP 0.9.1 schemat z (3) stwierdza "do użytku implementacyjnego, brak formalnych zachowań". AMQP 0.9.1 schema pdf from (2) określa bezwzględny czas, kiedy ta wiadomość jest uważana za wygasłą. Jednak oba te opisy muszą być zignorowane, ponieważ ten link TTL i Kod klienta/serwera wskazują, że poniższe informacje są prawdziwe. Od klienta, wygaśnięcie jest wypełniane tylko poprzez niestandardową inicjalizację aplikacji podstawowych właściwości. Na serwerze jest to używane do określenia TTL od punktu, w którym wiadomość jest odbierana na serwerze, przed kolejką. Serwer wybiera TTL jako minimum (1) message TTL (Client BasicProperties expiration jako relatywny czas w milisekundach) oraz (2) queue TTL (configured x-message-TTL w milisekundach). Format: string quoted integer reprezentujący liczbę milisekund; czas wygaśnięcia od otrzymania wiadomości na serwerze.
  • message-id (AMQP XML type="shortstr"; java type="String"): opcjonalne. Do użytku aplikacji, brak formalnego (RabbitMQ) zachowania. Jeśli jest ustawiona, producent wiadomości powinien ustawić ją na globalnie unikalną wartość. W przyszłości (AMQP 1.0) broker może odrzucić wiadomość jako DUPLIKAT, jeśli wartość message-id odpowiada wartości wcześniej otrzymanej wiadomości wysłanej do tego samego węzła.
  • timestamp (AMQP XML type= "timestamp"; java type= " java.util.Data"): Opcjonalne. Do użytku aplikacji, brak formalnego (RabbitMQ) zachowania. Absolutny czas, kiedy ta wiadomość została utworzona.
  • type (AMQP XML type=" shortstr"; Java type= "String"): opcjonalne. Do użytku aplikacji, brak formalnego (RabbitMQ) zachowania. [Opisuje wiadomość jako "typ", "formularz" lub "transakcję biznesową" - GB]
  • userId (AMQP XML type = "shortstr"; java type = "String"): opcjonalne. XML Schema stwierdza "do użytku aplikacji, brak formalnego (RabbitMQ) zachowania" - ale wierzę, że zmieniło się to w najnowszej wersji (Czytaj dalej). Jeśli jest ustawiona, klient ustawia tę wartość jako tożsamość użytkownika odpowiedzialnego za wytworzenie wiadomości. From RabbitMQ: Jeśli ta właściwość jest ustawiona przez wydawcę, jej wartość musi być równa nazwie użytkownika użytego do otwarcia połączenia (tzn. następuje Walidacja, aby upewnić się, że jest on podłączonym/uwierzytelnionym użytkownikiem). Jeśli identyfikator użytkownika własność nie jest ustawiona, tożsamość wydawcy pozostaje prywatna.
  • appId (RabbitMQ XML type="shortstr"; java type="String"): opcjonalne. Do użytku aplikacji, brak formalnego (RabbitMQ) zachowania. Identyfikator tworzenia aplikacji. Mogą być wypełniane przez producentów i odczytywane przez konsumentów. (Patrząc na kod serwera r-MQ, nie jest on w ogóle używany przez serwer, chociaż wtyczka "webmachine-wrapper" zapewnia skrypt i dopasowane szablony do tworzenia webmachine-gdzie administrator może zapewnić appId do skryptu.)
  • cluster Id (RabbitMQ XML type="N/A"; java type="String"): przestarzały w AMQP 0.9.1 - tzn. nie używany. w poprzednich wersjach był identyfikatorem trasowania wewnątrz klastra, używanym przez aplikacje klastrowe, które nie powinny być używane przez aplikacje klienckie (tzn. nie wypełnione). Jest to jednak przestarzałe i usunięte z obecnego schematu i nie jest używane przez kod serwera r-MQ.

Jak widać powyżej, zdecydowana większość te właściwości nie mają wartości wyliczonych / ograniczonych / zalecanych, ponieważ są "tylko do użytku aplikacji" i nie są używane przez RabbitMQ. Więc masz łatwą pracę. Możesz swobodnie zapisywać / odczytywać wartości, które są przydatne dla Twojej aplikacji - o ile pasują do typu danych i kompilują :). ContentType i contentEncoding są zgodne ze standardowym użyciem HTTP. DeliveryMode i priority są liczbami ograniczonymi.

Uwaga: przydatne, ale proste stałe dla AMQP.Podstawowe właściwości są dostępne w klasie MessageProperties .

Pozdrawiam :) [9]}

UPDATE TO POST:

Z podziękowaniami dla Renata (Zobacz komentarze), spojrzałem na kod serwera erlang w rabbit_amqqueue_process.erl i dokumentacja w RabbitMQ rozszerzenia TTL do AMQP . Można podać datę wygaśnięcia wiadomości (time-To-live)

  • W kolejce via:

    Map<String, Object> args = new HashMap<String, Object>();
    args.put("x-message-ttl", 60000);
    channel.queueDeclare("myqueue", false, false, false, args);
    
  • Lub za wiadomość przez:

    byte[] messageBodyBytes = "Hello, world!".getBytes();
    AMQP.BasicProperties properties = new AMQP.BasicProperties();
    properties.setExpiration("60000");
    channel.basicPublish("my-exchange", "routing-key", properties, messageBodyBytes);
    

Tutaj TTL / expiration jest w milisekach, więc 60 SEK w każdym przypadku. Zaktualizowali powyższą definicję wygaśnięcia , aby odzwierciedlić to.

 9
Author: Glen Best,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-01 04:50:22

Spec AMQP definiuje ogólny, rozszerzalny model właściwości.

Właściwości AMQP są w pewnym sensie podobne do nagłówków HTTP, ponieważ reprezentują metadane dotyczące danych wiadomości. Podobnie jak w HTTP, są one oprawione oddzielnie do ładunku wiadomości. Ale są one w zasadzie kluczem/wartością mapy.

Niektórzy brokerzy, tacy jak RabbitMQ, zinterpretują pewne właściwości wiadomości, takie jak expiration, aby dodać dodatkową wartość specyficzną dla dostawcy (w tym przypadku, wymuszając TTL ).

Ale w końcu, właściwości AMQP to tylko duża grupa par klucz / wartość, które są bezpiecznie wysyłane wraz z każdą wiadomością, jeśli zdecydujesz się to zrobić. Dokumentacja Twojego brokera AMQP powie Ci, które z nich interpretują specjalnie i jak wysłać własne.

To wszystko, jeśli zadajesz to pytanie w pierwszej kolejności, prawdopodobnie nie musisz się o nie martwić. Będziesz z powodzeniem mógł wysyłać wiadomości bez martwienia się o ustawianie dowolnych właściwości wiadomości.
 0
Author: Brian Kelly,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-27 02:49:35