2017-01-03 1 views
0

2つのリストから項目を照合しています。たとえば、Aの要素cとBのcが一致します。私はいくつかの処理を行い、一致したペアを別のリストに追加します。Firebase:複数の作業者を使用して1回だけアクションが実行されることを確認する

- List A 
    - a 
    - b 
    - c 

- List B 
    - c 
    - d 

これを行うには、リストAとBの両方で追加を監視し、何かが追加されたときに一致するかどうかを確認します。

これはうまくいきますが、1つのクライアントに対して挿入が多すぎます。

だから、スピードアップのために複数のマシンでマッチャーを実行する必要があります。

しかし、私はそれぞれのマッチが1台のマシンでのみ起こるようにしたい、つまりマシン1がマッチするとマシン2がそれを処理する必要はありません。

私はatomic commitsを使用しようとしましたが、これは複数のマッチがお互いに混乱するのを防ぎますが、マッチングはまだ2回続けられます。

要素を「ロック」して、マッチング処理が開始されたら他のマシンがそれらを考慮しないようにするにはどうすればよいですか?

答えて

0

Firebaseはこのようなことをネイティブでサポートしておらず、さらにストリーミングプロトコル自体に冪等がないことに懸念があります。トピックの更新を購読してもノード自体が消滅した場合は、次回のサーバーの起動時に、ノードの停止中に発生したすべての増分更新のコレクションではなく、VALUE更新が取得されます。

良いデータ構造では、このような "独自の"機能をロールアップすることができます。結局のところ、タスクの冪等性とResqueとCeleryのようなワーカーロックを持つクラスタ対応のタスクプロセッサは、基本リソース(Redis、DBなど)のやり方ではそれほど多くはありません。データセットを追加して作業者を管理する必要がありますワーカーによるジョブIDロック、復旧/エラー処理機能など​​があります。しかし、これを行うために使用するコードを見直すと、単純なStackOverflow投稿がこれを達成するために管理するよりも多くの作業が必要になることがすぐにわかります。

代わりに、ActionHeroJSなどのスタックをクラスター対応のAPIレイヤーとして使用することを検討してみませんか?それはあなたのすべての要件をカバーし、Firebaseと本当にうまく対になってレディスがサポートするクラスタメカニックとResqueベースのタスク管理を持っています...

0

私はこれを撮影します。

我々のアプリにはユーザーが含まれており、一部のユーザーデータを編集することもできますが、ユーザーデータを複数のクライアントで同時に編集しないようにします。そこで、ユーザーが編集中にロックされていることをクライアントに通知する単純なロック機構を実装しました。だからあなたのクライアントはすべてのリストAとリストBを観察するユースケース

- List A 
    -Yiuiaisida9 //node names created with childByAutoId 
    letter: "a" 
    isLocked: false 
    -YJI99s9ajsl 
    letter: "b" 
    isLocked: false 
    -YE9jsiakskk 
    letter: "c" 
    isLocked: true 

- List B 
    -YJ0a0s0kdka 
    letter: "c" 
    isLocked: true 
    -YM0s09s0ksk 
    letter: "d" 
    isLocked: false 

にこれを適用する

子ノードがAをリストに追加されたときに、そのノードが最初にロックされて設定されている:真。リストBを検索し、一致するものがあればそれもロックして処理を開始します。

他のクライアントには 'c'がロックされたことが通知され、コードがロックされたノードを処理しないため、単に無視されます。

ちょっと考えて...

関連する問題