精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

一個詭異的 Pulsar InterruptedException 異常

開發 前端
今天收到業務團隊反饋線上有個應用往 Pulsar 中發送消息失敗了,經過日志查看得知是發送消息時候拋出了 Java.lang.InterruptedException 異常。

背景

圖片

今天收到業務團隊反饋線上有個應用往 Pulsar 中發送消息失敗了,經過日志查看得知是發送消息時候拋出了 java.lang.InterruptedException 異常。

和業務溝通后得知是在一個 gRPC 接口中觸發的消息發送,大約持續了半個小時的異常后便恢復正常了,這是整個問題的背景。

前置排查

拿到該問題后首先排查下是否是共性問題,查看了其他的應用沒有發現類似的異常;同時也查看了 Pulsar broker 的監控大盤,在這個時間段依然沒有波動和異常。

這樣可以初步排除是 Pulsar 服務端的問題。

接著便是查看應用那段時間的負載情況,從應用 QPS 到 JVM 的各個內存情況依然沒發現有什么明顯的變化。

Pulsar 源碼排查

既然看起來應用本身和 Pulsar broker 都沒有問題的話那就只能從異常本身來排查了。

首先第一步要得知具體使用的是 Pulsar-client? 是版本是多少,因為業務使用的是內部基于官方 SDK 封裝 springboot starter? 所以第一步還得排查這個 starter 是否有影響。

通過查看源碼基本排除了 starter? 的嫌疑,里面只是簡單的封裝了 SDK 的功能而已。

org.apache.pulsar.client.api.PulsarClientException: java.util.concurrent.ExecutionException: org.apache.pulsar.client.api.PulsarClientException: java.lang.InterruptedException at org.apache.pulsar.client.api.PulsarClientException.unwrap(PulsarClientException.java:1027) at org.apache.pulsar.client.impl.TypedMessageBuilderImpl.send(TypedMessageBuilderImpl.java:91) at 
java.base/java.lang.Thread.run(Thread.java:834) Caused by: java.util.concurrent.ExecutionException: org.apache.pulsar.client.api.PulsarClientException: java.lang.InterruptedException at java.base/java.util.concurrent.CompletableFuture.reportGet(CompletableFuture.java:395)
at java.base/java.util.concurrent.CompletableFuture.get(CompletableFuture.java:1999)
at org.apache.pulsar.client.impl.TypedMessageBuilderImpl.send(TypedMessageBuilderImpl.java:89) ... 49 common frames omitted Caused by: org.apache.pulsar.client.api.PulsarClientException: java.lang.InterruptedException
at org.apache.pulsar.client.impl.ProducerImpl.canEnqueueRequest(ProducerImpl.java:775)
at org.apache.pulsar.client.impl.ProducerImpl.sendAsync$original$BWm7PPlZ(ProducerImpl.java:393)
at org.apache.pulsar.client.impl.ProducerImpl.sendAsync$original$BWm7PPlZ$accessor$i7NYMN6i(ProducerImpl.java)
at org.apache.pulsar.client.impl.ProducerImpl$auxiliary$EfuVvJLT.call(Unknown Source)
at org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.InstMethodsInter.intercept(InstMethodsInter.java:86)
at org.apache.pulsar.client.impl.ProducerImpl.sendAsync(ProducerImpl.java)
at org.apache.pulsar.client.impl.ProducerImpl.internalSendAsync(ProducerImpl.java:292)
at org.apache.pulsar.client.impl.ProducerImpl.internalSendWithTxnAsync(ProducerImpl.java:363)
at org.apache.pulsar.client.impl.PartitionedProducerImpl.internalSendWithTxnAsync(PartitionedProducerImpl.java:191)
at org.apache.pulsar.client.impl.PartitionedProducerImpl.internalSendAsync(PartitionedProducerImpl.java:167)
at org.apache.pulsar.client.impl.TypedMessageBuilderImpl.sendAsync(TypedMessageBuilderImpl.java:103)
at org.apache.pulsar.client.impl.TypedMessageBuilderImpl.send(TypedMessageBuilderImpl.java:82) ... 49 common frames omitted Caused by: java.lang.InterruptedException: null
at java.base/java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireSharedInterruptibly(AbstractQueuedSynchronizer.java:1343)
at java.base/java.util.concurrent.Semaphore.acquire(Semaphore.java:318)
at org.apache.pulsar.client.impl.ProducerImpl.canEnqueueRequest(ProducerImpl.java:758)

接下來便只能是分析堆棧了,因為 Pulsar-client 的部分實現源碼是沒有直接打包到依賴中的,反編譯的話許多代碼行數對不上,所以需要將官方的源碼拉到本地,切換到對于的分支進行查看。

這一步稍微有點麻煩,首先是代碼庫還挺大的,加上之前如果沒有準備好 Pulsar 的開發環境的話估計會勸退一部分人;但其實大部分問題都是網絡造成的,只要配置一些 Maven 鏡像多試幾次總會編譯成功。

我這里直接將分支切換到 branch-2.8。

從堆棧的頂部開始排查 TypedMessageBuilderImpl.java:91:

圖片

看起來是內部異步發送消息的時候拋了異常。

接著往下看到這里:

java.lang.InterruptedException 
at org.apache.pulsar.client.impl.ProducerImpl.canEnqueueRequest(ProducerImpl.java:775) at

圖片

看起來是這里沒錯,但是代碼行數明顯不對;因為 2.8 這個分支也是修復過幾個版本,所以中間有修改導致代碼行數與最新代碼對不上也正常。

semaphore.get().acquire();

不過初步來看應該是這行代碼拋出的線程終端異常,這里看起來只有他最有可能了。

圖片

為了確認是否是真的是這行代碼,這個文件再往前翻了幾個版本最終確認了就是這行代碼沒錯了。

我們點開java.util.concurrent.Semaphore#acquire()的源碼。

/**
* <li>has its interrupted status set on entry to this method; or
* <li>is {@linkplain Thread#interrupt interrupted} while waiting
* for a permit,
* </ul>
* then {@link InterruptedException} is thrown and the current thread's
* interrupted status is cleared.
*
* @throws InterruptedException if the current thread is interrupted
*/
public void acquire() throws InterruptedException {
sync.acquireSharedInterruptibly(1);
}

public final void acquireSharedInterruptibly(int arg)
throws InterruptedException {
if (Thread.interrupted() ||
(tryAcquireShared(arg) < 0 &&
acquire(null, arg, true, true, false, 0L) < 0))
throw new InterruptedException();
}

通過源碼會發現 acquire()? 函數確實會響應中斷,一旦檢測到當前線程被中斷后便會拋出 InterruptedException 異常。

定位問題

所以問題的原因基本確定了,就是在 Pulsar 的發送消息線程被中斷了導致的,但為啥會被中斷還需要繼續排查。

我們知道線程中斷是需要調用 Thread.currentThread().interrupt(); API的,首先猜測是否 Pulsar 客戶端內部有個線程中斷了這個發送線程。

于是我在 pulsar-client 這個模塊中搜索了相關代碼:

圖片

排除掉和 producer 不相關的地方,其余所有中斷線程的代碼都是在有了該異常之后繼續傳遞而已;所以初步來看 pulsar-client 內部沒有主動中斷的操作。

既然 Pulsar 自己沒有做,那就只可能是業務做的了?

于是我在業務代碼中搜索了一下:

圖片

果然在業務代碼中搜到了唯一一處中斷的地方,而且通過調用關系得知這段代碼是在消息發送前執行的,并且和 Pulsar 發送函數處于同一線程。

大概的偽代碼如下:

List.of(1, 2, 3).stream().map(e -> {
return CompletableFuture.supplyAsync(() -> {
try {
TimeUnit.MILLISECONDS.sleep(10);
} catch (InterruptedException ex) {
throw new RuntimeException(ex);
}
return e;
});
}
).collect(Collectors.toList()).forEach(f -> {
try {
Integer integer = f.get();
log.info("====" + integer);
if (integer==3){
TimeUnit.SECONDS.sleep(10);
Thread.currentThread().interrupt();
}
} catch (InterruptedException e) {
throw new RuntimeException(e);
} catch (ExecutionException e) {
throw new RuntimeException(e);
}
});
MessageId send = producer.newMessage().value(msg.getBytes()).send();

執行這段代碼可以完全復現同樣的堆棧。

幸好中斷這里還打得有日志:

圖片

通過日志搜索發現異常的時間和這個中斷的日志時間點完全重合,這樣也就知道根本原因了。

因為業務線程和消息發送線程是同一個,在某些情況下會執行 Thread.currentThread().interrupt();,其實單純執行這行函數并不會發生什么,只要沒有去響應這個中斷,也就是 Semaphore 源碼中的判斷了線程中斷的標記:

public final void acquireSharedInterruptibly(int arg)
throws InterruptedException {
if (Thread.interrupted() ||
(tryAcquireShared(arg) < 0 &&
acquire(null, arg, true, true, false, 0L) < 0))
throw new InterruptedException();
}

但恰好這里業務中斷后自己并沒有去判斷這個標記,導致 Pulsar 內部去判斷了,最終拋出了這個異常。

總結

所以歸根結底還是這里的代碼不合理導致的,首先是自己中斷了線程但也沒使用,從而導致有被其他基礎庫使用的可能,所以會造成了一些不可預知的后果。

再一個是不建議在業務代碼中使用 Thread.currentThread().interrupt(); 這類代碼,第一眼根本不知道是要干啥,也不易維護。

其實本質上線程中斷也是線程間通信的一種手段,有這類需求完全可以換為內置的 BlockQueue 這類函數來實現。

責任編輯:姜華 來源: crossoverJie
相關推薦

2013-12-05 10:50:13

2024-06-28 08:28:43

反序列化filterJson

2023-12-12 08:08:17

插件PRPulsar

2013-03-18 10:31:22

JS異常

2022-11-28 08:37:23

MQ集群線程棧

2021-04-30 07:09:48

SQLP0事故

2021-10-13 10:22:10

Python多繼承開發

2018-06-24 16:39:28

Tomcat異常線程

2011-04-11 09:53:06

Oracle

2024-10-24 08:21:33

2021-01-06 05:25:56

項目Springboot應用

2022-12-18 19:27:09

Pulsar編輯器開源

2016-09-26 17:26:20

2020-03-16 17:20:02

異常處理Spring Boot

2014-10-14 15:50:19

UIAndroid

2009-04-01 08:37:19

Windows 7微軟操作系統

2023-01-03 12:30:25

架構CPUGPU

2022-04-28 09:05:41

網絡爬蟲Python

2015-06-10 10:56:50

iOS開發技巧

2013-02-22 18:37:50

容錯服務器
點贊
收藏

51CTO技術棧公眾號

欧美国产日韩在线播放| 91香蕉视频在线下载| 99久久人妻无码精品系列| 一区二区电影免费观看| 国产日本一区二区| 国产日产欧美精品| 天天综合网入口| 日韩在线观看| 精品99一区二区| 欧美性猛交xxx乱久交| 黄色av网站在线播放| 成人av免费在线播放| 国产999精品| 久久久久久久久久久久久久久久久| 日本欧美高清| 日韩一级二级三级精品视频| 国产亚洲精品网站| 免费看电影在线| 欧美国产一区视频在线观看| 国产精品一区二区a| 中国女人一级一次看片| 亚洲精品123区| 久久精品国产2020观看福利| 亚洲av成人片色在线观看高潮| 巨大黑人极品videos精品| 1024亚洲合集| 日韩欧美亚洲日产国| 国产成人无码www免费视频播放| 日本在线播放一区二区三区| 久久久亚洲欧洲日产国码aⅴ| 在线观看天堂av| 欧美激情在线免费| 亚洲黄色在线看| 香蕉在线观看视频| 精品国产一区二区三区性色av| 色综合色综合色综合| 欧美一级视频免费看| 国产精品一卡二卡三卡 | 一级黄色高清视频| 国产精品黄色片| 欧美日韩在线视频首页| 国产欧美久久久久| 4438x成人网全国最大| 欧美高清在线精品一区| 欧洲精品亚洲精品| 五月天婷婷在线播放| 国产91在线看| 国产精品乱码一区二区三区| 国产成人精品白浆久久69| 久久精品国产第一区二区三区| 国产精品成人v| 亚洲欧美另类在线视频| 国产精品人人爽人人做我的可爱| 久久久久免费视频| 青青草免费av| 国内精品久久久久国产盗摄免费观看完整版| 色偷偷av亚洲男人的天堂| 久久精品视频18| 精品视频免费| 日韩资源在线观看| 中文字幕电影av| 欧美不卡视频| 久久久亚洲欧洲日产国码aⅴ| 久久精品国产亚洲AV无码男同| 黄色在线成人| 欧美亚洲激情视频| 少妇久久久久久久| 久久99久久久欧美国产| 国产一区红桃视频| 99热这里只有精品66| 国产精品亚洲第一区在线暖暖韩国| 666精品在线| 日本黄色一区二区三区| 91麻豆精东视频| 日本亚洲自拍| 欧美尤物美女在线| 一级中文字幕一区二区| 免费超爽大片黄| 超碰aⅴ人人做人人爽欧美| 91久久精品一区二区二区| 我看黄色一级片| 高清不卡一区| 亚洲第一页中文字幕| 黄色工厂在线观看| 日韩伦理视频| 欧美极品第一页| 欧美a视频在线观看| 蜜桃av一区二区| 成人自拍网站| 国产精品ⅴa有声小说| 日韩美女视频19| 国产极品尤物在线| 78精品国产综合久久香蕉| 欧美一级在线视频| 熟女俱乐部一区二区视频在线| 久久免费大视频| 91国在线精品国内播放| 亚洲一级片免费看| 成人午夜精品一区二区三区| 日韩电影大全在线观看| 性欧美videoshd高清| 日韩欧美大尺度| 日韩精品视频网址| 九九亚洲精品| 久久久久亚洲精品国产| 亚洲影院一区二区三区| 99在线精品观看| 亚洲第一综合网站| 亚洲女色av| 欧美不卡视频一区| 国产亚洲精品精品精品| 99成人在线| 91精品国产综合久久久久久丝袜 | 一区二区三区回区在观看免费视频| 青青青在线免费观看| 天堂在线一区二区| 国产一区二区三区高清视频| a中文在线播放| 欧美视频国产精品| youjizz.com日本| 午夜久久免费观看| 国产成人亚洲综合91精品| 午夜久久久久久久久久| 国产精品丝袜一区| 国产一区二区视频免费在线观看 | 日韩高清在线播放| 女人让男人操自己视频在线观看| 在线不卡一区二区| 午夜影院黄色片| 乱人伦精品视频在线观看| 国产精品国产精品| a毛片在线看免费观看| 欧美性一二三区| 少妇特黄一区二区三区| 在线国产日韩| 国产精品国产精品| 波多野结衣久久| 精品国产乱码久久久久久闺蜜 | 午夜精品毛片| 成人国产在线视频| 日本在线观看网站| 欧美绝品在线观看成人午夜影视| 大胸美女被爆操| 奇米777欧美一区二区| 欧美日本亚洲| 欧美大片免费观看网址| 亚洲欧美日韩天堂一区二区| 毛片基地在线观看| 99久久99精品久久久久久| 欧美激情亚洲天堂| 国产精品xxx在线观看| 欧美精品videossex性护士| 国产高清视频免费观看| 玉米视频成人免费看| 91人妻一区二区三区| 亚洲欧美日韩高清在线| 亚洲伊人第一页| 日韩精品卡一| 亚洲成人黄色网| 91国产丝袜播放在线| zzijzzij亚洲日本少妇熟睡| 欧美日韩一道本| 亚洲精品合集| 国产精品视频xxx| 欧美jizz18性欧美| 日韩欧美资源站| 日韩欧美不卡视频| 久久蜜桃香蕉精品一区二区三区| 无人在线观看的免费高清视频| 欧美一区二区性| 91久久中文字幕| 欧美人与牲禽动交com| 亚洲精品久久久久久久久久久| 久久亚洲天堂网| 中文字幕av不卡| 性高潮久久久久久| 国产一区二区三区的电影| 日本精品一区二区三区高清 久久 日本精品一区二区三区不卡无字幕 | 亚洲最大免费| 99精品国产一区二区三区2021| 97久久超碰福利国产精品…| 色就是色亚洲色图| 欧美三级在线视频| 国产在线观看免费视频今夜| 91色在线porny| 激情黄色小视频| 亚洲国产日韩欧美一区二区三区| 人偷久久久久久久偷女厕| 日韩国产大片| 2019中文字幕在线观看| 一区二区高清不卡| 亚洲国产欧美在线成人app| 日韩国产亚洲欧美| 一区二区三区免费观看| 精品人伦一区二区三电影| 国产在线国偷精品产拍免费yy| www插插插无码视频网站| 成人免费看片39| 国产精品传媒毛片三区| 深夜视频一区二区| 91精品国产91久久久久久吃药| fc2在线中文字幕| 亚洲成人精品视频| 一级黄色片视频| 欧美视频在线观看 亚洲欧| 在线看的片片片免费| 久久久影院官网| 师生出轨h灌满了1v1| 日本成人在线不卡视频| 国产精品网站免费| 影视一区二区| 日韩欧美精品一区二区三区经典| 粉嫩的18在线观看极品精品| 91精品久久久久久久久中文字幕| 亚洲永久av| 久久久久久久一| www免费视频观看在线| 国产亚洲欧洲高清| 五月天婷婷在线播放| 欧美成人一区二区三区| 成人黄色片在线观看| 精品国产成人av| 国产真实夫妇交换视频| 1000精品久久久久久久久| 东方伊人免费在线观看| 久久日一线二线三线suv| 97中文字幕在线观看| 国产真实乱对白精彩久久| 九热视频在线观看| 麻豆9191精品国产| 男人操女人逼免费视频| 亚洲视频碰碰| 国产自产在线视频| 欧美高清一区| 亚洲熟妇无码av在线播放| 中文字幕一区二区三三| 在线日韩av永久免费观看| 国产一区二区三区不卡视频网站| 久久精品国产综合精品 | 日韩精品在在线一区二区中文| 国产欧美三级电影| 电影午夜精品一区二区三区| 电影91久久久| 亚洲xxx大片| 日韩08精品| 成人在线看片| 久久精品福利| 久久久婷婷一区二区三区不卡| 欧美黑白配在线| 久久99精品久久久久久秒播放器| 久久动漫网址| 欧美日韩精品免费观看视一区二区 | 国产高清精品一区二区三区| 亚洲不卡视频| 成人资源av| 色爱综合av| 欧美在线播放一区二区| 精品产国自在拍| 一区二区三区四区欧美日韩| 成人在线免费观看网站| 一区二区三区欧美成人| 午夜欧美视频| 性欧美大战久久久久久久| 国产精品毛片在线| 久久99999| 国产一区二区精品在线观看| 欧美日韩一区二区区别是什么| 成人一区二区在线观看| 国产又爽又黄无码无遮挡在线观看| 久久夜色精品一区| 日本污视频网站| 亚洲精品日韩一| 精品成人免费视频| 欧洲视频一区二区| 99久久久久久久| 亚洲加勒比久久88色综合| 免费福利在线视频| 久久精品99国产精品酒店日本 | 黄色a级三级三级三级| 懂色av中文字幕一区二区三区| 国产精品久久AV无码| 国产日韩成人精品| 九九视频免费在线观看| 精品女同一区二区三区在线播放| 国产免费一区二区三区四区五区| 欧美精品免费视频| 天天操天天干天天爽| 中文字幕亚洲欧美日韩在线不卡| 综合久久2o19| 秋霞av国产精品一区| 国产精品成人3p一区二区三区| 国产美女精品在线观看| 精品理论电影在线| 2022中文字幕| 人妖欧美一区二区| 中文视频在线观看| 国产精品不卡视频| 中国一级特黄毛片| 91精品国产色综合久久久蜜香臀| 无码精品人妻一区二区三区影院 | 黄色裸体一级片| 亚洲动漫第一页| 91精品在线视频观看| 亚洲精品久久久久中文字幕二区| 日韩精品成人av| 欧美在线视频一二三| 日韩欧美激情电影| 视频一区视频二区视频三区视频四区国产| 欧美1区视频| 亚洲欧美日韩一级| 久久综合精品国产一区二区三区 | 日本69式三人交| 亚洲天堂免费在线观看视频| 天堂а√在线中文在线新版| 欧美一级免费观看| 91caoporm在线视频| 国产91成人在在线播放| 在这里有精品| 日本不卡一区二区三区四区| 久久久精品午夜少妇| a天堂视频在线观看| 一区二区三区蜜桃| av中文字幕在线免费观看| 日韩中文字幕在线精品| 日韩成人影音| 久久国产精品免费一区| 黄色综合网站| 91九色蝌蚪porny| 亚洲欧美二区三区| 国产精品国产三级国产aⅴ| 亚洲精品一区二区三区不| 高清电影在线免费观看| 91九色在线观看| 自拍日韩欧美| 久久精品久久99| 中文字幕一区二区三区在线观看| www.亚洲激情| 伊人成人开心激情综合网| 成人影院入口| 欧美日韩大片一区二区三区| 国产精品乱看| 韩国三级hd中文字幕| 色综合久久久久综合体桃花网| 三级小视频在线观看| 午夜伦理精品一区| 国产主播性色av福利精品一区| 人人妻人人澡人人爽欧美一区双 | 色撸撸在线视频| 欧美日韩不卡一区二区| 最新97超碰在线| 91精品国产自产在线| 香蕉综合视频| 中文字幕无码毛片免费看| 有坂深雪av一区二区精品| 成人黄色在线观看视频| 久久久久国产精品免费网站| 福利在线一区| 丰满人妻中伦妇伦精品app| 久久综合色鬼综合色| 国产91av在线播放| 俺去啦;欧美日韩| 欧美视频精品全部免费观看| 红桃一区二区三区| 99这里都是精品| www.av88| 久久成年人免费电影| 高潮久久久久久久久久久久久久 | 国产一区二区三区不卡在线观看| 麻豆视频在线观看| 亚洲精品大尺度| 日韩欧美精品一区二区综合视频| 亚洲在线欧美| 成人综合婷婷国产精品久久蜜臀| 日韩免费观看一区二区| 国产亚洲精品日韩| 精品国产三区在线| 欧美色图另类小说| 国产精品久久久久桃色tv| 国产视频一区二区三区四区五区| 欧美激情xxxxx| 久久99国产精品视频| 激情文学亚洲色图| 亚洲福利视频三区| 日本在线天堂| 国产在线精品一区二区三区》 | 91精品一区二区三区综合在线爱| 国产吃瓜黑料一区二区| 日本韩国精品在线| 午夜激情在线| 日韩美女一区| 风间由美性色一区二区三区| 国产亚洲欧美在线精品| 久久久www成人免费精品| 秋霞影视一区二区三区| 乌克兰美女av| 午夜av一区二区| 黄色网页网址在线免费| 麻豆成人在线播放| 国产精品538一区二区在线| 中文字幕视频网|