【问题标题】:Firebase is giving "maxretry" errorFirebase 给出“maxretry”错误
【发布时间】:2016-05-29 00:04:11
【问题描述】:

我们使用 Firebase 作为我们移动应用的后端。我们的一些用户偶尔会收到错误“maxretry”,其中事务写入具有单个数值的路径。据我所知,我们没有多个用户或连接,也没有多次写入同一路径。这可能是什么原因造成的?

我怀疑这是由于使用了许多小数位的浮点值造成的。这个错误在我本地发生过一次,我能够通过将精度限制为小数点后两位来解决它。可以这样吗?

-阿尔伯特

编辑:

这是导致此问题的代码:

return fireRef.child(fbPath).transaction(function(originalVal) {
  return func(originalVal, by_value);
}, _.noop, false)

在这种情况下,func 看起来像这样:

function(originalVal, val) {
  return val + (originalVal || 0);
}

【问题讨论】:

  • 没有看到重现此问题的代码,很难说比错误消息已经说的更多:事务重试次数过多。
  • 函数运行了一百次,直到出现错误。没有对同一函数/同一路径进行其他调用(至少据我所知)。 originalVal 类似于 57.39999999999998 和 val 类似于 1.01
  • 鉴于 Firebase 事务是使用比较和交换运行的,浮点操作数可能是导致此问题的原因。如果是这种情况,解决方案是不使用浮点数,而是使用离散值和乘数,即5740 for 57.40
  • 拥有一个乘数并执行每个价值交易的价值本身听起来有点矫枉过正。您不认为仅以两位小数的精度存储就足够了吗?
  • 我建议在这种情况下使用固定乘数。在处理金钱时,以“美分”存储所有东西是很常见的。我并不是说这是最好的方法(因为其他人可能不同意),但我向你保证这很常见。 :-)

标签: firebase firebase-realtime-database


【解决方案1】:

即使将精度限制为小数点后 2 位,问题仍然存在(每隔一段时间就会出现 maxretry 错误)。

使用 Firebase 事务更新值时似乎根本不应该使用浮点类型。

我开始使用整数,现在没有问题了。

【讨论】:

  • 虽然这可行,但没有 Firebase 文档显示不应使用小数点进行交易。但是我在使用带小数点的交易时也看到了这个错误。这是随机发生的。但在这一点上,我有一个号码63.99999999999999,它不再工作了。我已将号码更改为64,并且已重新开始工作。 @Firebase 团队应该澄清这一点。
猜你喜欢
  • 2018-10-12
  • 1970-01-01
  • 2017-09-17
  • 2023-03-23
  • 2016-02-14
  • 2018-06-09
  • 1970-01-01
  • 2019-03-30
相关资源
最近更新 更多