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

chr*_*nda 5 ruby parallel-processing erlang scala distributed-transactions

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

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

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

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

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

axe*_*l22 9

1)2阶段提交不是容错的 - 请参阅链接.您需要总订单广播或非阻塞原子提交,具体取决于您正在解决的问题的确切表述.

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

3)我不能代表Erlang和Ruby,但就Scala和Java而言,你可能想考虑看看Akka.它基于分布式actor模型,该模型还支持事务和不同级别的容错.从头开始编写自己的分布式容错运行时,重用其基础结构可能更好.

  • 非常有帮助的答案 - 谢谢你和+1.在接受这个之前,我仍然有兴趣看看有什么其他观点 (2认同)