[英]Apache Pulsar Reader can still get messages which should be deleted
我是 Apache Pulsar(也是 MQ 系統)的新手。 現在,我有一個關於 Pulsar Reader 的問題。
問題描述:
我啟動一個 Pulsar 實例,然后啟動一個消費者,監聽一個主題 A。然后我啟動一個生產者,向主題 A 發送 100 條消息,消費者消費了這 100 條消息,消費者訂閱中的 Backlog 值為 0。有該主題只有一個訂閱,並且是獨家的。
之后,我啟動了一個 Reader,設置 Reader 的主題為 A,Reader 可以從主題 A 獲取消息。
我在 Pulsar 文檔上找到了這個: https://pulsar.apache.org/docs/en/cookbooks-retention-expiry/
Pulsar 代理負責處理通過 Pulsar 傳遞的消息,包括消息的持久存儲。 默認情況下,經紀人:
立即刪除每個訂閱上已確認的所有消息,
並將所有未確認的消息持久存儲在積壓中。
這 100 條消息應該已經被刪除了。 那么為什么 Pulsar Reader 仍然可以從主題 A 中獲取消息呢?
我的代碼:
消費者:
private static void consume() {
try {
PulsarClient pulsarClient = PulsarClient.builder().serviceUrl("pulsar://127.0.0.1:6650").build();
Consumer<String> consumer = pulsarClient.newConsumer(Schema.STRING)
.topic("A")
.subscriptionName("first-subscription")
.subscribe();
for (int i = 0; true; ++i) {
try {
Message<String> msg = consumer.receive();
String m = msg.getValue();
System.out.println("\t m:" + m);
consumer.acknowledge(msg);
Thread.sleep(500);
} catch (Exception e) {
LOGGER.error("", e);
}
}
} catch (Exception e) {
LOGGER.error("", e);
}
}
生產商:
private static void produce() {
try {
PulsarClient pulsarClient = PulsarClient.builder().serviceUrl("pulsar://127.0.0.1:6650").build();
Producer<String> producer = pulsarClient.newProducer(Schema.STRING).topic("A").create();
for (int i = 0; i < 100; ++i) {
producer.send("producer-simple-partitioned-" + i);
}
} catch (Exception e) {
LOGGER.error("", e);
}
}
讀者:
private static void readerRead() {
try {
PulsarClient pulsarClient = PulsarClient.builder().serviceUrl("pulsar://127.0.0.1:6650").build();
Reader<byte[]> reader = pulsarClient.newReader()
.topic("A")
.startMessageId(MessageId.earliest)
.create();
while (true) {
Message message = reader.readNext();
System.out.println(new String(message.getData()));
}
} catch (PulsarClientException e) {
LOGGER.error("", e);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.