to naprawdę zależy od tego, co próbujesz zrobić. Jeśli chcesz pobrać tylko jedną wiadomość z kolejki (pierwsza), prawdopodobnie powinieneś użyć basic.get
, jeśli planujesz przetwarzać wszystkie przychodzące wiadomości z kolejki - basic.consume
jest to, czego potrzebujesz.
Prawdopodobnie nie jest to pytanie specyficzne dla platformy lub biblioteki, ale pytanie dotyczące protokołu.
UPD
nie jestem zaznajomiony z nim pójść dobrze języka, więc postaram się podać kilka poinformowania AMQP szczegóły i opisać przypadki użycia.
Można uzyskać w kłopoty i mają napowietrznych z basic.consume
czasami:
Z basic.consume
masz taki obieg:
- Wyślij
basic.consume
metodę powiadomienia brokera, który chcesz otrzymywać wiadomości
- podczas gdy jest to metoda synchroniczna, poczekaj na wiadomość
basic.consume-ok
od brokera
- zacząć słuchać
basic.deliver
wiadomości z serwera
- jest to metoda asynchroniczna i należy dbać przez siebie sytuacjach, w których nie ma wiadomości na serwerze dostępne, na przykład Termin czytanie
Z basic.get
masz taki obieg:
- wysyłania sposób synchroniczny
basic.get
broker
- czekać na
basic.get-ok
metody, które posiadają wiadomości (S) lub basic.empty
metoda oznaczająca sytuację brak komunikatu na serwerze
Informacja o synchronicznych i asynchronicznych metod: Przewiduje się synchroniczny mieć jakąś odpowiedź, czy asynchroniczny nie
Uwaga na basic.qos
metoda prefetch-count
nieruchomości: jest ignorowane podczas no-ack
właściwość jest ustawiona na basic.consume
lub basic.get
.
Spec ma notatkę na temat basic.get
: "ta metoda zapewnia bezpośredni dostęp do wiadomości w kolejce za pomocą synchronicznego dialogu, który jest przeznaczony dla określonych typów aplikacji, w których synchroniczna funkcjonalność jest ważniejsza niż wydajność", która dotyczy ciągłych wiadomości konsumpcja.
Moje osobiste testy pokazują, że uzyskanie w wierszu 1000 wiadomości z basic.get
(0.38659715652466) jest szybsza niż uzyskanie 1000 wiadomości z basic.consume
pojedynczo (0.47398710250854) na RabbitMQ 3.0.1, Erlang R14B04 średniej więcej niż 15%.
Jeśli zajmiesz się tylko jedną wiadomością w wątku głównym, to Twoja sprawa - prawdopodobnie musisz użyć basic.get
.
Nadal można spożywać tylko jedną wiadomość asynchronicznie, na przykład w osobnym wątku lub użyć mechanizmu zdarzeń.Byłoby to lepsze rozwiązanie dla twojego zasobu maszynowego, ale musisz zadbać o sytuację, w której żaden komunikat nie jest dostępny w kolejce.
Jeśli trzeba przetwarzać wiadomość jeden po drugim jest oczywiste, że basic.consume
należy stosować, myślę
dziękuję za odpowiedź! jednak twoja ostatnia linia jest dokładnym problemem, z którym się borykam. Próbowałem utworzyć Pop(), używając zakresu nad kanałem dostawy, ale powracając, gdy tylko zostanie znaleziona wartość. Oczywiście, który zwrócił ostatnią wartość, ale również wyskoczył wszystkie inne wartości z kolejki w tle, a więc przeniosłem się do channel.Get(). Jestem nowy w kanałach i goroutines. Jak mogę zaimplementować tę funkcję, aby otrzymać najnowszą wartość z kanału chan? – pymd
jeszcze raz dziękuję! – pymd
Nie ma problemu, mam nadzieję, że działa! – Intermernet