時雨堂が利用している Erlang/OTP ライブラリ
時雨堂では Erlang/OTP を利用して商用パッケージソフトウェアを開発しています。
Erlang/OTP でパッケージソフトウェアを作りたいという奇特な方のために、
雑に時雨堂がどんなライブラリを利用しているのかを書いていきます。
外部ライブラリの利用について
外部ライブラリの依存が増えれば増えるほどメンテコストが高くなると考えているため、
積極的に外部ライブラリの依存を減らすという方針をとっています。
できるだけ Erlang/OTP に付属しているライブラリを利用するようにしています。
利用しているオープンソース
Cowboy
https://github.com/ninenines/cowboy
開発者のスポンサーをしています
HTTP サーバーライブラリです。 HTTP/2 や HTTP/3 と WebSocket に対応しています。
シンプルかつ、長期的にメンテナンスがされています。
時雨堂も開発に貢献しています。
Gun
https://github.com/ninenines/gun
開発者のスポンサーをしています
Cowboy と同じ開発者が開発している、非同期 HTTP クライアントライブラリです。HTTP/2 や WebSocket に対応しています。
シンプルかつ、長期的にメンテナンスがされています。
時雨堂も開発に貢献しています。
Ranch
https://github.com/ninenines/ranch
開発者のスポンサーをしています
Cowboy と同じ開発者が開発している、TCP プロトコルのソケットアクセプタプールライブラリです。
もともと気軽に使える gen_tcp をより使いやすくしてくれます。
Gproc
https://github.com/uwiger/gproc
開発者のスポンサーをしています
Erlang のプロセスに名前を付けられるライブラリです。
QuickCheck を利用して十分なテストがされており、
長い間利用してきていますが、バグが出たことは今のところありません。
将来的に自前ライブラリに切り替えたいですが、
安定性と信頼性がありすぎて、なかなか切り替えられません。
Ra
https://github.com/rabbitmq/ra
積極的な貢献をしています
RabbitMQ が開発/利用している Raft ライブラリです。
時雨堂から積極的な貢献をしています。
- Fix a bug that `ra:restart_server/2` could raise an exception by sile · Pull Request #359 · rabbitmq/ra
- Fix crash caused by receiving `#append_entries_reply{success=false}` from unknown peer by sile · Pull Request #432 · rabbitmq/ra
- Prevent non-voting (new and not-yet-caught-up) replicas from becoming cluster leader in certain scenarios by sile · Pull Request #435 · rabbitmq/ra
- Fix a bug where the leader is never elected even if the majority of the members are alive. by sile · Pull Request #442 · rabbitmq/ra
- Exclude `non_voter` server from quorum calculation by sile · Pull Request #427 · rabbitmq/ra
- Quote `maybe` atoms by sile · Pull Request #401 · rabbitmq/ra
Ra is continuously tested with the Jepsen distributed system verification framework.
Jepsen によって継続的にテストされています。
jesse
https://github.com/shiguredo/jesse
フォークしています
Erlang/OTP 向けの JSON スキーマライブラリです。時雨堂でフォークしています。
かなりコードを書き換えて、時雨堂で必要な機能のみに絞っています。
将来的には自社開発に切り替えたいなとは思いますが、
モチベーションがまったくないので、なかなか開発に着手できません。
自社オープンソース
一部、時雨堂が OSS として公開しているライブラリも書いておきます。
基本的に自社で利用する事のみを想定しています。ただ汎用的なライブラリということもあり OSS にしています。
全て Apache License 2.0 で公開しています。
Swidden
https://github.com/shiguredo/swidden
RESTful API が得意ではないので、
AWS の API 仕様を真似した独自 HTTP API フレームワークです。
- 指定したヘッダー名の値を使いディスパッチする
- URI は / のみ
- メソッドは POST のみ
- ヘッダー値は
サービス_バージョン.オペレーション
という形式 - 入り口と出口が JSON
- 何も送らなければ Body は空になる
kvconf
https://github.com/shiguredo/kvconf
INI からセクション機能を除いた INI 風の設定ファイルライブラリです。
Erlang のレコードを利用したバリデーター設定機能が入っており、
Erlang コンパイラーや Dialyzer の恩恵を受けられます。
base32_clockwork
https://github.com/shiguredo/base32_clockwork
ULID を試した時に、バイナリデータが base32 でエンコードされているのが良かったため、 Base32 ライブラリを使おうと持ったら、Crockford's Base32 が期待値とは異なったため、 独自仕様を採用した Base32 ライブラリです。
仕様は以下に公開されています。
https://gist.github.com/szktty/228f85794e4187882a77734c89c384a8
jsone
https://github.com/shiguredo/jsone
Erlang/OTP 標準の json ライブラリ をラップして sile/jsone に寄せているライブラリです。もともと sile/jsone を利用していましたが、標準ライブラリを利用する用に切り替えました。
開発/テスト/デバッグツール
色々な OSS に助けられてます。
- erlang/rebar3: Erlang build tool that makes it easy to compile and test Erlang applications and releases.
- proper-testing/proper: PropEr: a QuickCheck-inspired property-based testing tool for Erlang
- ferd/recon: Collection of functions and scripts to debug Erlang in production.
- sile/efmt: Erlang code formatter
- sile/erlls: Erlang language server
- WhatsApp/erlang-language-platform: Erlang Language Platform. LSP server and CLI.
パッケージサービス
-
Hex
- Private packages を利用しています
自社クローズドソース
以下のようなライブラリを自社開発しています。
全て Erlang で実装されており NIF は利用していません。
- RTP/RTCP
- SRTP/SRTCP
- SCTP
- DCEP (Data Channel Establishment Protocol)
- DTLS
- SDP
- STUN
- TURN
- ICE
- WebM (EBML)
- MP4
- QUIC
- PCAP
Discussion