大咖直播-鸿蒙原生开发与智能提效实战!>>> 了解详情
写点什么

比特币丢失、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:187541
用户头像

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

关注

评论

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

开源一夏 | 基于 Serverless一键体验FastAPI

六月的雨在InfoQ

阿里云 开源 Serverless FC 8月月更

Spring Cloud Stream 消息发送

急需上岸的小谢

8月月更

超人飞来!Flutter 实现满屏的力量感动画!

岛上码农

flutter ios 移动端开发 安卓开发 8月月更

头脑风暴:打家劫舍2

HelloWorld杰少

算法 LeetCode 动态规划 8月月更

直播 | 服务餐饮商户年交易额超 7000 亿,哗啦啦如何用 StarRocks 搞定实时报表

StarRocks

数据库

Kubernetes与OpenStack

CTO技术共享

开源 OpenStack 签约计划第三季 8月月更

Netty入门 -- 什么是Netty?

Bug终结者

Netty 8月月更

什么是Shell?从小白到入门你只差一个它

Albert Edison

Linux centos 运维 shell脚本编程 8月月更

兼容并蓄广纳百川,Go lang1.18入门精炼教程,由白丁入鸿儒,go lang复合容器类型的声明和使用EP04

刘悦的技术博客

golang go doc 教程 教程分享 golang 面试

企业进行知识共享的好处有哪些?

Geek_da0866

培训预告 | 企业应用现代化实用教程——DevOps方法论及最佳实践篇 8月11日上线

York

DevOps 云原生 团队建设 降本增效 应用现代化

微服务架构的核心关键点

阿泽🧸

微服务架构 8月月更

【高并发】别闹了,要实现亿级流量下的分布式限流,这些算法你必须掌握!!

冰河

并发编程 多线程 高并发 协程 异步编程

分门别类输入输出,Go lang1.18入门精炼教程,由白丁入鸿儒,go lang基本数据类型和输入输出EP03

刘悦的技术博客

golang 编程 教程 教程分享 golang 面试

舔狗至高境界,学会这个技巧让你从舔狗升华到海王【Python趣味爬虫】

Geek_ac6fb9

后端

开源一夏 | jQuery对于链和捕获的实战研究

恒山其若陋兮

开源 8月月更

Go-Excelize API源码阅读(四)——Save()

Regan Yue

Go 开源 源码刨析 8月日更 8月月更

阿里云数据库PolarDB开源人才培养计划发布!万元好礼等你来拿!

阿里云数据库开源

数据库 阿里云 开源 认证 polarDB

经验分享|低成本快节奏搭建企业知识管理系统的方法

Baklib

中断系统结构及中断控制详解

timerring

8月月更

文档管理系统对于企业来说有哪些作用?

Baklib

Unity Metaverse(四)、接入环信IM SDK 实现用户登录注册

CoderZ

Unity 登录验证 环信im 8月月更

借问变量何处存,牧童笑称用指针,Go lang1.18入门精炼教程,由白丁入鸿儒,go lang类型指针(Pointer)的使用EP05

刘悦的技术博客

入门 教程 Go web 教程分享 入门介绍

SRv6故障管理

穿过生命散发芬芳

8月月更 SRv6

Linux下Docker安装部署以及云原生的理解

Geek_acae888666

云原生 Docker 镜像

openEuler 资源利用率提升之道02:典型应用下的效果

openEuler

开源 数据 cpu 操作系统 openEuler

抖音开启“818发现好物节”:电商平台造节活动何时休

石头IT视角

RocketMQ 详解系列

牧小农

RocketMQ

MySQL权限管理

武师叔

8月月更

低代码实现探索(四十七)低的不止前端,还有后端

零道云-混合式低代码平台

Java 多行字符串

HoneyMoose

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