GoでServeMuxの機能拡張を提案するProposalがAcceptedになった

アプリケーション

以前からウォッチしていたnet/http: enhanced ServeMux routing #61410がAcceptedになったので、それについてポエムをかく。

最終的な仕様がどうなるかはわからないが、静的なルーティングの機能(/foo/barのような固定値のルーティング)しか持っていないServeMuxに動的なルーティング(/foo/:idのようなパスパラメータを使ったルーティング)の機能が少なくとも追加されそうな雰囲気。

自分がこのProposalを気にしている理由は、ルーティングのライブラリを個人的に開発しているである。

cf. bmf-san/goblin cf. bmf-tech.comの関連記事

goblinは有名所のルーティングライブラリと同じく、ServeMuxの機能を拡張するライブラリで、静的・動的なルーティングに対応している。動的なルーティングのパスパラメータは正規表現もサポートしている。

goblinの内部のデータ構造はTrie木をベースにしたロジックで、自分としてできる限りの最適化をしたりしている。(より良いパフォーマンスを求めるならデータ構造を根本から変える必要があるが・・)

今回のproposalに記載されている参照実装とのパフォーマンス比較をやってみたが(リリースされる実際の実装とは異なる可能性があるとは思うが、参考程度にやってみた)、どっこいどっこいという感じ.. cf. Add jba/muxpatterns #23

ServeMuxの機能拡張がリリースされたらgoblinはおそらく使う理由がなくなりそうだなぁと思っている。そもそも使っているのは自分だけで、自分が個人的なアプリケーションで使っているだけだとは思うが・・

goblinは継続的にメンテナンスしていつかは日の目を見る日が・・と思っていたが、今回のproposalで一区切りつきそうw

今後サードパーティのルーティングを採用するかどうかについては、標準のServeMuxが大きな一つの選択肢になってくるのかなと思っている。

サードパーティのルーティングを採用するかどうかの基準としては、標準のServeMuxと比較して、

  • パフォーマンスが良い
    • 実際にリリースされたらgo-router-benchmarkで比較検証してみようと思っている
    • 参照実装をベースに考えるとするなら、そこそこのパフォーマンス叩き出すような気がしている
    • 参照実装のデータ構造がよくわかっていないが、Radix Tree(Radix Treeはパフォーマンスの良いルーターでは当たり前のように導入されているデータ構造。)がベースになっているような雰囲気があった。参照実装は最適化されていなさそうだったので、これが最適化されたらgoblinは少なくともボロ負けだろうし、有名所のライブラリと肩を並べる可能性が全然あると思った
  • 標準にない機能が必要
    • パスパラメータ以外にどんな機能が追加されるのかわからないが、例えばルーティングのグループ化とか、ミドルウェア周りの何かとか、静的ファイル配信周りとか、CORSだとか、、(多分こういう機能はどれも追加されないとは思っている)

パッと思いつくところはこのへん。

サードパーティからServeMuxへの乗り換えのしやすさとかは気になるが、net/httpで定義されているinterface(Handlerとか)に準拠しているかどうかあたりネックかなと思うので、準拠していれば大きな問題はなさそう。準拠していないライブラリからの乗り換えは面倒かもしれない。(ほとんどは準拠しているが一部準拠していないオレオレ実装になっていたりする)

Proposalのコメントに依ると、これから具体的な実装を検討していくようなので、引き続きウォッチしていこうと思う。


関連書籍