5

我有一个涉及多台机器、消息队列和事务的问题。因此,例如,用户点击网页,点击会向另一台机器发送一条消息,该机器将付款添加到用户的帐户中。每秒可能有数千次点击。事务的所有方面都应该是容错的。

我以前从来没有处理过这样的事情,但是一点阅读表明这是一个众所周知的问题。

所以我的问题。我是否正确假设这样做的安全方法是使用两阶段提交,但协议是阻塞的,所以我不会获得所需的性能?我通常编写 Ruby,但似乎像 Redis 这样的 DB 和像 Rescue、RabbitMQ 等这样的消息队列系统并没有真正帮助我 - 即使我实现了某种两阶段提交,如果 redis 崩溃,数据也会丢失,因为它本质上只是内存。

所有这一切都让我看到了 erlang 和 scala——但在我涉足并开始学习一门新语言之前,我真的很想更好地理解这是否值得付出努力。具体来说,我是否正确地认为,由于它们的并行处理能力,这些语言是实现像两阶段提交这样的阻塞协议的更好选择,还是我感到困惑?如果是的话,是否有任何理由选择一个而不是另一个(特别是在这种情况下 - 我知道有很多线程和博客更普遍地比较了两者)

为交叉发布道歉 - 这是第一次发布到堆栈交换,但我已经添加到问题中,这个版本可能更适合这里

4

1 回答 1

9

1) 2 阶段提交不是容错的 - 请参阅链接。您要么需要一个全序广播,要么需要一个非阻塞原子提交,这取决于您要解决的问题的确切表述。

2) 我不会说 Scala 比大多数其他通用语言更适合实现两阶段提交。具体来说,STM并行分布式集合在这里对您没有帮助。Scala Actor 和远程 Actor可能会为您提供一个很好的 API 来异步发送消息(在同一台机器上或远程),但默认情况下它们不会为您提供抽象,例如不同的故障检测器,这对于实现全序广播很有用,例如 - 你仍然必须自己实现这些(另一方面,我相信Akka有这些抽象)。

3) 我不能代表 Erlang 和 Ruby,但就 Scala 和 Java 而言,您可能需要考虑看看Akka。它基于分布式参与者模型,还支持事务和不同级别的容错。重用他们的基础设施可能比从头开始编写自己的分布式容错运行时更好。

于 2011-10-13T18:32:50.043 回答