今天是鐵人賽的第 10 天,老實說從決定報名那刻起就沒覺得這是一件輕鬆的事,還沒寫以前不會知道剛開始定的內容實際寫起來的範圍會是多少,原本還想做 4 種系統的 Lab(原本還想做爬蟲器等等),寫到第四、五天就大概知道,要做一個稍微完整一點架構的系統,不太可能三五天就交代過去,尤其是週間還需要上班,原本在週末累積一兩篇的庫存,現在也已經消耗完,變成是每日都要在最後一刻趕稿發布,到限流器的後面幾篇感覺有點虎頭蛇尾,我想再寫更多關於限流器實用層面的內容,但現在有個新的想法是,先往下開始做推送通知系統的規劃及實作,後面再將限流器的整合進來,一方面可以補充些之前沒補上的內容,也可以讓兩者的功能變得更為完整。
因此從第 10 天開始,我們就正式進入到了推送系統的實作。首先先把範圍劃定,因為原本我是說要做「通知」系統,但通知除了推送以外又包含了 SMS 跟 E-mail 等常見通知類型, 而在這一系列 Lab 中我並不打算花時間投入於 SMS 跟 E-mail 這兩種類型的實作,最大的原因是通常我們會串接第三方的服務來實作簡訊跟郵件的收發,如果沒有串接三方服務可以很難實際看到簡訊跟郵件的通知效果,而我也不想花多餘精力去看三方文件,因此只好做個取捨。
再來就是我希望花更多時間、通過即時推送的實作去跟 Kafka 還有 WebSocket 這兩項技術混熟,Kafka 這個中間件在我目前工作中實務應用的比例非常高,但基本上我使用的情境也只是添加個 Topic 等等很表面的工作,剛好之前為了更深入認識它做了一些筆記,這此藉由這個機會再次整理一下以加深對其的認知。
至於 WebSocket,之前在轉職時為了展示自己的小專案,應用了 WebSocket 做出一個功能,但當時也沒說多理解原理,到現在也隔了快兩年,忘都忘了差不多了,直到最近碰到的一個專案才又接觸到,算是給我一個契機去溫習一下。
首先我們會用 Kafka 來實作一個基本的站內信功能,運用 Kafka 的高吞吐特性來建立一個可以承受流量高峰的異步通信消息系統,在這邊還需要管理站內信的狀態,如已讀/未讀的變化等。另外也需要設計站內信的數據持久化策略,所以要為這些資料設計幾張簡單的 Table,這邊會選用 MySQL 來支援實作,但細節就不展開。
我們在這部分會需要:
接著在站內信發送的系統完成後,我們要為客戶端做一個即時可以收到通知的推送系統,也就是說站內信是實際內容,而推送訊息就是「您有一封新的站內信」這樣的概念,在這我們要做到的是:
等基本的功能完成後,最後再用與限流器的整合作為收尾,透過測試來驗收我們的成果,這邊預計的產出有:
相信過程肯定不輕鬆,但一定要堅持下去,我能想像完賽那天的成果與收穫會有多豐滿,享受過程,專注當下!