前陣子幫公司寫了一個核心的 websocket 推送 proxy,剛好自己在練習 go 所以理所當然就用 go 來實現它,這個專案的核心概念是模仿 Pusher 的概念,基本上只要啟動這個服務,client端(html) 連線後,可以透過這個服務提供的 api 推送訊息給 client。

在開發前期有考慮用 nodejs + socketio 當作 solution,但有稍微去看了一下 socketio 的 source 發現它不是完全基於 websocket RFC6455 協定,而且有用到 long polling,我猜是因為它為了通融大部分舊版瀏覽器所作的妥協,再加上我個人不太喜歡 nodejs 版本一直不太穩定,雖然有一堆很潮的套件可以用,但是常常一更新就爆的亂七八糟,後來經強者我同事介紹,才決定用 go。

這個案子的 websocket 部份也不是純手刻,是基於 gorilla websocket 延伸,畢竟自己刻 RFC6455 那些握手協定,實在有夠鎖碎,就選擇站在巨人的肩膀上了。我有把它 release 到 github 上面 Gusher

現在版本比較穩定了,除了重構,api部份應該是不會在翻修了。目前還沒寫上 test,之後有空可能要補上去了,benchmark 的部份,對這方面還沒什麼概念,還在閱讀相關文件,如果有哪位前輩,看到願意指教的話,感激不盡

這個案子算是學 go 3個多月以來,第一個實現性+練習性的專案,還在摸索 go 這個語言的特性,還在摸索如何寫的更漂亮,雖然它不是很純的 OOP ,但是軟體工程領域, OCP 原則我覺得是任何地方的都通用的。這也是我想掌握的地方。