簡體   English   中英

Apache Pulsar Reader 仍然可以收到應該刪除的消息

[英]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);
        }
    }

您在閱讀器界面中遇到的行為似乎是一種可能的情況。 在這種情況下,文檔是不正確的,因為消息在確認后沒有被明確刪除。 如果包含它們的分類帳仍然存在,則可以閱讀這些消息。

實際上,這部分文檔將在未來的版本中進行更改

請注意,不再存儲的消息不一定會立即刪除,實際上可能在下一次分類帳翻轉之前仍然可以訪問。 由於客戶無法預測何時可能發生翻轉,因此依賴在不方便的時間點不會發生翻轉是不明智的。

默認情況下,當 Pulsar 消息到達代理時,它將被存儲,直到它被所有訂閱確認,此時它將被標記為刪除。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM