2016-10-05 7 views
2

私はソーシャルネットワーク風のフィードの作成に取り組んでおり、Firebaseのブログのguideに続いてデータベース全体にブログ記事を展開しています。Firebaseでファンアウトされたデータのトランザクションを実行する

これは意味があり、update()メソッドを使用してこれらの投稿とやりとりするのに適しています。しかし、複数の場所でトランザクションを原子的に実行する方法については、私には不明です。

たとえば、投稿を「好き」する機能を追加したいとします。私は1つの場所にそのポストを持っているとしたら、私のコードはそうのようになります。明白な理由のために

var postRef = firebaseDB.ref("posts/" + postID + "/likes"); 
postRef.transaction(function(likes) { 
    return (likes || 0) + 1; 
}); 

を、以下のソリューションは、アトミックではありません。

var postRef1 = firebaseDB.ref("posts/" + postID + "/likes"); 
postRef1.transaction(function(likes) { 
    return (likes || 0) + 1; 
}); 

var postRef2 = firebaseDB.ref("user/" + userID + "/posts/" + postID + "/likes"); 
postRef2.transaction(function(likes) { 
    return (likes || 0) + 1; 
}); 

トランザクションはrefで動作するので、複数の場所の投稿をアトミックに「好き」にするにはどうすればよいですか?

答えて

6

キュータスクのノードに書き込むときは、firebase-queueがthrottle on the clientである必要があります。

ファンアウトは、約束の成否に基づいて補償モデルを構築できるワーカーノードで発生します。

キューは、作業が完了し、クライアントコードが簡素化されることを保証する唯一の方法です。

参考:ways to live without transactions

=========

編集:Firebaseのための2017年3月クラウド機能が導入され、現在ファンアウトを実装するための推奨される方法ですました。

+0

firebaseキュー(admin)は、一度に1つのタスクだけを処理し、そのようなフィールドの編集を禁止します。 これは、1つだけがデータを更新していることを意味します。したがって、トランザクションのnedはありません。 もちろん、スケーラビリティはあまり高くありませんが、機能します。 @Leblanc Meneses –

+0

@ MuhammadHassan firebase-queueは、キューに入れられた各アイテムが1人の作業者によって1回だけ処理されることを保証します。このアプローチは、生産者 - 消費者モデルの仕組みのために容易に拡張されます。より多くのワーカーを追加すると、水平方向に拡大されます。 –

+0

私は理解していますが、別の作業をしている別の作業者が、同じノードを編集して問題を引き起こす可能性があります。 ファイヤーベースの複数のパスでトランザクションを実行できるので、唯一の選択肢は、ワーカーの数を1に制限し、トランザクションを回避できることです。 あなたはどう思いますか? –

関連する問題