jpskill.com
🛠️ 開発・MCP コミュニティ

nats-messaging

NATSという軽量なメッセージング基盤を活用し、マイクロサービス間の連携やイベント駆動型アーキテクチャを構築、KafkaやRabbitMQよりも手軽に分散メッセージングシステムを構築するSkill。

📜 元の英語説明(参考)

Build distributed messaging systems with NATS — pub/sub, request/reply, JetStream persistent messaging, and key-value store. Use when someone asks to "set up message queue", "pub/sub system", "event-driven architecture", "NATS messaging", "distributed messaging", "microservice communication", "message broker", or "replace Kafka/RabbitMQ with something simpler". Covers core NATS, JetStream, KV store, and object store.

🇯🇵 日本人クリエイター向け解説

一言でいうと

NATSという軽量なメッセージング基盤を活用し、マイクロサービス間の連携やイベント駆動型アーキテクチャを構築、KafkaやRabbitMQよりも手軽に分散メッセージングシステムを構築するSkill。

※ jpskill.com 編集部が日本のビジネス現場向けに補足した解説です。Skill本体の挙動とは独立した参考情報です。

⚡ おすすめ: コマンド1行でインストール(60秒)

下記のコマンドをコピーしてターミナル(Mac/Linux)または PowerShell(Windows)に貼り付けてください。 ダウンロード → 解凍 → 配置まで全自動。

🍎 Mac / 🐧 Linux
mkdir -p ~/.claude/skills && cd ~/.claude/skills && curl -L -o nats-messaging.zip https://jpskill.com/download/15157.zip && unzip -o nats-messaging.zip && rm nats-messaging.zip
🪟 Windows (PowerShell)
$d = "$env:USERPROFILE\.claude\skills"; ni -Force -ItemType Directory $d | Out-Null; iwr https://jpskill.com/download/15157.zip -OutFile "$d\nats-messaging.zip"; Expand-Archive "$d\nats-messaging.zip" -DestinationPath $d -Force; ri "$d\nats-messaging.zip"

完了後、Claude Code を再起動 → 普通に「動画プロンプト作って」のように話しかけるだけで自動発動します。

💾 手動でダウンロードしたい(コマンドが難しい人向け)
  1. 1. 下の青いボタンを押して nats-messaging.zip をダウンロード
  2. 2. ZIPファイルをダブルクリックで解凍 → nats-messaging フォルダができる
  3. 3. そのフォルダを C:\Users\あなたの名前\.claude\skills\(Win)または ~/.claude/skills/(Mac)へ移動
  4. 4. Claude Code を再起動

⚠️ ダウンロード・利用は自己責任でお願いします。当サイトは内容・動作・安全性について責任を負いません。

🎯 このSkillでできること

下記の説明文を読むと、このSkillがあなたに何をしてくれるかが分かります。Claudeにこの分野の依頼をすると、自動で発動します。

📦 インストール方法 (3ステップ)

  1. 1. 上の「ダウンロード」ボタンを押して .skill ファイルを取得
  2. 2. ファイル名の拡張子を .skill から .zip に変えて展開(macは自動展開可)
  3. 3. 展開してできたフォルダを、ホームフォルダの .claude/skills/ に置く
    • · macOS / Linux: ~/.claude/skills/
    • · Windows: %USERPROFILE%\.claude\skills\

Claude Code を再起動すれば完了。「このSkillを使って…」と話しかけなくても、関連する依頼で自動的に呼び出されます。

詳しい使い方ガイドを見る →
最終更新
2026-05-18
取得日時
2026-05-18
同梱ファイル
1

📖 Skill本文(日本語訳)

※ 原文(英語/中国語)を Gemini で日本語化したものです。Claude 自身は原文を読みます。誤訳がある場合は原文をご確認ください。

NATS Messaging

概要

NATS は、分散アプリケーション向けの軽量で高性能なメッセージングシステムです。Kafka よりもシンプルで、RabbitMQ よりも高速であり、組み込みの永続化機能 (JetStream)、キーバリューストア、およびオブジェクトストアを備えています。単一のバイナリで、依存関係がなく、どこでも実行できます。

どのような時に使うか

  • マイクロサービス間の通信 (イベント、コマンド、クエリ)
  • 永続化とリプレイによるリアルタイムデータストリーミング
  • Redis を実行せずに分散キーバリューストア
  • リクエスト/リプライパターン (非同期トランスポート上の同期メッセージング)
  • 小規模から中規模のデプロイメントにおける Kafka/RabbitMQ の代替

手順

セットアップ

# NATS サーバーのインストール
docker run -d --name nats -p 4222:4222 -p 8222:8222 nats:latest -js

# クライアントのインストール
npm install nats

Core Pub/Sub

// pub-sub.ts — 基本的な publish/subscribe メッセージング
import { connect, StringCodec } from "nats";

const nc = await connect({ servers: "localhost:4222" });
const sc = StringCodec();

// Subscribe
const sub = nc.subscribe("orders.created");
(async () => {
  for await (const msg of sub) {
    const order = JSON.parse(sc.decode(msg.data));
    console.log(`New order: ${order.id} — $${order.total}`);
  }
})();

// Publish
nc.publish("orders.created", sc.encode(JSON.stringify({
  id: "ord_123",
  total: 99.99,
  items: ["widget-a", "widget-b"],
})));

JetStream (永続的なメッセージング)

// jetstream.ts — リプレイと確認応答を備えた永続的なストリーム
import { connect, StringCodec, AckPolicy, DeliverPolicy } from "nats";

const nc = await connect({ servers: "localhost:4222" });
const js = nc.jetstream();
const jsm = await nc.jetstreamManager();
const sc = StringCodec();

// ストリームの作成 (Kafka トピックのようなもの)
await jsm.streams.add({
  name: "ORDERS",
  subjects: ["orders.>"],           // すべての注文イベントをキャプチャ
  retention: "limits",              // 制限に達するまでメッセージを保持
  max_msgs: 1_000_000,
  max_age: 7 * 24 * 60 * 60 * 1e9, // 7 日間 (ナノ秒単位)
});

// ストリームへのパブリッシュ
await js.publish("orders.created", sc.encode(JSON.stringify({
  id: "ord_456", total: 149.99,
})));

// 永続的なコンシューマー (再起動後も存続)
const consumer = await jsm.consumers.add("ORDERS", {
  durable_name: "order-processor",
  ack_policy: AckPolicy.Explicit,
  deliver_policy: DeliverPolicy.All,  // 最初からリプレイ
});

// メッセージの処理
const sub = await js.consumers.get("ORDERS", "order-processor");
const messages = await sub.consume();
for await (const msg of messages) {
  const order = JSON.parse(sc.decode(msg.data));
  console.log(`Processing: ${order.id}`);
  msg.ack();  // 確認応答 — 再配信されない
}

Request/Reply

// request-reply.ts — 同期メッセージングパターン
import { connect, StringCodec } from "nats";

const nc = await connect({ servers: "localhost:4222" });
const sc = StringCodec();

// サービス (レスポンダー)
nc.subscribe("users.get", {
  callback: async (err, msg) => {
    const { id } = JSON.parse(sc.decode(msg.data));
    const user = await db.user.findUnique({ where: { id } });
    msg.respond(sc.encode(JSON.stringify(user)));
  },
});

// クライアント (リクエスター) — 応答を待機
const response = await nc.request(
  "users.get",
  sc.encode(JSON.stringify({ id: "user_123" })),
  { timeout: 5000 }  // 5 秒のタイムアウト
);
const user = JSON.parse(sc.decode(response.data));

Key-Value Store

// kv.ts — 分散キーバリューストア (単純なケースでは Redis の代替)
import { connect } from "nats";

const nc = await connect({ servers: "localhost:4222" });
const js = nc.jetstream();

// KV バケットの作成
const kv = await js.views.kv("sessions");

// セット
await kv.put("user:123", JSON.stringify({ token: "abc", expiresAt: Date.now() + 3600000 }));

// ゲット
const entry = await kv.get("user:123");
const session = JSON.parse(entry?.string() || "null");

// 変更の監視 (リアルタイム)
const watch = await kv.watch();
for await (const entry of watch) {
  console.log(`${entry.key} changed: ${entry.string()}`);
}

// 削除
await kv.delete("user:123");

例 1: イベント駆動型マイクロサービスアーキテクチャ

ユーザープロンプト: "3 つのマイクロサービス (orders、payments、notifications) 間のイベント駆動型通信をセットアップします。"

エージェントは、各ドメインに対して JetStream ストリームを作成し、ドメインイベント (order.created、payment.completed) をパブリッシュし、各サービスに永続的なコンシューマーをセットアップします。

例 2: Redis を NATS KV に置き換える

ユーザープロンプト: "セッションデータ用のキーバリューストアが必要ですが、Redis を実行したくありません。"

エージェントは、TTL を持つセッション用の NATS KV バケットをセットアップし、get/set/delete 操作を実行し、リアルタイムのセッション変更を監視します。

ガイドライン

  • fire-and-forget には Core NATS — 高速な pub/sub、永続化なし
  • 永続的なメッセージングには JetStream — メッセージを失ってはならない場合
  • 信頼性のために明示的な ack — 処理後、処理前にではなく確認応答
  • . を使用したサブジェクト階層orders.createdorders.shippedorders.> をサブスクライブ
  • 単純なケースでは KV が Redis を置き換える — セッションストレージ、構成、フィーチャーフラグ
  • 単一のバイナリ — NATS サーバーは 15MB で、どこでも実行でき、JVM は不要
  • HA のためのクラスター — 本番環境の回復力のための 3 ノードクラスター
  • コンシューマーグループ — 同じコンシューマーの複数のインスタンスがワークロードを共有
  • メッセージあたり最大 1MB — より大きなペイロードにはオブジェクトストアを使用
📜 原文 SKILL.md(Claudeが読む英語/中国語)を展開

NATS Messaging

Overview

NATS is a lightweight, high-performance messaging system for distributed applications. Simpler than Kafka, faster than RabbitMQ, with built-in persistence (JetStream), key-value store, and object store. Single binary, zero dependencies, runs anywhere.

When to Use

  • Microservice-to-microservice communication (events, commands, queries)
  • Real-time data streaming with persistence and replay
  • Distributed key-value store without running Redis
  • Request/reply patterns (synchronous messaging over async transport)
  • Replacing Kafka/RabbitMQ in small-to-medium deployments

Instructions

Setup

# Install NATS server
docker run -d --name nats -p 4222:4222 -p 8222:8222 nats:latest -js

# Install client
npm install nats

Core Pub/Sub

// pub-sub.ts — Basic publish/subscribe messaging
import { connect, StringCodec } from "nats";

const nc = await connect({ servers: "localhost:4222" });
const sc = StringCodec();

// Subscribe
const sub = nc.subscribe("orders.created");
(async () => {
  for await (const msg of sub) {
    const order = JSON.parse(sc.decode(msg.data));
    console.log(`New order: ${order.id} — $${order.total}`);
  }
})();

// Publish
nc.publish("orders.created", sc.encode(JSON.stringify({
  id: "ord_123",
  total: 99.99,
  items: ["widget-a", "widget-b"],
})));

JetStream (Persistent Messaging)

// jetstream.ts — Durable streams with replay and acknowledgment
import { connect, StringCodec, AckPolicy, DeliverPolicy } from "nats";

const nc = await connect({ servers: "localhost:4222" });
const js = nc.jetstream();
const jsm = await nc.jetstreamManager();
const sc = StringCodec();

// Create a stream (like a Kafka topic)
await jsm.streams.add({
  name: "ORDERS",
  subjects: ["orders.>"],           // Capture all order events
  retention: "limits",              // Keep messages until limits hit
  max_msgs: 1_000_000,
  max_age: 7 * 24 * 60 * 60 * 1e9, // 7 days in nanoseconds
});

// Publish to stream
await js.publish("orders.created", sc.encode(JSON.stringify({
  id: "ord_456", total: 149.99,
})));

// Durable consumer (survives restarts)
const consumer = await jsm.consumers.add("ORDERS", {
  durable_name: "order-processor",
  ack_policy: AckPolicy.Explicit,
  deliver_policy: DeliverPolicy.All,  // Replay from beginning
});

// Process messages
const sub = await js.consumers.get("ORDERS", "order-processor");
const messages = await sub.consume();
for await (const msg of messages) {
  const order = JSON.parse(sc.decode(msg.data));
  console.log(`Processing: ${order.id}`);
  msg.ack();  // Acknowledge — won't be redelivered
}

Request/Reply

// request-reply.ts — Synchronous messaging pattern
import { connect, StringCodec } from "nats";

const nc = await connect({ servers: "localhost:4222" });
const sc = StringCodec();

// Service (responder)
nc.subscribe("users.get", {
  callback: async (err, msg) => {
    const { id } = JSON.parse(sc.decode(msg.data));
    const user = await db.user.findUnique({ where: { id } });
    msg.respond(sc.encode(JSON.stringify(user)));
  },
});

// Client (requester) — waits for response
const response = await nc.request(
  "users.get",
  sc.encode(JSON.stringify({ id: "user_123" })),
  { timeout: 5000 }  // 5 second timeout
);
const user = JSON.parse(sc.decode(response.data));

Key-Value Store

// kv.ts — Distributed key-value store (replaces Redis for simple cases)
import { connect } from "nats";

const nc = await connect({ servers: "localhost:4222" });
const js = nc.jetstream();

// Create KV bucket
const kv = await js.views.kv("sessions");

// Set
await kv.put("user:123", JSON.stringify({ token: "abc", expiresAt: Date.now() + 3600000 }));

// Get
const entry = await kv.get("user:123");
const session = JSON.parse(entry?.string() || "null");

// Watch for changes (real-time)
const watch = await kv.watch();
for await (const entry of watch) {
  console.log(`${entry.key} changed: ${entry.string()}`);
}

// Delete
await kv.delete("user:123");

Examples

Example 1: Event-driven microservice architecture

User prompt: "Set up event-driven communication between 3 microservices: orders, payments, and notifications."

The agent will create a JetStream stream for each domain, publish domain events (order.created, payment.completed), and set up durable consumers in each service.

Example 2: Replace Redis with NATS KV

User prompt: "I need a key-value store for session data but don't want to run Redis."

The agent will set up NATS KV bucket for sessions with TTL, get/set/delete operations, and watch for real-time session changes.

Guidelines

  • Core NATS for fire-and-forget — fast pub/sub, no persistence
  • JetStream for durable messaging — when messages must not be lost
  • Explicit ack for reliability — acknowledge after processing, not before
  • Subject hierarchy with .orders.created, orders.shipped, subscribe to orders.>
  • KV replaces Redis for simple cases — session storage, config, feature flags
  • Single binary — NATS server is 15MB, runs anywhere, no JVM
  • Cluster for HA — 3-node cluster for production resilience
  • Consumer groups — multiple instances of the same consumer share the workload
  • Max 1MB per message — use Object Store for larger payloads