网络客户端的可靠同步:引入Resgate


REST APIs很好。简单。无国籍。可扩展。但是现在,你的反应式网络客户的观点(反应/虚拟/角度)被期望实时更新。没有F5重装。

每当发生变化时,您通常会添加一个事件流来发送事件。但是你有两个渠道发送关于相同数据的信息。这就是问题的开始:

Wolf Questioning

如何将休息应用编程接口与事件流同步?

失去联系。也许我应该为重新连接缓冲流?

也许我不应该一直把所有的事件发送给所有的客户。让我们用话题。

我可以过滤未经授权的事件吗?让我们用更多的话题!

甚至有可能进行实时更新的搜索或分页查询吗?

我能以某种方式简化客户端事件处理代码吗?

这个比例会吗?

为什么不能简单一点?!

作为一家领先的联系中心解决方案提供商的云产品的主要开发人员,我不得不处理这些问题。我也看到其他多家公司试图解决同样的问题。让我介绍一个新的解决方案。

实时应用编程接口网关

Resgate

Resgate是一个用Go编写的实时应用编程接口网关。它是一个单一的可执行文件,几乎不需要配置。利用Go的并发模型,它具有高性能,事件延迟小于1毫秒。通过充当web客户端和您的服务(或微服务)之间的桥梁,它将获取资源、转发方法调用和处理事件,同时还提供访问控制、同步、缓存等等。

客户端使用超文本传输协议或网络套接字连接到资源网关,以发出请求。Resgate反过来跟踪每个客户端都请求了哪些资源,并根据需要对其进行可靠的更新。

服务(由节点说明 和下一页)将通过NATS server,一个高性能的消息传递系统。NATS充当服务发现(或者更确切地说,使其变得冗余),并支持近乎无限制的扩展。本质上,它是一个简单、高效的发布/订阅消息代理。

Architecture Diagram 带有Resgate、NATS服务器和两个微服务的基本设置。

编写服务

您像往常一样编写一个服务,但是不是监听HTTP请求,而是请求来自NATS。然而,你仍然有那些令人满意的休息特征:

没有框架要求。没有数据库要求。没有语言要求。

下面是两个展示如何为资源服务的JavaScript代码片段,example.model,与使用Resgate相比,使用超文本传输协议:

使用超文本传输协议(与Express):

var model = { message: "Hello, World!" };
// Listen to HTTP GET requests
app.get('/example/model', (req, resp) => {
  resp.end(JSON.stringify(model));
});

使用Resgate(带NATS):

var model = { message: "Hello, World!" };
// Listen to get requests over NATS
nats.subscribe('get.example.model', (msg, reply) => {
  nats.publish(reply, JSON.stringify({ result: { model }}));
});

很相似,对吧?

更新资源就像发送事件一样简单:

// Updating the model
model.message = "Hello, Resgate!";
nats.publish('event.example.model.change', JSON.stringify({
  values: { message: model.message }
}));

就这样!

现在,让我们看看客户端。

给客户写信

从雷斯盖特获取数据既可以通过超文本传输协议完成,在这种情况下,它的行为很像一个老的学校休息应用编程接口:

得到/api/example/model  

{ "message": "Hello, World!" }

或者可以使用ResClient,一个通过WebSocket获取数据和实时更新的JavaScript库:

let client = new ResClient('ws://api.example.com');
client.get('example.model').then(model => {
  console.log(model.message); // Hello, World!
});

但是当使用ResClient时,数据是实时更新的!

let changeHandler = function() {
    console.log(model.message); // Hello, Resgate!
}

// Subscribe to changes
model.on('change', changeHandler);

// Unsubscribe to changes
model.off('change', changeHandler);

更新数据不需要额外的代码。ResClient为您处理所有这些,因为尽管断开连接、服务重新启动和升级,数据仍能可靠地同步。

摘要

Wolf relaxing

使用Resgate,您可以创建REST和实时应用编程接口,就像用传统方法创建REST应用编程接口一样。主要的好处是让您的数据在您的反应式网络客户端之间无缝同步。

如果您有兴趣了解更多信息,请访问Resgate.io网站。在那里你可以找到指南、例子、现场演示等等。

注意:Resgate和所有相关工具都是在麻省理工学院许可下发布的。