NoSQL数据库用于在线货币交易管理?

14
我计划在我的网络产品中使用像MongoDB这样的NoSQL数据库作为后端。根据设计概念,每天最少会有1,000个用户。我有一些疑问:
  1. 我在一篇博客中读到,NoSQL数据库在在线货币交易方面并不是很好,即数据完整性最重要:原子性、一致性、隔离性和持久性。

  2. 可用性是否也会成为一个问题?

与NoSQL数据库相关的优缺点还有其他吗?MongoDB能满足数据完整性和可用性吗?


2
强烈建议在这样的系统中使用事务。您可以使用nosql模拟事务,但这将是重复造轮子。 - varela
@varela: 你能否详细解释一下你的观点,我无法理解你具体想要表达什么。 - Akamad007
1
最大的问题是并发性。如果您想要例如扣除资金,那么您不能仅仅1)检查可用金额2)如果用户有资金则进行扣除。您需要首先使用特殊标志锁定用户帐户以防止更改,然后再执行操作。对于SQL数据库,您有标准的方法来实现这一点。 - varela
这取决于你想做什么。MongoDB支持原子操作,但如果你的更新不能在一个操作中完成,那可能会有问题。这与货币操作无关,而是与mongoDB的概念相关。http://www.mongodb.org/display/DOCS/Developer+FAQ#DeveloperFAQ-HowdoIdotransactions%2Flocking%3F - varela
3
@Akash,你想在后端使用NoSQL数据库的原因是什么?仅仅为了学习它吗?还是因为它很酷?或者确实有实际好处?但即使你选择这样做,请再看看比MongoDB更可靠的东西(例如Riak)。 /litius - tolitius
@litius,原因如下: 1)我们计划扩大规模,不想让数据库成为限制。 2)根据我所了解的,在NoSQL数据库中,我们不必过多考虑架构。 3)NoSQL数据库所需的维护工作非常少。 4)我们咨询了一些已经在使用它的初创企业,他们最近没有遇到任何重大问题。(我想在这个问题上获得更广泛的意见) 5)而且它非常酷:D... 感谢您的建议,我一定会看看Riak :) - Akamad007
2个回答

34

NoSQL数据库主要用于解决以下几个问题:

  • (buzz) 大数据 => 想想TB,PB等等。

  • 处理分布式系统 / 数据集 => 假设你有42个产品,其中13个位于芝加哥数据中心,21个位于纽约,另外8个则在日本其他地方。但是当你查询所有42个产品时,你不需要知道它们位于何处:NoSQL数据库会知道。这也允许使用更多的计算资源(服务器)来解决复杂的计算问题[似乎不适合您的用例,但这是一个有趣的事情要注意]

  • 分区技术 => 使你的数据库易于分布,除了那些很酷的8个产品在日本之外,还可以进行轻松的数据复制,因此这些42个产品将被复制3倍,例如,这意味着每个产品都有3份副本。因此,如果出现问题,没有问题=>这里有一个可用的副本。这就是NoSQL数据库与RDBMS相比实际上表现出色的地方。当然,你可以分片、分区和集群Oracle/MySQL/PostgreSQL等等,但是这是一个几个数量级更复杂的过程,通常对于大多数人来说都是一个维护上的头疼。

(对于你的问题)

  • 每天最少会有1000个用户

    每天1000个用户是非常低的流量,除非你选择昨天凌晨3点编写的NoSQL解决方案作为概念证明,否则在这里不应该有任何问题。但如果你成功了,并且在几个月内拥有1亿用户,NoSQL将更简单地进行扩展。

  • 可用性会成为问题吗?

    坚实的NoSQL解决方案允许您指定所谓的quorum:“在被视为成功之前,必须响应读取或写入请求的副本数量”。一些解决方案还执行所谓的hinted handoff:“相邻节点暂时接管失败节点的存储操作”。通常,您应该能够根据您的需求控制可用性。

(来自您的评论)

  • 我们计划扩张,并不希望数据库成为限制因素

扩张是一个非常相对的概念。 “金融行业已经相当扩张”,他们仍然主要使用关系型数据库进行日常操作。 Facebook使用MySQL。我曾为主要银行工作,他们使用Oracle/MySQL/PostgreSQL/DB2等,只有其中一些使用NoSQL,但不是针对需要始终保持100%一致性的数据。即使Facebook也仅将Cassandra用于“收件箱搜索”之类的东西。但如果扩展意味着更多的数据和用户(请求、连接等),则NoSQL将更容易扩展。再次强调,这并不意味着您无法扩展关系型数据库,只是更为繁琐/复杂。

  • 据我所知,在NoSQL数据库中,我们不必考虑架构

根据我的经验,如果我构建的系统是优秀的,我总是需要考虑架构。 NoSQL数据库允许您对持久化的数据更加灵活,但这并不意味着您应该减少对架构的考虑。例如,请考虑对数据进行索引或将其分片到多个集群上,甚至可能向客户端公开的合同/接口等。

  • NoSQL数据库需要的维护非常少

我并不认为这一般而言是正确的,除非我们在谈论大数据。以PostgreSQL为例,它是一款极其棒的软件,非常容易操作和维护。关系型数据库的另一个优点是,人们对SQL更加熟悉和舒适。比如,Cassandra发布了0.8版本的CQL,这是SQL的一个非常有限的子集。类似于maintenance这样的术语也应该与TalentKnowledgeExpertise等术语并驾齐驱。因为如果你使用Cassandra,那么她是一个非常需要"高维护"的女孩,但对于DataStax公司的男孩来说却不算什么,因为他们拥有专业知识,但你需要为此付出代价。

您的主要问题

  • 我在一篇博客中读到,NoSQL数据库不太适合在线交易,即数据完整性最为重要的情况。(我的产品涉及在线交易)

如果不真正了解您的产品,很难判断NoSQL数据库是否适合。如果产品的主要目标是"在线交易",那么我建议不要使用NoSQL数据库(至少在2011年的今天是这样)。如果"在线交易"只是要求之一,而不是您产品的核心要素,那么根据"核心"是什么,您可以尝试使用NoSQL数据库,并使用外部服务(如Google Checkout等)来保证事务的一致性。

作为技术注释,如果您要解决的问题受益于分布式解决,我建议使用Erlang编写的数据库(如Riak、CouchDB等),因为作为一种语言,Erlang已经成功地解决了大多数分布式问题几十年。


非常感谢...这是惊人的东西。太好了。如果我能给它100个升级,我会的... - Akamad007
@Akash,当然,非常欢迎。希望你能用SQL或不用SQL构建一个伟大、稳定的系统 :) /Anatoly - tolitius
Facebook不使用MySQL,而是使用NoSQL解决方案。 - Marc-François
当然,Facebook使用MySQL。MySQL也认为如此。它曾经在Inbox Search中使用Cassandra,现在已经被HBase取代。 - tolitius
关于“始终需要100%的一致性”,您能否分享一下在像MySQL这样的SQL数据库中,位于不同服务器上的多个表/数据库如何实现这一点?是每秒钟都进行JOIN操作吗? - Cloud Cho

1

MarkLogic是一种具有ACID事务的NoSQL数据库,用于管理游戏中的虚拟货币以及现实生活中的银行交易。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接