さて、私はNeo4Jとグラフデータベースの仕組みについてもう少し教えてくれるよう、PHPとNeo4Jを使って小さなアフィリエイトシステムを設計しています。オリジナルのアフィリエイトシステムはMySQLに搭載されていたため、Neo4Jにデザインやストレージを移行するだけでパフォーマンスが向上しなかったのは不条理です。パフォーマンス指向のアフィリエイトシステムデザイン
しかし、私はおそらく間違ってやっている可能性があり、経験豊富な開発者の助けを借りて、それがどれほど優れているかを知りたいと思っているいくつかの機能があります。たとえば、毎月、各アフィリエイトに支払う金額を計算する必要があります。これは、ユーザーネットワーク全体を検索するいくつかのルールに従います。
は例えば、ジョーの毎月の給与を計算するために、システムは、にあります。
Find Node Joe
function Calculate:
Calculate amount of people referred (all tiers)
Calculate the number of referral tiers (all tiers)
Calculate points
Store information inside object properties
- 層を:ジョーは、それの順番にボブを指しマリアを指します。 Joeの下でMaryはTier 1、BobはTier 2です。
- すべての層は:だからジョー、メアリーとボブに基づいて
を数を計算し、計算機能は、再帰関数のように見えます。ジョーに言及されたForeachユーザーは、ジョーに戻って自分の番号を取得するまで、彼と彼の子供の計算機能を実行する必要があります。
これは地獄のように遅いです。私はRabbitMQまたはZMQを使用して、Joeの計算の各「子プロセス」のキューを作成することを考えました。私はpcntlのフォークの使用についても考えました。グラフネットワーク内でこの再帰的プロセスをより良くするにはどうすればよいですか?ツリー全体を通過する最良の方法は何ですか?キューイング?プロセスフォーク?
もう一つの例:
今Calculate(Joe)
Joe referred Mary, Bob, Peter
Calculate(Mary)
Mary referred Sara, Megan
Calculate(Sara)
Calculate(Megan)
Calculate(Bob)
Bob referred Billy, Michael
Calculate(Billy)
Calculate(Michael)
Calculate(Peter)
Peter referred Charles, Max
Calculate(Charles)
Calculate(Max)
、500本の紹介を持つ人のためにこれをmultiplicate、そして彼の紹介のそれぞれは、より多くの500人を持つことができます。それは地獄のように遅く、毎月ジョーのダッシュボードにこれを表示しなければなりません。 :(
はい、少しですが、ジョーの下に子ノードがなくなるまで、各子ノードでCalculate関数を実行する必要があります。これはPHPで行われます。この問題は実際には岩であるNeo4Jではなく、プロセッサ上の爆弾である再帰的なツリートラバーサル関数である。 ZeroMQやRabbitMQが役に立つかもしれないと思うのは、さまざまなCalculate関数をキューに入れて、ただ1つのコアを使うのではなく、並行してそれらが終了するのを待つことだけです。 – vinnylinux