私はソーシャルネットワーク風のフィードの作成に取り組んでおり、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で動作するので、複数の場所の投稿をアトミックに「好き」にするにはどうすればよいですか?
firebaseキュー(admin)は、一度に1つのタスクだけを処理し、そのようなフィールドの編集を禁止します。 これは、1つだけがデータを更新していることを意味します。したがって、トランザクションのnedはありません。 もちろん、スケーラビリティはあまり高くありませんが、機能します。 @Leblanc Meneses –
@ MuhammadHassan firebase-queueは、キューに入れられた各アイテムが1人の作業者によって1回だけ処理されることを保証します。このアプローチは、生産者 - 消費者モデルの仕組みのために容易に拡張されます。より多くのワーカーを追加すると、水平方向に拡大されます。 –
私は理解していますが、別の作業をしている別の作業者が、同じノードを編集して問題を引き起こす可能性があります。 ファイヤーベースの複数のパスでトランザクションを実行できるので、唯一の選択肢は、ワーカーの数を1に制限し、トランザクションを回避できることです。 あなたはどう思いますか? –