Firebase 多组操作-最后将执行哪些操作?

Firebase 多组操作-最后将执行哪些操作?,firebase,Firebase,当文件更改时,我必须与firebase同步。我知道如何在文件更改时设置处理程序,然后调用Firebase.set。但是,如果文件很大(9mb),例如,set操作需要30秒才能完成,同时文件再次更改,会发生什么情况呢?当在某些位置上进行设置并在同一位置上执行第二次设置时,会发生什么情况 Fb是否会自动取消正在进行的操作并重新启动 或者等到正在进行的操作完成后再重新开始 或者,最好监控在goven位置上的设置是否正在进行,以及是否在进行中的操作完成后排队等待下一个设置操作 样品试验 ref1 =

当文件更改时,我必须与firebase同步。我知道如何在文件更改时设置处理程序,然后调用
Firebase.set
。但是,如果文件很大(9mb),例如,
set
操作需要30秒才能完成,同时文件再次更改,会发生什么情况呢?当在某些位置上进行设置并在同一位置上执行第二次设置时,会发生什么情况

  • Fb是否会自动取消正在进行的操作并重新启动
  • 或者等到正在进行的操作完成后再重新开始
  • 或者,最好监控在goven位置上的设置是否正在进行,以及是否在进行中的操作完成后排队等待下一个设置操作

  • 样品试验

    ref1 = new Firebase('https://my_firebase.firebaseio.com/some_location')
    ref2 = new Firebase('https://my_firebase.firebaseio.com/some_location')
    ref1.set({ some_large_data: 'abcef...' });
    ref2.set({ some_large_data: '12345...' });
    // which set will take effect on server? second? Or random (second that actually completes)?
    

    如果我理解正确,您的问题是关于此流程:

  • 客户端A开始上传一个巨大的文件
  • 客户端B开始上载较小的文件
  • 客户端B的上载完成
  • 客户端A的上载完成
  • Firebase的服务器将以事务方式处理更新,因此不会发生部分更新

    最后一次(完全)到达Firebase服务器的更新将在节点中结束

    如果您想要控制这种类型的并发访问,可能最好使用工作队列。当然,Firebase也非常适合同步对此类工作队列的访问。:-)


    因此,在上面的流程中,在第3步之前,不会在服务器上写入Firebase节点。在第4步之后,Firebase将写入大文件,并“忘记”客户端B中的小文件曾经存在。如果你想防止这种意外的重写,你可以考虑步骤0是“客户端锁定上传位置的<代码>事务< /代码>调用”。这将基本上在Firebase的乐观锁定方法之上实现悲观锁定。

    因此,在测试之后,Firebase似乎将依次在服务器上执行所有
    set
    操作,即使在上一次远程完成之前在本地完成下一次操作,也不会取消其中任何操作

    这意味着如果调用
    set()
    100次,每个set操作都会影响远程数据(数据库)。对于我的用例来说,这是不好的,因为每次文件更改时,它都会完全上传到firebase。我必须编写自己的算法来决定何时与firebase同步数据

    测试由两个脚本组成——一个是多次将数据写入同一firebase位置,另一个是从该位置读取数据

    set_data.coffee

    Firebase = require 'firebase'
    firebaseUrl = 'https://my_firebase.firebaseio.com/same_location'
    
    ref1 = new Firebase firebaseUrl
    ref2 = new Firebase firebaseUrl
    ref3 = new Firebase firebaseUrl
    
    ref1.on 'value', (snapshot) -> console.log 'local same_location changed to ' + Buffer.byteLength((snapshot.val() or ''), 'utf8') + ' bytes'
    
    data1 = ''
    data2 = ''
    data3 = ''
    data1 += '1' for i in [1..1000*1000*2]
    data2 += '2' for i in [1..1000*1000*3]
    data3 += '3' for i in [1..100]
    
    console.log 'data1 ' + Buffer.byteLength(data1, 'utf8') + ' bytes'
    console.log 'data2 ' + Buffer.byteLength(data2, 'utf8') + ' bytes'
    console.log 'data3 ' + Buffer.byteLength(data3, 'utf8') + ' bytes'
    
    t1 = new Date()
    ref1.set data1, (err) ->
      elapsed = new Date().getTime() - t1.getTime()
      console.log 'set1 finished ('+elapsed+'ms) - err is '+err
    t2 = new Date()
    ref2.set data2, (err) ->
      elapsed = new Date().getTime() - t2.getTime()
      console.log 'set2 finished ('+elapsed+'ms) - err is '+err
    t3 = new Date()
    ref3.set data3, (err) ->
      elapsed = new Date().getTime() - t3.getTime()
      console.log 'set3 finished ('+elapsed+'ms) - err is '+err
    
    Firebase = require 'firebase'
    
    firebaseUrl = 'https://my_firebase.firebaseio.com/same_location'
    
    ref1 = new Firebase firebaseUrl
    
    ref1.on 'value', (snapshot) -> console.log 'remote same_location changed to ' + Buffer.byteLength((snapshot.val() or ''), 'utf8') + ' bytes'
    
    data1 2000000 bytes
    data2 3000000 bytes
    data3 100 bytes
    local same_location changed to 2000000 bytes
    local same_location changed to 3000000 bytes
    local same_location changed to 100 bytes
    set1 finished (118314ms) - err is null
    set2 finished (149844ms) - err is null
    set3 finished (149845ms) - err is null
    
    remote same_location changed to 0 bytes
    remote same_location changed to 2000000 bytes
    remote same_location changed to 3000000 bytes
    remote same_location changed to 100 bytes
    
    喝咖啡

    Firebase = require 'firebase'
    firebaseUrl = 'https://my_firebase.firebaseio.com/same_location'
    
    ref1 = new Firebase firebaseUrl
    ref2 = new Firebase firebaseUrl
    ref3 = new Firebase firebaseUrl
    
    ref1.on 'value', (snapshot) -> console.log 'local same_location changed to ' + Buffer.byteLength((snapshot.val() or ''), 'utf8') + ' bytes'
    
    data1 = ''
    data2 = ''
    data3 = ''
    data1 += '1' for i in [1..1000*1000*2]
    data2 += '2' for i in [1..1000*1000*3]
    data3 += '3' for i in [1..100]
    
    console.log 'data1 ' + Buffer.byteLength(data1, 'utf8') + ' bytes'
    console.log 'data2 ' + Buffer.byteLength(data2, 'utf8') + ' bytes'
    console.log 'data3 ' + Buffer.byteLength(data3, 'utf8') + ' bytes'
    
    t1 = new Date()
    ref1.set data1, (err) ->
      elapsed = new Date().getTime() - t1.getTime()
      console.log 'set1 finished ('+elapsed+'ms) - err is '+err
    t2 = new Date()
    ref2.set data2, (err) ->
      elapsed = new Date().getTime() - t2.getTime()
      console.log 'set2 finished ('+elapsed+'ms) - err is '+err
    t3 = new Date()
    ref3.set data3, (err) ->
      elapsed = new Date().getTime() - t3.getTime()
      console.log 'set3 finished ('+elapsed+'ms) - err is '+err
    
    Firebase = require 'firebase'
    
    firebaseUrl = 'https://my_firebase.firebaseio.com/same_location'
    
    ref1 = new Firebase firebaseUrl
    
    ref1.on 'value', (snapshot) -> console.log 'remote same_location changed to ' + Buffer.byteLength((snapshot.val() or ''), 'utf8') + ' bytes'
    
    data1 2000000 bytes
    data2 3000000 bytes
    data3 100 bytes
    local same_location changed to 2000000 bytes
    local same_location changed to 3000000 bytes
    local same_location changed to 100 bytes
    set1 finished (118314ms) - err is null
    set2 finished (149844ms) - err is null
    set3 finished (149845ms) - err is null
    
    remote same_location changed to 0 bytes
    remote same_location changed to 2000000 bytes
    remote same_location changed to 3000000 bytes
    remote same_location changed to 100 bytes
    
    set_data.coffee的输出

    Firebase = require 'firebase'
    firebaseUrl = 'https://my_firebase.firebaseio.com/same_location'
    
    ref1 = new Firebase firebaseUrl
    ref2 = new Firebase firebaseUrl
    ref3 = new Firebase firebaseUrl
    
    ref1.on 'value', (snapshot) -> console.log 'local same_location changed to ' + Buffer.byteLength((snapshot.val() or ''), 'utf8') + ' bytes'
    
    data1 = ''
    data2 = ''
    data3 = ''
    data1 += '1' for i in [1..1000*1000*2]
    data2 += '2' for i in [1..1000*1000*3]
    data3 += '3' for i in [1..100]
    
    console.log 'data1 ' + Buffer.byteLength(data1, 'utf8') + ' bytes'
    console.log 'data2 ' + Buffer.byteLength(data2, 'utf8') + ' bytes'
    console.log 'data3 ' + Buffer.byteLength(data3, 'utf8') + ' bytes'
    
    t1 = new Date()
    ref1.set data1, (err) ->
      elapsed = new Date().getTime() - t1.getTime()
      console.log 'set1 finished ('+elapsed+'ms) - err is '+err
    t2 = new Date()
    ref2.set data2, (err) ->
      elapsed = new Date().getTime() - t2.getTime()
      console.log 'set2 finished ('+elapsed+'ms) - err is '+err
    t3 = new Date()
    ref3.set data3, (err) ->
      elapsed = new Date().getTime() - t3.getTime()
      console.log 'set3 finished ('+elapsed+'ms) - err is '+err
    
    Firebase = require 'firebase'
    
    firebaseUrl = 'https://my_firebase.firebaseio.com/same_location'
    
    ref1 = new Firebase firebaseUrl
    
    ref1.on 'value', (snapshot) -> console.log 'remote same_location changed to ' + Buffer.byteLength((snapshot.val() or ''), 'utf8') + ' bytes'
    
    data1 2000000 bytes
    data2 3000000 bytes
    data3 100 bytes
    local same_location changed to 2000000 bytes
    local same_location changed to 3000000 bytes
    local same_location changed to 100 bytes
    set1 finished (118314ms) - err is null
    set2 finished (149844ms) - err is null
    set3 finished (149845ms) - err is null
    
    remote same_location changed to 0 bytes
    remote same_location changed to 2000000 bytes
    remote same_location changed to 3000000 bytes
    remote same_location changed to 100 bytes
    
    get_data.coffee的输出

    Firebase = require 'firebase'
    firebaseUrl = 'https://my_firebase.firebaseio.com/same_location'
    
    ref1 = new Firebase firebaseUrl
    ref2 = new Firebase firebaseUrl
    ref3 = new Firebase firebaseUrl
    
    ref1.on 'value', (snapshot) -> console.log 'local same_location changed to ' + Buffer.byteLength((snapshot.val() or ''), 'utf8') + ' bytes'
    
    data1 = ''
    data2 = ''
    data3 = ''
    data1 += '1' for i in [1..1000*1000*2]
    data2 += '2' for i in [1..1000*1000*3]
    data3 += '3' for i in [1..100]
    
    console.log 'data1 ' + Buffer.byteLength(data1, 'utf8') + ' bytes'
    console.log 'data2 ' + Buffer.byteLength(data2, 'utf8') + ' bytes'
    console.log 'data3 ' + Buffer.byteLength(data3, 'utf8') + ' bytes'
    
    t1 = new Date()
    ref1.set data1, (err) ->
      elapsed = new Date().getTime() - t1.getTime()
      console.log 'set1 finished ('+elapsed+'ms) - err is '+err
    t2 = new Date()
    ref2.set data2, (err) ->
      elapsed = new Date().getTime() - t2.getTime()
      console.log 'set2 finished ('+elapsed+'ms) - err is '+err
    t3 = new Date()
    ref3.set data3, (err) ->
      elapsed = new Date().getTime() - t3.getTime()
      console.log 'set3 finished ('+elapsed+'ms) - err is '+err
    
    Firebase = require 'firebase'
    
    firebaseUrl = 'https://my_firebase.firebaseio.com/same_location'
    
    ref1 = new Firebase firebaseUrl
    
    ref1.on 'value', (snapshot) -> console.log 'remote same_location changed to ' + Buffer.byteLength((snapshot.val() or ''), 'utf8') + ' bytes'
    
    data1 2000000 bytes
    data2 3000000 bytes
    data3 100 bytes
    local same_location changed to 2000000 bytes
    local same_location changed to 3000000 bytes
    local same_location changed to 100 bytes
    set1 finished (118314ms) - err is null
    set2 finished (149844ms) - err is null
    set3 finished (149845ms) - err is null
    
    remote same_location changed to 0 bytes
    remote same_location changed to 2000000 bytes
    remote same_location changed to 3000000 bytes
    remote same_location changed to 100 bytes
    

    谢谢你的解释,但这并不完全是我想知道的。在我的场景中,同一个客户端开始将文件上载到位置A,在完成之前,他再次将数据上载到同一位置。Firebase将如何处理这种情况?我猜它首先在本地上传,然后再在本地上传。但是两次还没有完成的上传呢?第二个结束的是真实的吗?或者Firebase神奇地知道,在同一个客户端上,总是第二次设置到同一个位置,应该更新数据库我用示例代码OK更新了问题,这确实不同。虽然在服务器上它将是完全相同的,所以仍然没有数据损坏的变化。在客户机上,第二个
    集是否会取消第一个集(我认为它不会)。如果在客户机中启用调试日志记录,则可以轻松测试此功能:
    Firebase.enableLogging(true,true)请参阅:请记住,Firebase客户端到服务器的通信是连续的(至少在我所知道的任何协议上)。所以它很可能作为选项#3起作用,即使它没有明确定义为那样。但您是否认为,当我在for循环中调用
    set
    (对于同一个LCO操作)100次时,每一次都会设置大量数据,那么Firebase将依次执行这100次“上载”中的每一次?用例是将文件从目录同步到Firebase-当文件更改时,我调用set()。在第一次上传完成之前再次提交我的更改。可以只存储关于当前正在与fb同步的文件的信息,并等待它完成—但Firebase可能会开箱即用:)?今天我将测试它并发布我的结果如果100次操作由同一个客户机同步执行,这很可能是真的。但不能保证通过web发送的两个异步事件将以它们启动的相同顺序到达服务器。多个客户端尤其如此,它们不共享套接字连接,Firebase无法优化操作或按特定顺序对其进行排队。是的,但单个fb客户端只是将每个
    以类似FIFO的队列进行排队,并且每个集在前一个完成后执行。