使用Firebase模拟RPC

时间:2014-07-24 15:11:42

标签: firebase

我正在使用 Firebase 来监控整个建筑物内的机器。 所以架构是多个前端和多台机器。

在某个时刻,我希望能够在这些机器上触发一些操作,例如:

  • 截取屏幕截图并输入ftp
  • 编码某个视频文件
  • 分析大型数据集
  

我习惯 Actionscript ,有 NetConnection 和   可以调用远程方法的客户端对象。

     
      
  • Firebase 中有类似内容吗?
  •   
  • 您如何轻松实现此功能?
  •   

我想到了一个使用数组的消息框,其中消息可以是如下数据结构:

{ 
  'client_id': 'xxx-yyy-zzz', 
  'name': 'takeScrenshot', 
  'body': { 'creator': 'my-name' },
  'timestamp': 1406214344
}

如何运作

  • 方法调用是输入此消息框数组的消息数组
  • 使用此消息框中的value_changed进行侦听
  • 从数组中弹出项目(这将触发另一个值更改)
  • 使用该项执行异步操作
  • 当异步操作完成时,使用client_id,通知调用者操作

但要正确实现它必须做很多工作,有没有人知道是否有一种简单的方法来实现这种功能?

1 个答案:

答案 0 :(得分:4)

由于Firebase是一个功能强大的后端服务,可扩展,并且除了SDK之外还有一个RESTful API(遗憾的是还没有用于Python),它通常最直接地使用它,而不是在顶层设计API服务它的。

一种快速有效的方法是使用queue approach。让每个客户端将数据写入in/路径,并让该事件的收件人在该路径上侦听child_added。然后执行远程调用,并将数据写回请求客户端的out/路径。

<强>客户端

// send it
var ref = new Firebase(QUEUE_URL);
var request = ref.child('in').push( requestData );

// wait for a reply and remove after processing
ref.child('out/'+request.name()).on('value', function(snap) {
   if( snap.val() !== null ) {
      console.log(snap.val());
      request.remove();
      // stop listening
      snap.ref().off();
   }
});

远程服务

var ref = new Firebase(QUEUE_URL);

// listen for queue events
ref.child('in').on('child_added', function(snap) {
   /*
     ... process queue event ...
    */
   doneProcessing(snap, resultData);
});

function doneProcessing(snap, results) {
   ref.child('out/'+snap.name()).set(results);
   snap.ref().remove();
}