写点什么

比特币丢失、MongoDB 和最终一致性

  • 2014-04-28
  • 本文字数:1466 字

    阅读完需:约 5 分钟

近日,多家比特币运营商失窃,这引发了一场争论,最终一致性数据库对银行业务是否有用。

2014 年 3 月 2 日,由于代码缺陷, Flexcoin 丢失了它所有的比特币。攻击者发出了成千上万的并发请求,定序将比特币从他其中一个账户转移到另一个账户。之后,他用其它账户重复同样的操作,直到取走了所有比特币。之所以能够这样做,是因为编写的代码没有处理多并发请求,而且所有转移都是发生在余额更新之前。如果余额没有及时更新,即使账户是空的,请求也可能被批准。因此,在丢失了 896 个比特币(价值约 50 万美元)之后,Flexcoin 关停了他们的业务。

两天之后,Poloniex 发生了同样的事,但他们只丢失了12.3% 的比特币,而且该公司弥补了损失,并设法维持了下去。

康奈尔大学副教授 Emin Gün Sirer 写了一篇博文,将比特币丢失归因于最终一致性数据存储。在容易产生银行盗窃的 NoSQL 解决方案中,他提到 MongoDB、Cassandra 和 Riak,因为:

这里的问题,其根源在于 MongoDB 提供的接口和语义设计有问题。如果我们用的是 Cassandra 或者 Riak,那么情况不会有任何不同……

比特币恰逢分布式系统的一个尤其黑暗的时期,人们秉持对 CAP 理论的错误理解,认为他们只不过是不得不放弃数据库的一致性……

目前尚不清楚 Flexcoin 或者 Poloniex 那时是否正在使用 MongoDB,而值得一提的是,Sirer 正参与开发 HyperDex ,它支持 ACID 事务,是一个有竞争性的键 - 值数据存储。另外,这不是 Sirer 第一次诟病 MongoDB 的设计了。一年前,他就声称 MongoDB 的容错性有问题

抛开争论不谈,最终一致性数据存储是否适合银行业务是个值得深思的问题。不出所料,Sirer 的博文引发了大量的评论,本文节选了部分最值得注意的。

jrp 指出,更新操作可以使用 MongoDB 在数据库级以原子方式实现,但他也认为“这将照顾不到其它 ACID 属性。”

jakcharlton 认为,鉴于最终一致性在这种情况下有问题,一个“ACID 系统并不能解决该问题,它只是将问题推到应用程序的边界,问题在那里再次发生。银行业务使用最终一致性数据存储是个坏例子,也显示出开发人员思维方面的问题,他们认为由于他们的数据库满足 ACID,所以他们能够免于并发问题。”

Alex “做任何事都使用 MongoDB,除了需要事务的时候,那时我会用合适的工具(不是 MongoDB)完成工作。”他认为,将 MongoDB 用于不该使用它的工作是开发人员犯的一项错误。

Robert Escriva 是一名 HyperDex 开发人员,他认为罪魁祸首不是程序员,而是最终一致性系统可以用于银行业务这样一种普遍存在的观念:

问题不在程序员的理解。有一种普遍存在的错误观念鼓励人们使用最终一致性系统。“如果它好到足以用于银行,那么它也能满足你”,他们会用这样的话来证明它的合理性。这种想法是危险的。

最终,应用程序应该是其不变量的总和。如果系统底层的数据存储不能提供保证——或者更糟糕,需要大量的维护以及 10 万美元的支持合同来提供保证——应用程序有了问题,却归咎于开发人员,这是一种托词。我们应该以更高的标准要求数据库供应商(尤其是那些动辄就获得数亿 VC 现金的供应商)。

Eric Brewer 是 CAP 理论的创建者,他先前在一篇文章中写道,为了在分区期间提供可用性,银行在他们的ATM 业务中放弃了一致性。但他们这样做的时候采取了一定的防范措施,其中包括将取款数额限制在某个较小的阀值内。这里还要提一下 Stripe ,根据他们的一篇博文,这是一款使用了MongoDB 的Web& 移动支付系统。

最终一致性数据存储适合一般银行业务吗?或者开发人员应该知道它们的局限性而另寻方案呢?

查看英文原文:**** BitCoins Lost, MongoDB and Eventual Consistency

2014-04-28 10:187104
用户头像

发布了 256 篇内容, 共 88.0 次阅读, 收获喜欢 12 次。

关注

评论

发布
暂无评论
发现更多内容

android适配方案,Kafka是如何实现高性能的?全套教学资料

欢喜学安卓

android 程序员 面试 移动开发

NA公链NAC公链真正的100%史诗级匿名去中心化应用

区块链第一资讯

测评:国内到底有没有能媲美Jira的测试管理工具?

爱吃小舅的鱼

敏捷 研发管理 测试 研发管理工具 测试管理

SparkStreaming流计算实战

小舰

4月日更

mPaaS 月度小报 | CodeHub#4 在线教育应用的开发实践;香港站正式开服上线

蚂蚁集团移动开发平台 mPaaS

移动开发 mPaaS

信息爆炸时代,如何更好地处理工作信息

LigaAI

程序员 产品经理 研发管理 信息处理

读《小岛经济学》

箭上有毒

4月日更

ARMv9刷屏——号称十年最大变革,Realm机密计算技术有什么亮点?

阿里云基础软件团队

NoSQL数据库兄弟会

大数据技术指南

sql 4月日更

c 语言思维地基搭建(总概论)

-jf.

4月日更

inotifywait+rsync实现目录监听及同步

慢慢de

Docker rsync inotify 目录监听同步

火爆全网!万字精华总结“银四Java复习笔记”(共计22个技术专题)

比伯

Java 架构 面试 程序人生 计算机

腾讯专家连夜肛出来17大专题30W字的Java面试手册!

码农之家

Java 编程 程序员 互联网 面试

英特尔陈葆立:至强傲腾强强联手,实现1+1>2

E科讯

阿里P9这几个提高代码运行效率的小技巧我一直在用

Java架构师迁哥

【LeetCode】寻找旋转排序数组中的最小值 IIJava题解

Albert

算法 LeetCode 4月日更

源中瑞区块链BaaS平台--一键部署区块链应用

13530558032

大厂Offer收割机:Netty处理写事件之连环四问,你能抗住吗?

Java架构师迁哥

知乎转载超30W次!金三Java面经汇总:拼多多(三面)/蚂蚁金服(四面)/字节跳动(二面)

Java架构追梦

Java 面试 拼多多面经 蚂蚁金服面经 字节跳动面经

谁说没学历就进不了大厂?(双非渣硕四年crud经验已拿下阿里P6)面经分享

Java 编程 程序员 架构 面试

梦里花落知多少,网络抖动逃不了

阿里云基础软件团队

Spark中的累加器和广播变量

五分钟学大数据

spark 4月日更

通俗讲解分布式锁,这次你一定能懂!

Java架构师迁哥

Javascript执行机制-事件循环

Sakura

4月日更

智汇华云 | 看“新基建”如何将机房里的“老家伙”物尽其用

华云数据

hashmap遍历,关于网络优化你必须要知道的重点,Android岗

欢喜学安卓

android 程序员 面试 移动开发

用泡妞的逻辑理解23种常用设计模式?渣男直呼内行

北游学Java

Java 设计模式

新思科技成为CVE编号授权机构 向公众发布更准确、实时的漏洞信息

InfoQ_434670063458

新思科技 CVE 软件质量与安全

Notion免费搭建个人网站,使用Notion又多了一个理由

彭宏豪95

GitHub Notion 写作 博客 4月日更

类加载器和双亲委派模型

hepingfly

Java ClassLoader 类加载器 双亲委派模型

19张图带你梳理SpringCloud体系中的重要技术点!

Java架构师迁哥

比特币丢失、MongoDB和最终一致性_语言 & 开发_Abel Avram_InfoQ精选文章