consumer是通过订阅附加到topic,然后接收消息的过程。
Consumer 向 broker 发送消息流获取申请(flow permit request)以获取消息。 在 Consumer 端有一个队列,用于接收从 broker 推送来的消息。 你能够通过receiverQueueSize参数配置队列的长度 (队列的默认长度是1000) 每当 consumer.receive() 被调用一次,就从缓冲区(buffer)获取一条消息。
接收模式
可以通过同步(sync) 或者异步(async)的方式从brokers接受消息。
发送模式 | 说明 |
---|---|
同步接收 | 同步模式,在收到消息之前都是被阻塞的。 |
异步接收 | 异步接收模式会立即返回一个 future 值(如 Java 中的 CompletableFuture),一旦收到新的消息就立刻完成。 |
监听
客户端库为使用者提供侦听器实现。例如,Java客户端提供了一个MessageListener接口。在这个接口中,一旦接受到新的消息,received方法将被调用。
确认
消费者在成功消费一个消息后,向 Broker 发送一个确认请求。 然后,这条被消费的消息将被永久保存,只有在所有订阅者都确认后才会被删除。 如果希望消息被消费者确认后仍然保留下来,可配置消息保留策略实现。
对于批处理消息,你可以启用批处理索引确认,以避免将确认的消息分派给消费者。 关于批量索引确认的细节,请参见batching。
消息可以通过以下两种方式之一进行确认。
- 被单独承认。通过单独的确认,消费者确认每条消息,并向broker发送确认请求。
- 累积确认模式。通过累积确认,消费者只确认其收到的最后一条消息,所有之前(包含此条)的消息,都不会被再次发送给那个消费者。
如果你想单独确认消息,你可以使用以下API。
consumer.acknowledge(msg);
如果你想累计确认消息,你可以使用以下API。
consumer.acknowledgeCumulative(msg);
Note
在共享订阅模式中不能使用累积确认,因为共享订阅模式涉及多个可以访问同一订阅的使用者。在共享订阅模式下,消息会被单独确认。
取消确认
当一个消费者未能消费一个消息并打算再次消费它时,这个消费者应该向 Broker 发送一个否定的确认。 然后,Broker 将把这个消息重新传递给消费者。
根据消费订阅模式,单