成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

你知道嗎?Pulsar 也會重復消費?

開發 后端
最近幫同事一起排查了一個問題:在使用 Pulsar 消費時,發生了同一條消息反復消費的情況。

背景

許久沒有分享 Java 相關的問題排查了,最近幫同事一起排查了一個問題:

在使用 Pulsar 消費時,發生了同一條消息反復消費的情況。

排查

當他告訴我這個現象的時候我就持懷疑態度,根據之前使用的經驗 Pulsar 在官方文檔以及 API 中都解釋過:

只有當設置了消費的 ackTimeout 并超時消費時才會重復投遞消息,默認情況下是關閉的,查看代碼也確實沒有開啟。

那會不會是調用了 negativeAcknowledge() 方法呢(調用該方法也會觸發重新投遞),因為我們使用了一個第三方庫 https://github.com/majusko/pulsar-java-spring-boot-starter 只有當拋出異常時才會調用該方法。

查閱代碼之后也沒有地方拋出異常,甚至整個過程中都沒看到異常產生;這就有點詭異了。

復現

為了捋清楚整個事情的來龍去脈,詳細了解了他的使用流程;

其實也就是業務出現了 bug,他在消息消費時 debug 然后進行單步調試,當走完一次調試后,沒多久馬上又收到了同樣的消息。

但奇怪的是也不是每次 debug 后都能重復消費,我們都說如果一個 bug 能 100% 完全復現,那基本上就解決一大半了。

所以我們排查的第一步就是完全復現這個問題。

為了排除掉是 IDEA 的問題(雖然極大概率不太可能)既然是 debug 的時候產生的問題,那其實轉換到代碼也就是 sleep 嘛,所以我們打算在消費邏輯里直接 sleep 一段時間看能否復現。

經過測試,sleep 幾秒到幾十秒都無法復現,最后索性 sleep 一分鐘,神奇的事情發生了,每次都成功復現!

既然能成功復現那就好說了,因為我自己的業務代碼也有使用到 Pulsar 的地方,為了方便調試就準備在自己的項目里再復現一次。

結果詭異的事情再次發生,我這里又不能復現了。

雖然這才是符合預期的,但這就沒法調了呀。

本著相信現代科學的前提,我們倆唯一的區別就是項目不一樣了,為此我對比了兩邊的代碼。

  @PulsarConsumer(
topic = xx,
clazz = Xx.class,
subscriptionType = SubscriptionType.Shared
)
public void consume(Data msg) {
log.info("consume msg:{}", msg.getOrderId());
Lock lock = redisLockRegistry.obtain(msg.getOrderId());
if (lock.tryLock()) {
try {
orderService.do(msg.getOrderId());
} catch (Exception e) {
log.error("consumer msg:{} err:", msg.toString(), e);
} finally {
lock.unlock();
}
}

}

結果不出所料,同事那邊的代碼加了鎖;一個基于 Redis 的分布式鎖,這時我一拍大腿不會是解鎖的時候超時了導致拋了異常吧。

為了驗證這個問題,在能復現的基礎上我在框架的 Pulsar 消費處打了斷點:

果然破案了,異常提示已經非常清楚了:加鎖已經過了超時時間。

進入異常后直接 negative 消息,同時異常也被吃掉了,所以之前沒有發現。

查閱了 RedisLockRegistry 的源碼,默認超時時間正好是一分鐘,所以之前我們 sleep 幾十秒也無法復現這個問題。

總結

事后我向同事了解了下為啥這里要加鎖,因為我看下來完全沒有加鎖的必要;結果他是因為從別人那里復制的代碼才加上的,壓根沒想那么多。

所以這事也能得出一些教訓:

  • ctrl C/V 雖然方便,但也得充分考慮自己的業務場景。
  • 使用一些第三方 API 時,需要充分了解其作用、參數。
責任編輯:姜華 來源: 今日頭條
相關推薦

2024-06-14 08:36:57

2022-12-12 08:17:29

2024-04-23 08:31:57

pythonfalse

2023-04-26 10:21:04

2024-04-30 09:02:48

2023-12-12 08:41:01

2023-12-20 08:23:53

NIO組件非阻塞

2024-04-07 00:00:00

ESlint命令變量

2024-05-28 09:12:10

2024-01-09 07:29:05

Argo代碼庫應用程序

2019-12-12 09:23:29

Hello World操作系統函數庫

2017-10-16 13:45:04

2022-05-27 08:55:15

工具自動化軟件

2021-02-02 08:21:28

網絡面試通信

2024-04-07 00:00:03

2021-02-20 08:21:18

Hive動態分區

2019-06-14 15:36:13

Windows 10安全PC

2024-07-30 08:22:47

API前端網關

2024-11-08 09:48:38

異步編程I/O密集

2024-08-20 08:29:55

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲精品视频免费观看 | 欧美在线a | 一区二区三区成人 | 日本三级电影在线观看视频 | 欧美亚洲国语精品一区二区 | 欧美午夜一区二区三区免费大片 | 最新日韩在线 | 欧美xxxx做受欧美 | 91精品国产91久久综合桃花 | 久久免费视频1 | 午夜网 | 国产麻豆乱码精品一区二区三区 | 日韩中文字幕 | 亚洲成人av一区二区 | 国产目拍亚洲精品99久久精品 | 日韩免费1区二区电影 | 欧美精品一区二区三区在线 | 国产精品久久久久久久久久免费看 | 亚洲视频一区在线播放 | 99久久免费精品国产男女高不卡 | 欧美亚洲在线 | 欧美黄在线观看 | 欧美性一级 | 日韩免费av一区二区 | 久久精品亚洲精品国产欧美 | 欧美日韩一区二区三区四区 | 91视频在线观看免费 | 成人a视频片观看免费 | 国产色片在线 | 国产精品久久久久久一区二区三区 | 成人a视频 | www国产成人免费观看视频,深夜成人网 | 午夜欧美 | 国产农村妇女毛片精品久久麻豆 | 欧美精品video | 99精品视频免费在线观看 | 一级片在线免费看 | 亚洲国产中文字幕 | 综合欧美亚洲 | 国产精品99久久免费观看 | 日韩欧美中文字幕在线观看 |