5

我有一個涉及多臺機器,消息隊列和事務的問題。因此,例如,用戶點擊網頁,點擊發送消息到另一臺機器,該機器向用戶的賬戶添加支付。每秒可能會有數千次點擊。交易的所有方面應該是容錯的。分佈式事務和隊列,ruby,erlang,scala

我以前從來沒有處理過這樣的事情,但有些閱讀表明這是一個衆所周知的問題。

所以對我的問題。我是否正確地認爲這樣做的一種安全方式是使用兩階段提交,但協議被阻止,所以我不會獲得所需的性能?我通常會編寫Ruby,但看起來類似redis和消息隊列系統(如Rescue,RabbitMQ等)的DB並不能真正幫助我 - 即使我實現某種兩階段提交,如果redis崩潰,數據也會丟失,因爲它本質上只是記憶。

所有這些讓我看到了erlang和scala--但在我開始學習一門新語言之前,我真的很想更好地理解,如果這是值得的。具體來說,我認爲由於它們的並行處理能力,這些語言是實現像兩階段提交這樣的阻塞協議的更好選擇,還是我感到困惑?如果是的話,是否有理由選擇一個而不是另一個(具體而言,在這種情況下 - 我知道有很多線索和博客比較兩者更普遍)

道歉的交叉發佈 - 這是第一次發佈到堆棧交換,但我已經加入到這個問題,這個版本可能更適合這裏

回答

9

1)2 phase commit是不容錯的 - 請參閱鏈接。您需要一個total order broadcast或非阻塞原子提交,具體取決於您正在解決的問題的確切形式。

2)我不會說Scala比大多數其他通用語言更適合實現兩階段提交。具體來說,STMs,paralleldistributed集合不會幫你在這裏。 Scala actors and remote actors可能會爲您提供一個很好的API來異步發送消息(在同一臺機器上或遠程),但它們不會默認爲您提供抽象,如不同的故障檢測器,這對於實現總訂單廣播非常有用,例如 - 你仍然必須自己實現這些(另一方面,我相信Akka有這些抽象)。 3)我不能說Erlang和Ruby,但就Scala和Java而言,你可能需要考慮看一下Akka。它基於分佈式參與者模型,它也支持事務和不同級別的容錯。重新編寫自己的基礎架構可能比從頭開始編寫自己的分佈式容錯運行時更好。

+2

非常有幫助的答案 - 謝謝你和+1。在接受之前,我仍然有興趣瞭解其他觀點 – chrispanda