iT邦幫忙

2025 iThome 鐵人賽

DAY 20
0

雜談

昨天把基本的 Redis Pub/Sub 配置完成後,碰到了一些技術障礙,主要是因為我想用 docker compose 把我的專案在不同的 port run 起來,但可能是因為某些配置出問題,所以讓整個測試進度拖慢很多,有點本末倒置,畢竟用 docker 不是這個 lab 的必要項目,所以我今天也不堅持了,就直接在本機跑兩個專案。

其實用 IDE 跑起來很快,但最近我除了上班用 intelliJ 以外,其他時間都用 Kiro 來開發 Java,但 Kiro 的 preview 版到期了,所以又回去用 Cursor,總之就是用 vs code 來寫 Java 的概念,應該很少人會這樣吧,畢竟 intelliJ 就是開發 Java 的 IDE 王者,但它真的太吃 RAM 了,所以我就想來看看 Cursor 有沒有可以開發 Java 的 extension,還真的有,但說到底還是蠻難用的(比起 intelliJ)。

總之,啟動兩個實例的問題解決後,我又碰上一堆問題,主要是 Redis 配置問題,一開始是 RedisPubSubConfig 在調用時,Listner 之類的 invoker 沒有被初始化,之後又是 RedisConfig 序列化有問題,那邊用了 Json 序列化,但 Pub/Sub 這邊用 String,似乎是這樣兩者有衝突但一開始沒發現。

測試了非常多次都報錯,本地的 WebSocket Session 是都可以正常推送通知,這個沒有問題,但是問題出在 Redis Listner 的各種錯誤,最後把序列化問題解決就好了。

測試的步驟會是:

  1. 把兩個 Spring Boot 專案都啟動
  2. 前端 test.html 分別跟 ws://localhost:8080/notification?userId=1 還有 ws://localhost:8081/notification?userId=2 建立連接
  3. 呼叫其中一個站內信的 api
  4. 保存好站內信後,其中一個實例 Consumer 監聽到 Kafka 消息,分別推送通知給 ws 客戶端
  5. 推送時要取出 ws session 才能送出
  6. 取出的 session 為空代表不在本地,所以要推一個 Redis Pub 消息
  7. 其他有訂閱 Channel 的實例都會監聽到,各自檢查有無 ws session 在本地,有就發通知,沒有就不執行

https://ithelp.ithome.com.tw/upload/images/20250910/20161582TPW7rEClpo.png

實際上是 8080 發送站內信,user1 的 ws session 在 8080,他直接收到了通知,8081 則是通過監聽到廣播來確認本地有 user2 的 ws session 於是也發送了 ws 消息。

總結

今天也是跌跌撞撞地完成了文章,雖然過程很顛簸,結果也不盡完美,但當兩個 ws 客戶端在同一時間收到 ws 推送通知的那刻,我還是情不自禁的激動起來,這種被技術感動到的瞬間,不管來幾次都不會膩。


上一篇
Day 19 | Redis Pub/Sub 分布式 WebSocket 實作:從配置到核心功能完整實現
下一篇
Day 21 | 第三階段系統優化 | ObjectMapper 單例
系列文
系統設計一招一式:最基本的功練到爛熟就是殺手鐧,從單體架構到分布式系統的 Lab 實作筆記21
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言