Когато потребителят получи съобщението и задачата за обработка приключи, той изпраща ack с този идентификатор на съобщението, за да уведоми сървъра, че съобщението е получено и обработката е завършена. RabbitMQ изчаква, докато връзката на потребителя, обработващ съобщение, бъде загубена, преди да установи, че съобщението не е обработено правилно, затова RabbitMQ го препредава. Потвърждението на съобщението е изключено по подразбиране. Съществува параметър noAck при инициализация на Consumer,Ако е настроено на true, потребителят ще върне ack веднага щом получи съобщението。
Общо взето, често използваният сценарий noack обикновено е настроен на true, но за проекти с високи рискови изисквания, като плащане. За всяко съобщение трябва да гарантираме неговата почтеност и коректност. След като получите съобщението, трябва да потвърдите, че е изпълнена правилната бизнес логика, и след това активно да върнете ack към сървъра. Можете да видите съобщенията в опашката чрез командата rabbitmqctl list_queues име message_rady message_unacknowleded или чрез интерфейса за управление на фона.
Ако noAck е настроен на false, клиентът трябва активно да изпрати ack към сървъра, а ако клиентът не потвърди съобщението, ще възникне следната ситуация:
Докато програмата все още работи, тези 10 съобщения остават неактивирани и не могат да бъдат предоставени от RabbitMQ. Още по-силно е, чеКонсумацията на съобщения в RabbitMQ няма механизъм за тайм-аут, тоест, ако програмата не се рестартира, съобщението винаги ще бъде в състояние Unacked. Не забравяйте тези съобщения за състояние без атак, когато работите по оперативни събития.
Готов ли съм
Съобщения с този статус съществуват в опашката за обработка.
Непризнато
Съобщение в този статус показва, че вече се обработва, но не се потвърждава.
Когато програмата е затворена (докато потребителят е затворен), тези 10 съобщения се връщат в състояние Готовност.
Съобщение за потвърждение
Ами ако клиентът изпрати ack към сървъра? Тоест, потвърди получаването на съобщението? Кодът е следният:
Когато вторият параметър на метода BasicAck, кратен, е зададен на false, това означава, че RabbitMQ получава известие, че текущото съобщение е потвърдено.Ако е вярно, допълнително съобщение, по-малко от тага за доставка, зададен от първия параметър, ще бъде признато。 (Масовото потвърждение е за целия канал)
Потвърждение за отмяна
Ами ако някой от клиентите на разпределената програма има изключение и иска да анулира потвърждението на съобщението и да остави други клиенти да го обработят?
Когато има изключение в съобщението за потребление, трябва да отменим потвърждението и тогава можем да използваме метода basicReject на Channel.
Първият параметър определя етикета за доставка, а вторият параметър описва как да се обработи това съобщение за провал.Стойност на true означава, че съобщението се поставя обратно в заглавието на опашката, а стойността на false означава, че съобщението е изоставено。
|