3 个不稳定版本
0.2.1 | 2022年2月27日 |
---|---|
0.1.1 | 2022年1月30日 |
0.1.0 | 2022年1月26日 |
#27 in #nats
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