最近在準備給物聯網平臺添加插件模塊,然後在準備做插件的時候,發現實現Golang的插件遇到問題了,不知道要怎麼來實現這個插件的功能,因爲找來找去,發現golang插件有很多的問題,比如沒有辦法實現跨平臺,沒有辦法實現跨語言支持,比如我用c編譯成so文件或者dll文件,然後給go進行直接調用,這些都比較麻煩,然後go官方的實現插件必須要插件和主程序的版本一致,代碼一致,依賴一致等,這樣做的插件將會帶來很多的麻煩問題,比如插件的版本管理,升級這些都是問題。
然後看到網上的插件處理目前主要有兩種方式,一種是通過rpc或grpc進行支持,另外一種則是編譯型插件,編譯型插件的話,就是通過編譯源碼的方式進行插件的加入,然後通過配置文件,進行插件的啓用和關停。
然後通過總結和反思,我思考了一下,目前主要有以下幾種實現思路:
- 1.本地socket (如果爲unix系統操作系統的話,就要使用UNIX Domain Socket, 非Unix系列系統的話,就用本地網絡比如:127.0.0.1來實現),當然可以的話,還是用UNIX Domain Socket,使用它作爲IPC的話有以下幾點優點:
- 不需要經過網絡協議棧
- 不需要打包拆包、計算校驗和、維護序號和應答等,可靠性更強
- 2.使用共享內存+消息隊列:先開闢出一塊內存池用於消息的收發,一邊將數據放入內存,然後將內存地址信息通過消息隊列的形式通知對方,然後做超時機制,比如1分鐘之後,不管對方有沒有接收,都對消息進行回收。
- 3.通過cgo的形式進行實現。
- 4.通過解釋性語言插件進行支持。
經過綜合評估之後,我覺得通過socket通信的方式來進行插件的實現還是比較好的思路,畢竟不管是2還是3,功能也都能實現,也能跨語言,跨系統就不一定了,然後還有就是時間問題,以及成本問題,畢竟我們大部分人都是打工人,都是要生活的,沒有那麼多的時間和精力來搞這些沒有多大意義的東西,4的話,後期看吧,打算是支持lua語言的。