分布式事务和队列,ruby,erlang,scala

时间:2011-10-13 18:08:32

标签: ruby scala erlang parallel-processing distributed-transactions

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

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

所以我的问题。我是否正确地假设这样做的安全方式是两阶段提交,但协议是阻塞的,所以我不会得到所需的性能?我经常编写Ruby,但看起来像redis和消息排队系统这样的数据库如Rescue,RabbitMQ等并没有真正帮助我 - 即使我实现某种两阶段提交,如果redis崩溃,数据将会丢失,因为它本质上只是记忆。

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

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

1 个答案:

答案 0 :(得分:9)

1)2 phase commit不容错 - 请参阅链接。您需要total order broadcast或非阻塞原子提交,具体取决于您正在解决的问题的确切表述。

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

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