DB Streaming ツール materialize を試してみた。

こんにちは k-jun です。今回は Rust 製の DB Streaming ツール materialize を試してみようとおもいます。

https://github.com/MaterializeInc/materialize

某デザインツールと名前が似ているは気にしなかったのでしょうか...? どうやら PostgreSQL を利用するようです。 どうやら firestore のように Client と非同期に通信するのではなく、Database 自体が非同期にデータを取り込んでいるっぽい...?

Run

Docker が用意されているのでこれで起動してみます。

$ docker run -p 6875:6875 materialize/materialized:v0.9.6 --workers 1

PostgereSQL 互換のようなので、psql で接続していきます。

$ psql -U materialize -h localhost -p 6875 materialize
psql (13.4, server 9.5.0)
Type "help" for help.

materialize=>

何やら怪しげな SQL を叩いていきます。

materialize=> CREATE SOURCE market_orders_raw
FROM PUBNUB
SUBSCRIBE KEY 'sub-c-4377ab04-f100-11e3-bffd-02ee2ddab7fe'
CHANNEL 'pubnub-market-orders';
CREATE SOURCE
materialize=> SHOW COLUMNS FROM market_orders_raw;
 name | nullable | type
------+----------+------
 text | f        | text
(1 row)

どうも、ここ からデータを取り込んで Stream で流すみたいですね。それがなぜ Database の層で完結するのかは謎ですが。

materialize=> CREATE VIEW market_orders AS
SELECT
    ((text::jsonb)->>'bid_price')::float AS bid_price,
    (text::jsonb)->>'order_quantity' AS order_quantity,
    (text::jsonb)->>'symbol' AS symbol,
    (text::jsonb)->>'trade_type' AS trade_type,
    to_timestamp(((text::jsonb)->'timestamp')::bigint) AS ts
FROM market_orders_raw;
CREATE VIEW

うーん。知らん syntax だし色々と謎。

CREATE MATERIALIZED VIEW avg_bid AS
SELECT symbol,
       AVG(bid_price) AS avg
FROM market_orders
GROUP BY symbol;

materialize=> SELECT * FROM avg_bid;
   symbol    |        avg
-------------+--------------------
 Apple       | 200.12943851142316
 Google      | 303.64465372226175
 Elerium     |  153.0859976127034
 Bespin Gas  | 221.24196606620828
 Linen Cloth | 245.64254669609824
(5 rows)

なんか取れたけど。なるほど、実際に流れているデータをカテゴライズした結果が返ってきているのか。

https://materialize.com/use-cases/

usecases を見てみると、リアルタイムな分析やエラー検知とどうもサービスで使用するというよりはその周りで使用することが想定されているみたい...? 今の所使いみちは自分も思いついていませんが、時間ができたらもう少し触ってみようと思います。

それでは今回はこのへんで。