counters モジュール

OTP 21.2 に counters モジュールが入りました。

このモジュールを大変簡単に説明すると、ETS の update_counter を使っていたものがこれに置き換えることができる機能です。

64 ビットのカウンターを利用することが可能です。

Ref = counters:new(10, [write_concurrency]),
ok = counters:add(Ref, 1, 1),
counters:get(Ref, 1),

使い方はいたって簡単です。 counters:new でサイズを指定します。個々でオプションは write_councurrency にしてます。

write_concurrency は並列での書き込みを優先します。複数プロセスからカウンターを触りたいときはこちらを。一つのプロセスから触りたいときは atomics を指定するのがいいでしょう。

サイズに 10 を指定すると 10 個のカウンターが生成されます。1–10 です。あとはそれに対して数値を渡せば加算と減算ができます。参考までに +1 して値を取得してみています。

まずは Wandbox で counters が試せるので、動かしてみてください。

この機能、今まで統計情報といえば ets という選択しかありませんでした。そして ets は遅すぎるという問題がありました。

実際 ets が遅い問題から MachineZone 以前 NIF を利用したカウンターを実装、公開しています。

こんな動画もあるので、興味ある人は是非。

counters はカウンターを実装する際、ets を選択しなくてよくなります。本当に最高です。

Erlang でミドルウェアを実装していると統計情報のためのカウンター(ets)が遅すぎて、問題になってきます。少し溜め込んでから書き込むなどが必要になったりなったりします。

ただこの counters を利用すればその懸念は一切なくなります。好きなときに統計情報を更新して良くなります。

統計情報は主に接続単位と全体の2つを持つことが多いです。全体は ets をかならず使う必要がありましたが、これは解決します。

また、接続単位はシンプルに 1 プロセスでの構成なら state に map で持つという手もあります。ただそんなシンプルな実装はそうそうプロトコルが許してくれません。殆どの場合は複数プロセスでカウンター情報を共有する必要がでてきます。結局 ets です。

この2つを counters に置き換えられるます。つまり ets なんだっけそれ、という話になります。

counters はすでに master にマージされています。21.2 で利用可能になりました。

Erlang/OTP のコミットログを見てると日々進化してるなと感じさせられますが、この counters モジュールは本当に待ち望んでいたものです。

もし Erlang で統計情報を利用しているミドルウェアがあるのであれば、是非使ってみてください。

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store