🐙

時雨堂が利用している Erlang/OTP ライブラリ

2024/05/04に公開

時雨堂では Erlang/OTP を利用して商用パッケージソフトウェアを開発しています。

Erlang/OTP でパッケージソフトウェアを作りたいという奇特な方のために、雑に時雨堂がどんなライブラリを利用しているのかを書いていきます。

外部ライブラリの利用について

外部ライブラリの依存が増えれば増えるほどメンテコストが高くなると考えているため、積極的に外部ライブラリの依存を減らすという方針をとっています。

利用しているオープンソース

Cowboy

https://github.com/ninenines/cowboy

開発者のスポンサーをしています

HTTP サーバーライブラリです。 HTTP/2 や 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 ライブラリです。

時雨堂から積極的な貢献をしています。

Ra is continuously tested with the Jepsen distributed system verification framework.

Jepsen によって継続的にテストされています。

jesse

https://github.com/shiguredo/jesse

フォークしています

Erlang/OTP 向けの JSON スキーマライブラリです。
メンテナンスがほぼされていないため、時雨堂でフォークしています。

かなりコードを書き換えて、時雨堂で必要な機能のみに絞っています。

将来的には自社開発に切り替えたいなとは思いますが、モチベーションがまったくないので、なかなか開発に着手できません。

jsone

https://github.com/sile/jsone

社員が開発しています

Erlang/OTP 向けの JSON ライブラリです。
中長期的にメンテナンスされており、開発者は時雨堂の社員です。

Erlang/OTP 27.0 で json ライブラリが標準で付属するようになったため、将来的には shiguredo/jsone という、標準の json ライブラリを利用した jsone インターフェース互換ライブラリを開発予定です。

自社オープンソース

一部、時雨堂が 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

自社クローズドソース

詳細は公開しませんが、以下のようなライブラリを自社開発しています。
全て Erlang で実装されており NIF は利用していません。

  • DTLS
  • RTP
  • RTCP
  • SRTP
  • SDP
  • STUN
  • TURN
  • ICE
  • SCTP
  • WebM (EBML)
  • MP4
  • QUIC

Discussion