将Webhook订阅实现为API资源

时间:2018-12-14 20:00:29

标签: node.js express webhooks api-design

使用以下路线考虑以下香草api资源:

`POST` `{{baseurl}}/api/v1/users`    
//with request body of 
{
    "username":"adam12",
    "password":"abc123"
}

`GET` `{{baseurl}}/api/v1/users`   
`GET` `{{baseurl}}/api/v1/users/:id`   
`PUT` `{{baseurl}}/api/v1/users/:id`   
`DELETE` `{{baseurl}}/api/v1/users/:id`

其中{{baseurl}}localhost:3000

我在这里有一个有效的实现代码:https://github.com/mmcguff/webhookLearning

在这一点上,与此users资源进行交互的客户端必须发送GET请求,以便了解对此资源的更改。如果需要此资源的实时数据,则必须创建一个轮询循环,该循环将消耗服务器上两个客户端上的资源,以响应这些请求。

我知道解决此问题的正确方法是为此资源实现Webhook订阅,但是我在node.js中找不到关于如何执行此操作的明确的最佳实践类型信息。我在npm中发现的软件包目前下载量很少,这使我相信必须有一种更好的方式供他人使用。

从原始API到Webhook API的迁移方面的任何帮助都对我和社区中的每个人都非常有用。

1 个答案:

答案 0 :(得分:1)

通常将队列用于此类事情。例如,GitHub很久以前就为Ruby开源了一个名为resque的Ruby。特别是在Node中,您可以查看bull。 Bull使用Redis来存储类似于resque的排队事件。员工订阅他们关心的事件并进行相应处理。

现在为您的用例提供一个实用但有限的示例:

const Queue = require('bull');
const rp = require('request-promise');

const userQueue = new Queue('user');

app.post(`/v1/users`, (req, res) => {
  userQueue.add({username: req.body.username, email: req.body.email});
  return res.send(`OK`);
});

const userSubscribers = [
  {
    hookUrl: `http://example.com/user-hook`
  }
];

userQueue.process(job => {
  return Promise.all(userSubscribers.map(subscriber => {
    const options = {
      method: `POST`,
      uri: subscriber.hookUrl,
      body: job.data,
      json: true
    };
    return rp(options);
  });
});

对于其他折衷方案,可以使用Kafka代替webhooks。