🥜

nats server runのデフォルトポートって4222じゃないの?

に公開

結論

  • 違います
    • デフォルトポートが4222なのはnats server runではなくnats-serverです

はじめに

仕事でNATSを使う必要があったので、挙動のイメージを掴むためにチュートリアル動画やデモ用のCLIツールを触っていました。

NATSとは

NATSは以下のような特徴を持つメッセージング基盤である。

  • 軽量なPub/Sub+Req/Rep
  • 多様なメッセージングモデルが使える
    • Proto, JSON, BSON, 文字列など
  • 高いスケーラビリティ

上位システムであるJetStreamと組み合わせるとメッセージの永続化・配信保証などが可能となる。

NATSイメージ図
Pub/Sub, Req/RepはNATS serverを介して行われる。
サブスクライバーは購読したい件名(subject)をサーバに伝えて待機し、パブリッシャーは任意のsubject(事前にNATSサーバに登録するような処理は不要)でデータをNATSサーバに向けて送信する。
NATSサーバがメッセージングを仲介するため、サブスクライバー/パブリッシャーは配信先を気にする必要がない。


初心者向けには以下の動画が公開されており、ここでnats cliを導入教材として紹介していたので私も試すことにしました。
https://www.youtube.com/watch?v=hjXIUPZ7ArM

nats cliを使ってみる

https://github.com/nats-io/natscli/blob/main/README.md
上記のチュートリアルに従って動作確認をしていきます。
nats context add localhost --description "Localhost"実行後、改めてnats ctx select localhostを実行すると以下のような設定が見られます。

PS C:\Users\issan> nats ctx select
[localhost] ? Select a Context localhost
NATS Configuration Context "localhost"

  Description: Localhost
  Server URLs: nats://127.0.0.1:4222
         Path: C:\Users\issan\.config\nats\context\localhost.json

JSON形式での設定ファイルは以下の通りです。

localhost.json
{
  "description": "Localhost",
  "url": "nats://127.0.0.1:4222",
  "socks_proxy": "",
  "token": "",
  "user": "",
  "password": "",
  "creds": "",
  "nkey": "",
  "cert": "",
  "key": "",
  "ca": "",
  "nsc": "",
  "jetstream_domain": "",
  "jetstream_api_prefix": "",
  "jetstream_event_prefix": "",
  "inbox_prefix": "",
  "user_jwt": "",
  "color_scheme": "",
  "tls_first": false,
  "windows_cert_store": "",
  "windows_cert_match_by": "subject",
  "windows_cert_match": "",
  "windows_ca_certs_match": null
}

困ったこと

ここで私は「nats ctx select localhostを実行しておき、nats server runを実行すればlocalhost:4222でサーバが待機してくれるようになる」と理解し、チュートリアルを進めました。
しかしnats bench pub testを実行してみると、出力は以下のようになります。

PS C:\Users\issan> nats bench pub test --msgs 10000000 --clients 2 --no-progress
01:56:51 Starting Core NATS publisher benchmark [clients=2, msg-size=128 B, msgs=10,000,000, multi-subject=false, multi-subject-max=100,000, sleep=0s, subject=test]
nats: error: dial tcp 127.0.0.1:4222: connectex: No connection could be made because the target machine actively refused it.
PS C:\Users\issan>

nats ctx select localhost > nats server runを再度実行しましたが、出力は以下のようになります。

PS C:\Users\issan> nats server run
Starting local development NATS Server instance: nats_development
...
   Extending Remote NATS: false
                     URL: nats://0.0.0.0:65491
           Clean on Exit: false


...
[21056] [INF] Listening for client connections on 0.0.0.0:65491
[21056] [INF] Server is ready

サーバインスタンスはnats_developmentを使っているし、リッスンしているのも0.0.0.0:65491となっていてlocalhostコンテキストで上がっていなさそうです。
localhost:4222で誰も待っていないので、nats bench pub testは当然失敗します。

調査

https://github.com/nats-io/natscli/blob/main/cli/server_run_command.go
実際にnats server runコマンドに相当する部分のコードを確認してみました。
nats server run(nats cliに付属のNATSサーバを立てる機能)としてはコンテキストで何が選ばれていてもnats_developmentの設定に従ってサーバを立ち上げる・nats_developmentがない場合は適当な空きポートを選んでnats_developmentコンテキストそのものを作るような仕様となっているようです。

https://github.com/nats-io/natscli/blob/main/README.md#benchmarking-and-latency-testing

参考にしていたREADMEの「Benchmarking and Latency Testing」はその直前章のチュートリアルから連続して実施できるものではないため、ここで少し環境に手を加える必要があります。

解決方法

1. nats_developmentコンテキストを使用する

パブリッシャー/サブスクライバー側で、nats context select localhostではなくnats ctx select nats_developmentを実行します。

PS C:\Users\issan> nats ctx select nats_development
NATS Configuration Context "nats_development"

  Description: Local user access for NATS Development instance
  Server URLs: nats://127.0.0.1:51123
     Username: local
     Password: ********************************
         Path: C:\Users\issan\.config\nats\context\nats_development.json

PS C:\Users\issan> nats bench pub test --msgs 10000000 --clients 2 --no-progress
02:42:01 Starting Core NATS publisher benchmark [clients=2, msg-size=128 B, msgs=10,000,000, multi-subject=false, multi-subject-max=100,000, sleep=0s, subject=test]
02:42:01 [1] Starting Core NATS publisher, publishing 5,000,000 messages
02:42:01 [2] Starting Core NATS publisher, publishing 5,000,000 messages

NATS Core NATS publisher aggregated stats: 6,622,077 msgs/sec ~ 808 MiB/sec
  [1] 3,619,502 msgs/sec ~ 442 MiB/sec ~ 0.28us (5,000,000 msgs)
  [2] 3,311,038 msgs/sec ~ 404 MiB/sec ~ 0.30us (5,000,000 msgs)
  message rates min 3,311,038 | avg 3,465,270 | max 3,619,502 | stddev 154,232 msgs
  avg latencies min 0.28us | avg 0.29us | max 0.30us | stddev 0.01us

これで、サーバが待っているポートに向けて操作を実行できます。

2. nats-serverをインストールする

そもそもnats cliに付属しているサーバ機能は簡単な試験や動作確認用のものであり、ベンチマークテストのチュートリアルで想定されているのはnats-serverなようです。
https://github.com/nats-io/nats-server

Windows環境であればscoopを用いてワンラインでインストールできます。

PS C:\Users\issan> scoop install nats-server
Installing 'nats-server' (2.12.1) [64bit] from 'main' bucket
nats-server-v2.12.1-windows-amd64.zip (6.4 MB) [============================================] 100%
Checking hash of nats-server-v2.12.1-windows-amd64.zip ... ok.
Extracting nats-server-v2.12.1-windows-amd64.zip ... done.
Linking ~\scoop\apps\nats-server\current => ~\scoop\apps\nats-server\2.12.1
Creating shim for 'nats-server'.
'nats-server' (2.12.1) was installed successfully!

インストール後、nats-server実行で0.0.0.0:4222でリッスンしているのが確認できます。

PS C:\Users\issan> nats-server
[10900] 2025/10/23 00:49:14.339723 [INF] Starting nats-server
[10900] 2025/10/23 00:49:14.352289 [INF]   Version:  2.12.1
[10900] 2025/10/23 00:49:14.352289 [INF]   Git:      [fab5f99]
[10900] 2025/10/23 00:49:14.352289 [INF]   Name:     NAKY3QGU5KC62LD7YJ7T4L3DM3K4YGGZ5ZR7NDYPNIKBRZJWFYQYL35R
[10900] 2025/10/23 00:49:14.352289 [INF]   ID:       NAKY3QGU5KC62LD7YJ7T4L3DM3K4YGGZ5ZR7NDYPNIKBRZJWFYQYL35R
[10900] 2025/10/23 00:49:14.353865 [INF] Listening for client connections on 0.0.0.0:4222
[10900] 2025/10/23 00:49:14.365759 [INF] Server is ready

参考

https://github.com/nats-io/
https://nats.io/
https://docs.nats.io/
https://github.com/nats-io/natscli/tree/main?tab=readme-ov-file#benchmarking-and-latency-testing
https://www.root.cz/clanky/jetstream-nova-technologie-brokeru-nats-konkurujici-kafce
https://blog.devops.dev/nats-jet-strem-hello-world-d909099c88e4
https://qiita.com/takzo/items/eeddc58146ec0489bc53

Discussion