#nats #relay #forward #proxy #nats-io

bin+lib naps

NATS 服务器代理服务,用于中继和转发自定义主题和主题

3 个不稳定版本

0.2.1 2022年2月27日
0.1.1 2022年1月30日
0.1.0 2022年1月26日

#27 in #nats

MIT 许可证

39KB
666

NATS 代理服务

简单工具,用于将特定主题从 one nats.io 集群转发到同一服务器或另一服务器。支持使用 deno JavaScript 或 TypeScript 代码处理消息。

示例

假设我们使用 nats.io 在我们的购物平台中中继每个已确认或取消的订单的事件

./naps --source nats://aws:4222 --destination nats://aks:4222 --topics "orders.>"

如果存在 --script 标志,naps 将启动一个具有所有 v8 功能以及 promises 和所有事件循环功能的 Deno 运行时,允许您仅保留 已确认 的订单并将其转发到 myapp.orders.confirmed。您只需编写一个具有以下签名的 recv 函数

interface RecvResult {
    topic: string,
    msg: string
};

function recv(topic: string, data: Uint8Array): boolean | RecvResult {
    //... your code here...
}
  • 如果函数返回 true,则消息将直接转发到同一主题。**请注意**,消息将最终在该主题中重复两次
  • 如果函数返回 false,则该消息将被丢弃
  • 最后,当返回 RecvResult 时,数据将通过 nats 线路发送

处理示例

./naps --source nats://aws:4222 --destination nats://aks:4222 --topics "myapp.v1.orders" --script "
    import { Buffer } from 'http://deno.land/x/node_buffer/index.ts';
    
    interface Order {
        status: 'confirmed' | 'canceled',
        user: string,
        amount: number,
        item: any
    };
    
    function processOrder(data: Buffer): RecvResult {
        const orderRaw = data.toString();
        const order = JSON.parse(orderRaw) as Order;
        
        // Skip orders that are not confirmed
        if (order.status !== 'confirmed') {
            return false;
        }
        return {
            topic: 'myapp.v1.orders.confirmed',
            msg: orderRaw
        };
    }

    function recv(topic, uint8array) {
        switch (topic) {
            case "myapp.v1.orders":
                return processOrder(Buffer.from(uint8array))
            default:
                // nothing to do...
        }
    }
"

感谢

  • 感谢 Rust 社区提供了如此好的文档和广泛的功能库,这使得这一旅程变得更加容易。
  • 感谢 denoland 社区为我指明了正确的方向。特别感谢 Andreu Botella,这位耐心回答了我所有问题并引导我找到合适解决方案的 denoland 贡献者。非常感谢,兄弟!

待办事项

  • NATS TLS 连接支持
  • JetStream
  • 通过在采用 deno 运行时返回多个 RecvResult 来允许功能传奇

依赖项

~216MB
~4.5M SLoC