mcpField
N
nats

nats

github.com/claude-dev-suite开发4695 次安装2 天前更新
代码仓库

关于 nats

nats 是介绍 NATS 核心概念与实践的技能,面向使用 NATS 构建消息系统的开发者。内容涵盖 Core NATS 与 JetStream、主题模式、示例代码、故障排查及生产配置要点。

主要功能

  1. 01说明 Core NATS 与 JetStream 差异
  2. 02提供主题命名与通配符示例
  3. 03展示 Node.js、Python 和 Go 用法
  4. 04列出常见反模式与排查方法
  5. 05提供生产环境检查清单

适用场景

  1. 01学习 NATS 发布与订阅基础
  2. 02为消息系统选择 Core NATS 或 JetStream
  3. 03排查主题、请求超时或消费者延迟
  4. 04检查生产环境的安全和集群配置

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/claude-dev-suite/claude-dev-suite --skill nats

安装后在 Claude Code 中输入/nats确认已加载。

附带文件advanced.md

详细介绍

NATS 核心知识

完整参考:JetStream 模式(Node.js、Java)、安全配置、TLS 设置和集群相关内容,请参阅 advanced.md。

深入了解:使用 mcp__documentation__fetch_docs 并将技术指定为 nats,获取全面的文档。

快速开始(Docker)

# docker-compose.yml
services:
  nats:
    image: nats:latest
    ports:
      - "4222:4222"   # Client
      - "8222:8222"   # Monitoring
    command: "-js -m 8222"  # Enable JetStream

核心概念

功能Core NATSJetStream
持久化否是
投递至多一次至少一次
重放否是
消费者组队列组消费者组

主题模式

orders.created     → Specific subject
orders.*           → orders.created, orders.updated (single wildcard)
orders.>           → orders.created, orders.us.east (multi wildcard)

Core NATS(Node.js)

import { connect, StringCodec } from 'nats';

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

// Simple publish
nc.publish('orders.created', sc.encode(JSON.stringify(order)));

// Subscribe
const sub = nc.subscribe('orders.*');
for await (const msg of sub) {
  const order = JSON.parse(sc.decode(msg.data));
  console.log(`Received on ${msg.subject}:`, order);
}

// Queue group (load balancing)
const qsub = nc.subscribe('orders.process', { queue: 'workers' });

// Request/Reply
const response = await nc.request('orders.validate', sc.encode(JSON.stringify(order)), {
  timeout: 5000,
});
const result = JSON.parse(sc.decode(response.data));

await nc.drain();

Core NATS(Python)

import nats
import json
import asyncio

async def main():
    nc = await nats.connect("nats://localhost:4222")

    # Publish
    await nc.publish("orders.created", json.dumps(order).encode())

    # Subscribe
    async def message_handler(msg):
        order = json.loads(msg.data.decode())
        print(f"Received: {order}")

    await nc.subscribe("orders.*", cb=message_handler)

    # Request/Reply
    response = await nc.request("orders.validate",
                                json.dumps(order).encode(),
                                timeout=5)
    result = json.loads(response.data.decode())

    await nc.drain()

asyncio.run(main())

Core NATS(Go)

nc, _ := nats.Connect(nats.DefaultURL)
defer nc.Drain()

// Publish
body, _ := json.Marshal(order)
nc.Publish("orders.created", body)

// Subscribe
nc.Subscribe("orders.*", func(msg *nats.Msg) {
    var order Order
    json.Unmarshal(msg.Data, &order)
    processOrder(order)
})

// Queue group
nc.QueueSubscribe("orders.process", "workers", func(msg *nats.Msg) {
    // Load balanced
})

// Request/Reply
response, _ := nc.Request("orders.validate", body, 5*time.Second)

不适用此技能的情况

  • 需要长期事件重放——Kafka 提供更好的保留能力
  • 路由模式复杂——RabbitMQ 交换器更加灵活
  • 需要符合 JMS 标准——使用 ActiveMQ
  • 需要与 AWS 原生集成——SQS 的集成效果更好

反模式

反模式不妥之处解决方案
使用 Core NATS 处理关键数据即发即弃使用 JetStream 实现持久化
没有主题层级难以筛选使用以点分隔的主题
请求没有超时请求可能挂起始终设置超时时间
载荷过大增加网络负担保持消息精简
在生产环境中使用单台服务没有高可用性部署包含 3 台或更多服务的集群

快速故障排查

问题可能原因解决方法
未收到消息主题错误验证主题名称并检查通配符
请求超时没有响应方验证响应方是否存在
JetStream 错误未启用使用 -js 标志启动服务
消费者延迟持续增长处理速度较慢增加消费者或优化处理
ACK 超时处理速度过慢增加 ack_wait

生产环境检查清单

  • 已启用 TLS
  • 已配置身份验证
  • 已配置授权(权限)
  • JetStream 副本数 >= 3
  • 已配置流限制
  • 已设置消费者 max_deliver
  • 已配置 ACK 超时时间
  • 已设置监控仪表板
  • 已配置集群运行状况检查

参考文档

可用主题:basics、jetstream、patterns、production

评论

支持 Markdown