Pulsar 消息概念1

Pulsar官方文檔 概念和架構-Messaging Concepts中主要內容

1 消息組成

組成 說明
Value / data payload 消息攜帶的數據,所有pulsar的消息攜帶原始bytes,但是消息數據也需要遵循數據shcema
Key 消息可以被Key打標籤。這可以對topic壓縮之類的事情起作用
Properties 用戶定義屬性的可選鍵/值映射
Producer name 生成消息的生產者的名稱(生產者自動被賦予默認名稱,但您也可以顯式地應用自己的名稱)
Sequence ID 每一個消息在其主題上都屬於一個有序序列。消息的序列ID是它在該序列中的順序
Publish time 消息發佈時的時間戳(由生產者自動應用)
Event time 一個可選的時間戳,應用程序可以附加到消息上,表示某個事件發生的時間,例如消息被處理的時間。如果未顯式設置,則消息的事件時間爲0。

2 生產者 發送模式

模式 說明
同步發送 生產者將在發送每個消息後等待代理的確認。如果未收到確認,則生產者將認爲發送操作失敗
異步發送 生產者將把消息放入阻塞隊列並立即返回。客戶端庫隨後將消息發送到後臺的代理。如果隊列已滿(最大大小可配置,則在調用API時,生產者可能會被阻止或立即失敗,具體取決於傳遞給生產者的參數

2.1 消息壓縮支持
LZ4
ZLIB
ZSTD
SNAPPY

2.2 支持批處理
如果啓用批處理,則生產者將在單個請求中累積併發送一批消息。批處理大小是由消息的最大數量和最大發布延遲定義的。
3 消費者 接收模式

模式 說明
同步接收 同步接收將被阻止,直到有消息可用
異步接收 異步接收將立即返回一個future值,例如Java中的CompletableFuture,該值在新消息可用時完成

3.1 監聽
客戶端庫爲用戶提供偵聽器實現。例如,Java客戶機提供了一個MessageListener接口。在這個接口中,只要接收到新消息,就會調用received方法。
3.2 確認
當使用者成功使用消息時,使用者會向代理髮送確認請求,以便代理丟棄該消息。否則,它將存儲消息。
消息可以逐個確認,也可以累積確認。對於累積確認,消費者只需要確認它收到的最後一條消息。流中直至(包括)所提供消息的所有消息將不會重新傳遞給該使用者
( 累積確認不能與共享訂閱模式一起使用,因爲共享模式涉及多個對同一訂閱具有訪問權限的使用者)
在共享訂閱模式下,可以單獨確認消息。
3.3 否定確認
當使用者一次未成功使用消息,並且希望再次使用該消息時,使用者可以向代理髮送否定的確認,然後代理將重新傳遞該消息。

消息可以被一個接一個地否定或累積地承認,這取決於消費訂閱模式。
在獨佔訂閱模式和故障轉移訂閱模式中,消費者只會消極地確認他們收到的最後一條消息。

在“共享”和“密鑰共享”訂閱模式中,您可以分別對消息進行否定性確認

3.4 確認超時
當消息未成功使用,並且您希望觸發代理自動重新傳遞消息時,可以採用未確認消息自動重新傳遞機制。客戶端將在整個確認超時時間範圍內跟蹤未確認消息,並在指定確認超時時自動向代理髮送重新傳遞未確認消息請求
注意
在確認超時之前使用否定確認。否定確認以更精確的方式控制單個消息的重新傳遞,並在消息處理時間超過確認超時時避免無效的重新傳遞。
4 死信主題
在某些消息無法由消費者使用時,會成生新的消息。在這種機制中,無法使用的消息存儲在一個單獨的主題中,稱爲死信主題。您可以決定如何處理死信主題中的消息
下面的示例演示如何使用默認的死信主題在Java客戶機中啓用死信主題

Consumer<byte[]> consumer = pulsarClient.newConsumer(Schema.BYTES)
.topic(topic)
.subscriptionName("my-subscription")
.subscriptionType(SubscriptionType.Shared)
.deadLetterPolicy(DeadLetterPolicy.builder()
.maxRedeliverCount(maxRedeliveryCount)
.build())
.subscribe();
默認的死信主題使用以下格式:
<topicname>-<subscriptionname>-DLQ
如果要指定死信主題的名稱,請使用以下Java客戶端示例:
Consumer<byte[]> consumer = pulsarClient.newConsumer(Schema.BYTES)
.topic(topic)
.subscriptionName("my-subscription")
.subscriptionType(SubscriptionType.Shared)
.deadLetterPolicy(DeadLetterPolicy.builder()
.maxRedeliverCount(maxRedeliveryCount)
.deadLetterTopic("your-topic-name")
.build())
.subscribe();
死信主題取決於郵件的重新傳遞。由於確認超時或否定確認,消息將重新傳遞。如果要對消息使用否定確認,請確保在確認超時之前對其進行否定確認。
注意
目前,死信主題僅在共享訂閱模式下啓用

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章