access设置0字段为null是因为类型转换失败_Apache Pulsar 2.6.1 版本正式发布:2.6.0 加强版,新增 OAuth2 支持
在 Apache Pulsar 2.6.0 版本發(fā)布后的 2 個(gè)月,2020 年 8 月 21 日,Apache Pulsar 2.6.1 版本正式發(fā)布!
Apache Pulsar 2.6.1 修復(fù)了 2.6.0 版本中的諸多問(wèn)題,改進(jìn)了一些功能,新增了對(duì) OAuth2 的支持,覆蓋 Broker、Pulsar SQL、Pulsar Functions、Go Function、Java Client 和 C++ Client,進(jìn)一步豐富了 Pulsar 作為云原生流數(shù)據(jù)平臺(tái)的功能。
在 Pulsar 2.6.1 版本中,來(lái)自社區(qū)的 commit 有 102 個(gè),越來(lái)越多的小伙伴開(kāi)始參與到 Pulsar 社區(qū)建設(shè)中,成為 Contributor 的一員。下面一起來(lái)看看 2.6.1 版本有哪些更新吧。
Broker 相關(guān)改進(jìn)
將批處理大小限制為 “maxNumberOfMessages” 和 “ maxSizeOfMessages” 的最小值
在 2.6.0 版本之前,BatchReceive 策略中 maxNumberOfMessages 和maxSizeOfMessages 的最小值不會(huì)影響批處理大小。當(dāng)批量大小大于 consumer 中設(shè)置的 receiveQueue 大小時(shí)(假設(shè)使用的批量大小為 3000,receiveQ 為 500),會(huì)出現(xiàn)以下問(wèn)題:
在 consumer 中使用多主題模式,client 被阻塞,導(dǎo)致不接收任何消息;即使用戶在批處理中設(shè)置超時(shí)策略,client 也不會(huì)恢復(fù)。
在 2.6.1 版本中,我們把批處理大小設(shè)置為 “maxNumberOfMessages” 和 “maxSizeOfMessages” 中的最小值,修復(fù)了該問(wèn)題。
更多詳情查看 PR-6865:https://github.com/apache/pulsar/pull/6865。
解決 Key_Shared 中使用粘性 hash range 導(dǎo)致的哈希范圍沖突問(wèn)題
在以前的版本中,當(dāng)用戶在 Key_Shared 訂閱模型中使用 “stickyHashRange” 時(shí),consumer 指定的 hash 范圍不允許重疊。例如,consumer-1 的哈希范圍為:[[0,99],[400,65535]],consumer-2 的哈希范圍為:[[100,399]]。
這是因?yàn)樵?broker 端,沒(méi)有對(duì) stick hash range 中的 start 和 end 位置進(jìn)行檢查。正常情況下不允許 start 大于 end 的位置。在 2.6.1 版本中,我們加入了相應(yīng)的 check 機(jī)制,來(lái)避免出現(xiàn) hash range 沖突的問(wèn)題。
更多詳情查看 PR-7231:https://github.com/apache/pulsar/pull/7231。
修復(fù)獲取 lookup 權(quán)限的錯(cuò)誤
當(dāng)前,當(dāng) Pulsar AuthorizationService 檢查 lookup 權(quán)限時(shí),擁有 canProducer 或 canConsumer角色應(yīng)該具備可以 canLookup 的能力,但實(shí)際上并沒(méi)有該能力。代碼如下:
java try { return canLookupAsync(topicName, role, authenticationData) .get(conf.getZooKeeperOperationTimeoutSeconds(), SECONDS); }
如果 canProduce 或 canConsume 方法拋出異常,canLookup 只會(huì)拋出該異常,不檢查其他權(quán)限。
在 2.6.1 版本中,使用 canLookupAsync 代替原來(lái)的行為,更多詳情查看 PR-7234:https://github.com/apache/pulsar/pull/7234 。
修復(fù)創(chuàng)建 non-durable cursor 時(shí)無(wú)法刪除 topic 的錯(cuò)誤
當(dāng)非持久游標(biāo)創(chuàng)建失敗時(shí),會(huì)返回 NPE。因?yàn)槌绦虬l(fā)生 NPE 后,仍在繼續(xù)創(chuàng)建訂閱實(shí)例:
java try { cursor = ledger.newNonDurableCursor(startPosition, subscriptionName); } catch (ManagedLedgerException e) { subscriptionFuture.completeExceptionally(e); } return new PersistentSubscription(this, subscriptionName, cursor, false);
將導(dǎo)致該 topic 的引用計(jì)數(shù)加一。當(dāng)用戶想要?jiǎng)h除這個(gè) topic 時(shí),由于引用計(jì)數(shù)沒(méi)有清零,所以即使使用 --force 強(qiáng)制刪除,也無(wú)法刪除 topic。在 2.6.1 版本中,我們解決了無(wú)法刪除 topic 的問(wèn)題。
更多詳情查看 PR-7355:https://github.com/apache/pulsar/pull/7355。
避免在 ManagedLedgerImpl.isOffloadedNeedsDelete 方法中發(fā)生 NPE
在 2.6.1 版本之前,offload-deletion-lag 的默認(rèn)值為 null,導(dǎo)致了 NPE 問(wèn)題。在 2.6.1 版本中,我們?cè)?ManagedLedgerImpl.isOffloadedNeedsDelete 方法中添加對(duì) null 值的檢查,避免出現(xiàn)該問(wèn)題。
更多詳情查看 PR-7389:https://github.com/apache/pulsar/pull/7389 。
修復(fù)創(chuàng)建新 ledger 時(shí)引發(fā) NPE 導(dǎo)致生產(chǎn)者卡死的問(wèn)題
由于無(wú)法解析網(wǎng)絡(luò)地址,在創(chuàng)建 ledger 時(shí)會(huì)引發(fā) NPE。如果在添加超時(shí)任務(wù)之前引發(fā)了 NPE,則超時(shí)機(jī)制不起作用。無(wú)法解析的網(wǎng)絡(luò)地址在 Kubernetes 環(huán)境中很常見(jiàn)。當(dāng) bookie pod 或工作程序節(jié)點(diǎn)重新啟動(dòng)時(shí),可能會(huì)發(fā)生這種情況。
在 2.6.1 版本中,可通過(guò)以下操作來(lái)修復(fù)該問(wèn)題:
- 在創(chuàng)建一個(gè)新的 ledger 時(shí),捕獲這個(gè) NPE;
- 觸發(fā)超時(shí)任務(wù)時(shí),始終執(zhí)行回調(diào)。因?yàn)榛卣{(diào)只能觸發(fā)一次;
- 添加機(jī)制檢測(cè) “CreatingLedger” 狀態(tài)是否發(fā)生變化。
更多詳情查看 PR-7401:https://github.com/apache/pulsar/pull/7401。
修復(fù)使用 advertisedListeners 產(chǎn)生的 NPE 問(wèn)題
當(dāng)使用帶有外部 listener 名稱的 advertisedListeners = internal:pulsar:// node1:6650,external:pulsar://node1.external:6650 時(shí),broker 無(wú)法獲取名稱空間包的所有權(quán)。如果未啟用 TLS,我們需要更改 BrokerServiceUrlTls。
更多詳情查看 PR-7620:https://github.com/apache/pulsar/pull/7620 。
獲取最后一條 entry 時(shí),client 錯(cuò)誤地讀取 -1 這條 entry
在 2.6.1 版本之前,getLargestBatchIndexWhenPossible() 函數(shù)沒(méi)有 return 語(yǔ)句,當(dāng) entry 為 -1 時(shí),client 會(huì)對(duì)把相應(yīng)的 MessageData 設(shè)置為當(dāng)前位置的值,并將該值發(fā)送到 client,當(dāng) client 嘗試讀取該 entry,會(huì)出現(xiàn)如下問(wèn)題:
16:34:25.779 [pulsar-io-54-7:org.apache.bookkeeper.client.LedgerHandle@748] ERROR org.apache.bookkeeper.client.LedgerHandle - IncorrectParameterException on ledgerId:0 firstEntry:-1 lastEntry:-1 16:34:25.779 [pulsar-client-io-82-1:org.apache.pulsar.client.impl.ConsumerImpl@1986] INFO org.apache.pulsar.client.impl.ConsumerImpl - [persistent://external-repl-prop/pulsar-function-admin/assignment][c-use-fw-localhost-0-function-assignment-initialize-reader-b21f7607c9] Successfully getLastMessageId 0:-1 16:34:25.779 [pulsar-client-io-82-1:org.apache.pulsar.client.impl.ClientCnx@602] WARN org.apache.pulsar.client.impl.ClientCnx - [id: 0xc78f4a0e, L:/127.0.0.1:55657 - R:localhost/127.0.0.1:55615] Received error from server: Failed to get batch size for entry org.apache.bookkeeper.mledger.ManagedLedgerException: Incorrect parameter input 16:34:25.779 [pulsar-client-io-82-1:org.apache.pulsar.client.impl.ClientCnx@612] WARN org.apache.pulsar.client.impl.ClientCnx - [id: 0xc78f4a0e, L:/127.0.0.1:55657 - R:localhost/127.0.0.1:55615] Received unknown request id from server: 10
PR-7495 在代碼中增加了 return 語(yǔ)句,GetLastEntry() 會(huì)讀取最后一條 entry,而不是 -1。
更多詳情查看 PR-7495:https://github.com/apache/pulsar/pull/7495。
ZooKeeper 相關(guān)改進(jìn)
使用主機(jī)名進(jìn)行 Bookie 機(jī)架感知映射
PR-5607 中添加了 useHostName() 和 return false。這意味著機(jī)架式策略會(huì)嘗試將 Bookie 主機(jī)名解析為 IP 地址,然后使用該 IP 地址來(lái)確定 Bookie 屬于哪個(gè)機(jī)架。
這會(huì)導(dǎo)致如下兩個(gè)問(wèn)題:
- IP 地址與在/ bookies z-節(jié)點(diǎn)中記錄的主機(jī)名不匹配;
- 如果在解析 bookie 主機(jī)名時(shí)發(fā)生錯(cuò)誤(例如:瞬態(tài) DNS 錯(cuò)誤),會(huì)觸發(fā) NPE 異常;對(duì) BookKeeper 客戶端來(lái)說(shuō),該 bookie 在集群中一直不可用。
例如,在下面代碼中的第 77 行會(huì)拋出 NPE,因?yàn)?getAddress() 給出了一個(gè) null,而該地址沒(méi)有解析:
java 74 if (dnsResolver.useHostName()) { 75 names.add(addr.getHostName()); 76 } else { 77 names.add(addr.getAddress().getHostAddress()); 78 }
默認(rèn)情況下,DnsResolver.useHostName() 返回 true。
更多詳情參考 PR-7361:https://github.com/apache/pulsar/pull/7361。
Java Client 相關(guān)改進(jìn)
修復(fù)了無(wú)法重命名 Athenz 身份驗(yàn)證中使用的 HTTP header 的問(wèn)題
Athenz 的身份驗(yàn)證插件允許用戶更改 HTTP header 的名稱,并通過(guò) roleHeader 參數(shù)將身份驗(yàn)證令牌發(fā)送到代理服務(wù)器。更改 HTTP header 名稱會(huì)保留 “AuthenticationAthenz” 側(cè)的 “roleHeader” 參數(shù)的值,并將其直接用作標(biāo)頭名稱。
更多詳情參考 PR-7311:https://github.com/apache/pulsar/pull/7311。
修復(fù)多次回收 batch ack 的集合
多次回收 batch ack 的根本原因是批量 Ack 刷新和累積確認(rèn)中存在競(jìng)爭(zhēng)條件。因此,為該 ackset 添加回收狀態(tài)檢查,避免多次回收 batch ack。
更多詳情參考 PR-7409:https://github.com/apache/pulsar/pull/7409。
添加支持 OAuth2 身份驗(yàn)證的客戶端
Pulsar 支持使用 OAuth 2.0 訪問(wèn)令牌驗(yàn)證客戶端身份。可以使用令牌來(lái)標(biāo)識(shí) Pulsar 客戶端,并將令牌關(guān)聯(lián)到允許執(zhí)行某些操作(例如:發(fā)布到主題或從主題消費(fèi))的某些 “principal”(或“role”)。
該模塊直接支持 OAuth 2.0 的 Pulsar 客戶端身份驗(yàn)證插件。客戶端與 OAuth 2.0 服務(wù)器進(jìn)行通信后,將從 OAuth 2.0 服務(wù)器獲取“訪問(wèn)令牌”,并將該“訪問(wèn)令牌”傳遞給 Pulsar broker 進(jìn)行身份驗(yàn)證。
因此,代理方仍然可以使用 “org.apache.pulsar.broker.authentication.AuthenticationProviderToken”,
用戶也可以添加自己的 AuthenticationProvider 來(lái)使用此模塊。
更多詳情參考 PR-7420:https://github.com/apache/pulsar/pull/7420。
在 consumer 關(guān)閉之后,不再訂閱這個(gè) topic
當(dāng) consumer 重新連接到 broker 時(shí),將競(jìng)爭(zhēng)條件固定在 consumer 中。
在 consumer 重新連接到代理時(shí)會(huì)發(fā)生競(jìng)爭(zhēng)條件,消費(fèi)者重新連接到代理時(shí)連接設(shè)置為 null。如果此時(shí)關(guān)閉 cosnumer,客戶端不再向代理發(fā)送關(guān)閉 consumer 的命令。因此,如果 consumer 重新連接到 broker,consuemr 將再次發(fā)送訂閱命令。
在 2.6.1 版本中,當(dāng) consumer 的連接打開(kāi)時(shí),consumer 會(huì)添加狀態(tài)檢查。如果使用者狀態(tài)為關(guān)閉或正在關(guān)閉,則無(wú)需發(fā)送訂閱命令。
更多詳情參考 PR-7589:https://github.com/apache/pulsar/pull/7589。
OAuth2 身份驗(yàn)證插件使用 AsyncHttpClient
在之前的版本中,OAuth2 客戶端 auth 插件使用 Apache HTTP 客戶端庫(kù)發(fā)出請(qǐng)求,Apache HTTP 客戶端僅用于主機(jī)名驗(yàn)證。如 PR-7612 所述,為了擺脫對(duì) Apache HTTP 客戶端庫(kù)的依賴,在 2.6.1 版本中使用 AsyncHttpClient。AsyncHttpClient 在客戶端和 broker 中的其他地方都有使用。
更多詳情參考 PR-7615:https://github.com/apache/pulsar/pull/7615。
CPP Client 相關(guān)改進(jìn)
在 CPP 客戶端中支持 OAuth2 的認(rèn)證方式
Pulsar 支持使用 OAuth 2.0 訪問(wèn)令牌對(duì)客戶端進(jìn)行身份驗(yàn)證。可以使用令牌來(lái)標(biāo)識(shí) Pulsar 客戶端,并將其與允許執(zhí)行某些操作(例如:發(fā)布到主題或從主題消費(fèi))的某些“principal”(或“role”)關(guān)聯(lián)。
在 2.6.1 版本中,允許用戶在 CPP 客戶端中使用 OAuth2 的認(rèn)證方式。
更多詳情參考 PR-7467:https://github.com/apache/pulsar/pull/7467。
修復(fù)在關(guān)閉 callback 中 partition 索引的錯(cuò)誤
在分區(qū)生產(chǎn)者/消費(fèi)者中關(guān)閉 callback 時(shí),分區(qū)索引始終為 0。我們需要將 ProducerImpl / ConsumerImpl 的內(nèi)部 partition 索引字段傳遞給 PartitionedProducerImpl / PartitionedConsumerImpl 的 close 回調(diào)。
更多詳情參考 PR-7282:https://github.com/apache/pulsar/pull/7282。
修復(fù)了 C++ 客戶端中計(jì)時(shí)器的競(jìng)爭(zhēng)狀況導(dǎo)致的段崩潰
在 2.6.1 版本之前,競(jìng)爭(zhēng)條件下會(huì)發(fā)生段崩潰:
- 關(guān)閉操作,稱為 “keepAliveTimer_.reset()”;
- 同時(shí),在 startConsumerStatsTimer 和 handleKeepAliveTimeout 方法中訪問(wèn)計(jì)時(shí)器。
在 2.6.1 版本中,我們修復(fù)了此問(wèn)題,競(jìng)爭(zhēng)條件下不再發(fā)生段崩潰。
更多詳情參考 PR-7572:https://github.com/apache/pulsar/pull/7572。
支持從文件讀取憑據(jù)
支持從文件讀取憑據(jù),使其與 Java 客戶端保持一致。
更多詳情參考 PR-7606:https://github.com/apache/pulsar/pull/7606。
修復(fù)在連接出錯(cuò)時(shí)多 topic consumer 的段錯(cuò)誤
當(dāng)創(chuàng)建 consumer 出現(xiàn)錯(cuò)誤時(shí),多主題 consumer 將觸發(fā)段錯(cuò)誤。這是使用 null 回調(diào)關(guān)閉部分使用者的調(diào)用所致。
在 2.6.1 版本中,我們修復(fù)了此問(wèn)題。
更多詳情參考 PR-7588:https://github.com/apache/pulsar/pull/7588。
Functions 相關(guān)改進(jìn)
使用標(biāo)準(zhǔn)主機(jī)名作為 worker 的默認(rèn)值
Java 8 和 Java 11 獲取主機(jī)名的方法不同。在 Java 8 中,使用 InetAddress.getLocalHost()參數(shù),getHostName()返回完全限定的主機(jī)名。在 Java 11 中,則是返回簡(jiǎn)單主機(jī)名。使用getCanonicalHostName()` 參數(shù)后,在Java 8 和 Java 11 中都能返回完全限定的主機(jī)名。
更多詳情參考 PR-7360
https://github.com/apache/pulsar/pull/7360
修復(fù) 2.6.0 引入的向后兼容問(wèn)題
PR-5985 破壞了向后兼容性。如果分開(kāi)運(yùn)行 Function Worker 與 Broker,Function Worker 和 broker 從 2.5 版本單獨(dú)更新到 2.6 版本時(shí)會(huì)發(fā)生以下錯(cuò)誤:
text java.lang.NullPointerException: nullntat java.net.URI$Parser.parse(URI.java:3104) ~[?:?] java.net.URI.<init>(URI.java:600) ~[?:?]ntat java.net.URI.create(URI.java:881) ~[?:?] org.apache.pulsar.functions.worker.WorkerUtils.initializeDlogNamespace(WorkerUtils.java:160) ~[org.apache.pulsar-pulsar-functions-worker-2.7.0-SNAPSHOT.jar:2.7.0-SNAPSHOT] org.apache.pulsar.functions.worker.Worker.initialize(Worker.java:155) ~[org.apache.pulsar-pulsar-functions-worker-2.7.0-SNAPSHOT.jar:2.7.0-SNAPSHOT] org.apache.pulsar.functions.worker.Worker.start(Worker.java:69) ~[org.apache.pulsar-pulsar-functions-worker-2.7.0-SNAPSHOT.jar:2.7.0-SNAPSHOT] org.apache.pulsar.functions.worker.FunctionWorkerStarter.main(FunctionWorkerStarter.java:67) [org.apache.pulsar-pulsar-functions-worker-2.7.0-SNAPSHOT.jar:2.7.0-SNAPSHOT]
錯(cuò)誤原因:2.5 版本中 broker 會(huì)對(duì)包含 bookkeeperMetadataServiceUri 字段的請(qǐng)求做出響應(yīng),管理客戶端將返回該字段為 null,從而導(dǎo)致 NPE。
在 2.6.1 版本中,當(dāng)初始化 function worker 時(shí),對(duì) BookkeeperMetadataServiceUri 的 value 進(jìn)行檢查,判斷其是否為 null。
更多詳情參考 PR-7528:https://github.com/apache/pulsar/pull/7528。
Pulsar Perf 相關(guān)改進(jìn)
在 pulsar-perf 的 producer/consumer/reader 中支持 tlsAllowInsecureConnection
在命令行工具 pulsar-perf 中支持 tlsAllowInsecureConnection 配置,以支持對(duì)不安全的 TLS 連接的集群進(jìn)行 producer/consumer/reader 的性能測(cè)試。
更多詳情參考 PR-7300:https://github.com/apache/pulsar/pull/7300。
參考信息
- Apache Pulsar 2.6.1 官網(wǎng)下載地址:https://pulsar.apache.org/en/download/
- 更多關(guān)于 Apache Pulsar 2.6.1 的信息,可以參考下方:https://pulsar.apache.org/release-notes/#2.6.1
- Pulsar 2.6.1 PR 列表:https://github.com/apache/pulsar/pulls?q=is%3Apr+label%3Arelease%2F2.6.1+is%3Aclosed
總結(jié)
以上是生活随笔為你收集整理的access设置0字段为null是因为类型转换失败_Apache Pulsar 2.6.1 版本正式发布:2.6.0 加强版,新增 OAuth2 支持的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 2篇word文档比较重复率_本科论文写作
- 下一篇: 深入理解计算机系统第四版_深入理解计算机