NATS.io
1. NATS.ioとは
- NATSはOSSのメッセージキュー
- NATSサーバ自体はGoで実装されている
- クライアントライブラリは各種言語向けが用意されている
2. NATSとNATS JetStream
- NATS単体はPub/Subシステム
- NATS JetStreameはNATSにストリーミング機能と永続化機能を追加したもの
- つまり、NATS単体にはメッセージの永続化機能は無い
- NATS単体では
at most once
- SubscriberがNATSサーバに接続していない状態ではメッセージを受信できない&メッセージは消える
- NATS JetStreameは
exactly once
- 必ずメッセージを実行できる(Subscriberが受信できなかった時はリトライする)
- メッセージの重複が起きない構造になっている(らしい)
3. KEY-VALUEストア
- NATS JetStreameの永続化機能を利用したKEY-VALUEストアを提供可能らしい
- NATS JetStreameは分散システムとして振る舞うのでmemcacheやredisの代用にもなる模様
- [MEMO] そこまで興味はない...
- cf. Key/Value Store | NATS Docs
4. オブジェクトストレージ
5. docker composeで動かしてみる
version: "3.5"
services:
nats:
image: nats
ports:
- "8222:8222"
command: "--cluster_name NATS --cluster nats://0.0.0.0:6222 --http_port 8222 "
nats-1:
image: nats
command: "--cluster_name NATS --cluster nats://0.0.0.0:6222 --routes=nats://ruser:T0pS3cr3t@nats:6222"
depends_on: [ "nats" ]
nats-2:
image: nats
command: "--cluster_name NATS --cluster nats://0.0.0.0:6222 --routes=nats://ruser:T0pS3cr3t@nats:6222"
depends_on: [ "nats" ]
nats-cli:
image: natsio/nats-box
$ docker compose up
- サブスクライバ
- ターミナルを別ウィンドウで開くこと
$ docker compose run nats-cli nats sub -s nats://nats:4222 hello
$ docker compose run nats-cli nats pub -s nats://nats:4222 hello WORLD
[#1] Received on "hello"
WORLD
6. jetstreamモードで起動する
version: "3.5"
services:
nats:
image: nats
ports:
- 4222:4222
- 8222:8222
command: [
"--port",
"4222",
"--http_port",
"8222",
"--jetstream",
"--store_dir",
"/data",
"--debug",
]
nats-cli:
image: natsio/nats-box
-
--store_dir
で指定されたディレクトリにメッセージが保存される
- コンテナ再起動でメッセージがロストしないようにホストマシンとボリュームを共有した方がよさそう
参考資料