消息存活時(shí)間
本文介紹云消息隊(duì)列 RabbitMQ 版消息存活時(shí)間的核心概念、應(yīng)用場景、注意事項(xiàng)和設(shè)置方式。
什么是消息存活時(shí)間
在云消息隊(duì)列 RabbitMQ 版中,消息存活時(shí)間用于限制消息在Queue中可以存在的時(shí)間,如果消息在Queue中存在的時(shí)間超過了設(shè)置的消息存活時(shí)間,消息將會被進(jìn)行如下處理:
若您未給Queue設(shè)置死信Exchange,消息將被Queue直接丟棄。
若您為Queue設(shè)置了死信Exchange,則消息被丟棄后會被轉(zhuǎn)發(fā)到死信Exchange,由死信Exchange將其路由到目標(biāo)Queue。您可以在目標(biāo)Queue獲取該消息。更多信息,請參見死信Exchange。
應(yīng)用場景
消息存活時(shí)間可用于保障消息流通性。例如,某應(yīng)用的消息在某些特定時(shí)間會劇烈增加,如果您的業(yè)務(wù)可以接受消息丟失,您可以通過設(shè)置消息存活時(shí)間丟棄堆積的消息,從而保障消息流通性。
消息存活時(shí)間設(shè)置規(guī)則
云消息隊(duì)列 RabbitMQ 版支持通過x-message-ttl或expiration設(shè)置消息存活時(shí)間,不支持通過rabbitmqctl工具的policy進(jìn)行設(shè)置。
云消息隊(duì)列 RabbitMQ 版支持在創(chuàng)建Queue時(shí)為Queue設(shè)置消息存活時(shí)間,同時(shí)支持在消息發(fā)送時(shí)為消息設(shè)置存活時(shí)間。
如果兩個(gè)同時(shí)設(shè)置,則取最小的時(shí)間作為消息的存活時(shí)間。
延時(shí)消息的實(shí)際存活時(shí)間=min{消息級存活時(shí)間, Queue級別存活時(shí)間}+延時(shí)時(shí)間
。延時(shí)消息的具體信息,請參見延時(shí)消息。消息存活時(shí)間的取值上限和實(shí)例的定時(shí)時(shí)長一致;且取值必須為非負(fù)整型數(shù),單位為毫秒。
如果消息存活時(shí)間被設(shè)置為0,則消息到達(dá)Queue時(shí),除非立即被消費(fèi)者消費(fèi),否則會被立即丟棄或轉(zhuǎn)發(fā)到死信Exchange。
設(shè)置方式
云消息隊(duì)列 RabbitMQ 版支持您通過以下方式設(shè)置消息存活時(shí)間:
云消息隊(duì)列 RabbitMQ 版控制臺
您可以通過云消息隊(duì)列 RabbitMQ 版控制臺為指定Queue設(shè)置消息存活時(shí)間。具體操作,請參見Queue管理。
OpenAPI Explorer
您可以通過OpenAPI Explorer調(diào)用CreateQueue接口,為指定Queue設(shè)置消息存活時(shí)間。更多信息,請參見CreateQueue。
開源RabbitMQ SDK
您可以通過開源RabbitMQ SDK為指定Queue或某條消息設(shè)置消息存活時(shí)間。更多信息,請參見SDK列表。示例代碼如下:
通過x-message-ttl設(shè)置隊(duì)列級別的消息存活時(shí)間
Map<String, Object> props = new HashMap<String, Object>(); props.put("x-message-ttl", 1000); channel.queueDeclare("myqueue", false, false, false, props);
通過expiration設(shè)置消息級別的消息存活時(shí)間
byte[] messageBodyBytes = "test".getBytes(); AMQP.BasicProperties properties = new AMQP.BasicProperties.Builder() .expiration("1000") .build(); channel.basicPublish("myqueue", peoperties, messageBodyBytes);