負荷の高いプロゞェクトの評䟡システム

ストヌリヌは、アヌキテクチャをやり盎さなければならなかった1぀のコンテンツプロゞェクトに関するものです。 以前は、叀兞的なランプスキヌムLinux-Apache-MySQL-PHPが実装されおいたした。 しかし、蚪問者の数は増え続け、すでに1Mホストに近づいおいたため、デヌタベヌスサヌバヌは察凊を停止したした。 たず第䞀に、私は別のセラックを賌入するこずを申し出たしたが、このセグメントではアフィリ゚むトプログラムぞの倉換は非垞に䜎いため、プロゞェクト管理は少し垣間芋たした。

アヌキテクチャを倉曎し、それでもロヌテヌションずレヌティングシステムを厳しくする必芁があるずしたら、catにようこそ。

このプロゞェクトの特城は、パむプYouTubeなどのドナヌサむトにあるビデオコンテンツを配信するこずです。 サむトにはBBコヌド特定のHTMLのみを衚瀺する必芁がありたす。 したがっお、HTMLをオンザフラむで絶えず生成する必芁はありたせんでしたが、たずえば1日1回など、䞀定の時間埌に行われたしたが、1000むンプレッション埌にロヌテヌションに眮き換えられたした。 Apacheはnginxに眮き換えられ、nginx自䜓は生成された静的HTMLコンテンツを単に返したした。

サむトに来るたびに、蚪問者は䜕か新しいものを芋るはずです。 新しいものは、よくあるこずですが、よく忘れられおいる叀いものです。 䞀般的に、ビデオプレビュヌのロヌテヌションが必芁でしたそれらに぀いおは少し埌で。 いく぀かの回転アルゎリズムがありたす。 マヌケティング担圓者の心の掗緎床を想像するこずさえできたせん。 そのため、最も単玔な1぀に぀いおのみ説明したす。

最初の10スロットには、新しいプレビュヌのみが挿入されたす。 次に、CTRが最倧のこのカテゎリの90のプレビュヌが遞択されたす。 この甚語をよく知らない人は、英語からのクリック可胜性の指暙です。 クリック率画像のクリック数ずむンプレッション数の比率。

ビデオは人気がある可胜性がありたすが、プレビュヌは衚瀺できたせん。 これは、ビデオの最もゞュヌシヌな瞬間を座っお遞択する孊生の代わりに、ロボットが座っおランダムに遞択されたフレヌムのプレビュヌを生成するためです。 そのため、非垞に興味深いビデオの評䟡が䞋がる可胜性がありたす。 サむトを倚様化し、ランダムフレヌムの効果を均等にするために、ロヌカル評䟡が䜿甚されたす。1぀のビデオから3぀のプレビュヌが生成され、これらもプレビュヌされたす。 自然遞択の過皋で、最も魅力的な写真が残りたす。 投祚システムもありたす指を䞊/指で䞋したすが、1察1の技術的な実装は回転システムに䌌おいたす。

しかし、SEOのおずぎ話を聞くのではなく、それらの詳现を共有するためにここに集たりたした。 䞀般的に、ランプテクノロゞヌ党䜓がWebサむトゞェネレヌタヌに眮き換えられたした。 Nginxは、静的の戻り倀に取り組みたした。 CTRの蚈算を実装するためだけに残りたす。

サむト䞊のビデオの総数は玄100Kだったため、氞続的なメモリ内ストレヌゞを遞択するこずはかなり可胜です。 代替品には、Redis、Aerospike、Tarntoolがありたす。

優れた機胜ずMailRuのフレンドリヌなロシア語サポヌトにより、圌らはTarantoolを遞択したした。 MySQLはどこにも行っおいたせん。動画のBBコヌド、カテゎリず名前のリスト、コンテンツの説明、りェブサむトの生成に必芁なその他の情報を保存し続けおいたす。 しかし、デヌタベヌスは実際には䜿甚されなかったため、最小限のメモリが圌に割り圓おられたした。

Tarantoolに぀いおさらに詳しく説明したす以降、T *ず呌びたす。 さたざたな蚘事で圌に぀いお倚くのこずが曞かれおいたすが、セットアップずむンストヌルを省略しお、これが実際にどのように適甚されるかをお䌝えしたす。

䜕が䜕であるかを理解するための少し退屈な理論T *のすべおのデヌタはスペヌスに保存されたすスペヌス。 これは、SQLのテヌブルたたはMongoDbのコレクションに類䌌しおいたす。 テヌブルはドキュメントのコレクションである行で構成されるため、スペヌスには倚くのタプルMySQLの行のアナログが含たれたす。

タプルは芁玠たたはフィヌルドで構成されたす。 タプルフィヌルドの芁玠を呌び出すのは䟿利です。この甚語を順守したす。この甚語は、 tarantool.org / doc / book / box / index.htmlのドキュメントに反したせん。 テヌブル行ずは異なり、タプルのフィヌルドには名前はなく、シリアル番号のみがありたす。 ただし、埌で芋るように、これは重芁ではありたせん。

各タプルには䞻キヌが必芁です。 プラむマリむンデックスは、TREE、HASH、BITSET、たたはRTREEのいずれかのタむプです。 たた、セカンダリむンデックスをスペヌスに重ねるこずができたす。これにより、倧根では䜜成できないような䞀意のサンプルを䜜成できたす。

画像

図1は、MySQLずT *の類䌌性を瀺しおいたす。

評䟡を保存するために、統蚈スペヌスが䜜成されたす。 これを行うには、コン゜ヌルに移動しおコマンドを実行したす。
	 box.cfg {}-デフォルト蚭定をロヌドしたす
	 box.schema.space.create "stats"-新しいスペヌスを䜜成したす



スペヌスがどのように䜜成されたかを確認したしょう。
 tarantool> box.space 
 --- 
 -統蚈 
    䞀時的false 
    ゚ンゞンmemtx 
 ... 

そしお、それをstats倉数に割り圓おたす
 tarantool> stats = box.space 


デヌタベヌスたたはMongoDbのスキヌマを䜜成した堎合、次のスキヌマを遞択したす。
 1キヌ-䞻キヌ、ビデオIDず同じ
 2 clicks_1-最初の写真のクリック数 
 3クリック_2--||  -2番目の写真 
 4クリック_3--||  -3番目の写真 
 5 clicks_sum_1-最初の写真のクリックの総数 
 6 clicks_sum_2--||  -2番目の写真             
 7 clicks_sum_3--||  -3番目の写真 
 8 show_1ショヌでも同じ
             ...
 13 show_sum_3   
最埌のスパンの最初の画像の14 ctr_1 ctr
 15 ctr_2
 16 ctr_3
 17 ctr_sum_1期間党䜓の最初の画像のctr
 18 ctr_sum_2
 19 ctr_sum_3
最埌の間隔のすべおの写真の20 ctr ctr
期間党䜓のすべおの写真の21 ctr_sum ctr

最初の列はフィヌルドの番号です。フィヌルド名を定数ずしお定矩したす。
	 -最初のフィヌルドは䞻キヌです
	 clicks_1 = 2 
	 clicks_2 = 3
	 。  。  。
 	 ctr_sum = 22

スペヌスに䞻キヌを䜜成し、HASHタむプを遞択したす。
        統蚈create_index 'primary'、{type = 'hash'、parts = {1、 'NUM'}}

䜜成したこずを確認したす。
 tarantool> stats.index 
 --- 
 -00 
    ナニヌクtrue 
    パヌツ 
     -タむプNUM 
       fieldno1 
     id0 
     space_id513 
    名前プラむマリ 
    タむプHASH 
  プラむマリ* 0 
 ... 

うたくいけば非垞に䟿利です。次に、clicks_1フィヌルドをむンクリメントする関数を䜜成し、デバッグのためにいく぀かの゚ントリを挿入したす。
     統蚈挿入{1,0,0,0,0,0,0}
     統蚈挿入{2,0,0,0,0,0,0}
     統蚈{3,0,0,0,0,0,0}を挿入

たず、次のものがあるこずを確認したす。
 tarantool>統蚈{2}を遞択 
 --- 
 --[2、0、0、0、0、0、0] 
 ...

玠晎らしい、すべおが私たちのために働いおいたす 次に、フィヌルドむンクリメントコヌドを蚘述したしょう。
 tarantool> statsupdate2、{{'+'、2,1}} 
 tarantool>統蚈{2}を遞択 
 -[2、1、0、0、0、0、0] 
 tarantool> statsupdate2、{{'+'、2,1}} 
 -[2、2、0、0、0、0、0] 


曎新コマンドには次のパラメヌタヌがありたす。
䞻キヌ-曎新甚のキヌ番号
2番目のパラメヌタヌはアクションのリストで、各芁玠はトリプレット3぀の芁玠のリストを衚したす。
-アクションのタむプ、この堎合は远加
-倉曎が行われるフィヌルドの番号
-番号

曎新コマンドの詳现に぀いおは、ドキュメントをご芧ください  tarantool.org/doc/book/box/box_space.html#lua-function.space_object.update

statsupdateを実行するたびに、2番目のフィヌルドのキヌ= 2のデヌタが1ず぀増加するこずがわかりたす。より読みやすい圢匏で曞き蟌みたす。 以前に私たちは尋ねなければなりたせんでした
 tarantool> clicks_1 = 2 

実行
 tarantool> statsupdate2、{{'+'、clicks_1,1}} 
 -[2、4、0、0、0、0、0] 

これを関数でラップしたす。
 function click_inckeystatsupdatekey、{{'+'、clicks_1,1}}end 

そしおチェック
 tarantool> click_inc2 
 tarantool>統蚈{2}を遞択 
 --- 
 --[2、5、0、0、0、0、0] 
 ... 
 tarantool> click_inc2 
 tarantool>統蚈{2}を遞択 
 --- 
 --[2、6、0、0、0、0、0] 
 ...

関数に画像番号を远加したす番号は0から始たりたす-最初の画像

 function click_inckey、img_numstatsupdatekey、{{'+'、clicks_1 + img _num、1}}end

チェックした埌、関数を別のファむルで芋やすく衚瀺したすclick.lua

関数 click_inc  key 、 img_num 
img_num > 3の 堎合
停を返す
終わり
ç®± スペヌス 統蚈 update  key 、 { { '+' 、 clicks_1 + img_num 、 1 } } 
真を 返す
終わり


ご芧のずおり、関数実行のロゞックは非垞に単玔です。最初の匕数はビデオIDで、次の番号はそのプレビュヌです。 次に、これらすべおをどのように適甚できるかを芋おみたしょう。 WEBプロゞェクトの堎合、この関数は3぀の方法で呌び出すこずができたす。
-カスタムAPIの䜿甚PHP / Python / Perl / Javaスクリプトなどから
-tarantool-httpを介しお、nginxを介しおリク゚ストがプロキシされたす
たたは、http.libたたは別のWebサヌバヌxavanteなどを䜿甚する独自のluaスクリプト
-nginx_upstreemモゞュヌルを䜿甚しおnginxから盎接。

興味があれば、2番目の方法に぀いお詳しく説明したすが、この堎合は3番目のオプションを遞択したした。 この蚘事には非垞に倚くの文字がありたす。そのため、T *䜜成者のnginxずTarantoolに基づいおサヌビスを構築する蚘事でモゞュヌルのむンストヌルず構成に぀いお読むこずができたす。

したがっお、click.luaは次のようになりたす。
/ usr / bin / tarantool

ç®± cfg {
log_level = 5 ;
listen = 10001 ;
}

click_1 = 2 ;

関数click_inc  key 、 img_num 
img_num > 3の 堎合
0を 返す
終わり
ç®± スペヌス 統蚈 update  key 、 { { '+' 、 click_1 + img_num 、 1 } } 
1を 返す
終わり


それをチェックしおください
         curl http://127.0.0.1:8081/echo --data '{"method" "click_inc"、 "params"[2,1]、 "id"0}' {"id"0、 "結果 "[[1]]} 

確認するには、T *の実行䞭のむンスタンスに接続したしょう。
 tarantool> console = require "コン゜ヌル" 
 tarantool> console.connect "127.0.0.1:10001" 
 tarantool127.0.0.1:10001に接続 
 -本圓 
 127.0.0.1:10001>統蚈= box.space.stats 
 127.0.0.1:10001>統蚈{2}を遞択 
 --[2、7、0、0] 
 ... 


2番目の画像のカりンタヌをむンクリメントするこずもできたす。
  curl http://127.0.0.1:8081/echo --data '{"method" "click_inc"、 "params"[2,2]、 "id"1}'
 {「id」0、「結果」[[1]]}
 

結果を確認したす。
 127.0.0.1:10001>統蚈{2}を遞択 
 --[2、7、1、0] 
 ... 

クリックスルヌシステムを䜜るのがどれほど簡単かを芋たした。 それでは、配信システムに移りたしょう。

プレビュヌのセットの各ペヌゞは、むンプレッションむンクリメントプロシヌゞャshow_incが実行されるず、「カテゎリ」を任意に呌び出したす。 しかし、私たちが理解しおいるように、これは最適ではありたせん。 次のオプションがありたす。HTMLペヌゞの本文に倉数が生成されたす。
< スクリプト >
show_pictupies =” 1,2,3,4,5” / *衚瀺されおいる画像のすべおのIDはここにリストされおいたす* /
< / スクリプト >




さらにAJAXでこのリスト党䜓を転送したす。 しかし、ここでは、画像のidに加えお、その衚瀺オプションも枡す必芁がありたす。そのため、リストは「1-1、2-1、3-1、4-2」の圢匏を取るこずができたす。マむナス蚘号の埌の数字は衚瀺オプションを瀺したす。

残念ながら、luaで爆発するような関数の類䌌物はないため、Googleでこのコヌドを䜿甚したした

関数分割 inputstr 、 sep 
sep == nilの 堎合
sep = "s"
終わり
ロヌカル t = { } ; i = 1
stringの str gmatch  inputstr 、 "[^" .. sep .. "] +"  do
t [ i ] = str
i = i + 1
終わり
tを返す
終わり


次に、テヌブルを調べたす。 ルヌプを実装するには、反埩関数を実装したす。
関数倀 t 
ロヌカル i = 0
return function   i = i + 1 ; t [ i ]を 返す
終わり

it in values  tt  do show_inc  it 、 2  end


ご想像のずおり、show_incはclick_incず非垞によく䌌おいたすが、倉数click_1をshow_1に眮き換えるずいういく぀かの䟋倖がありたす。 したがっお、より汎甚的な関数stat_incキヌ、フィヌルド、img_numberを䜜成できたす。

関数 stat_inc  key 、 field 、 img_num 

img_num > 3の 堎合

0を 返す
終わり

ç®± スペヌス stats  update  key 、 { { '+' 、 field + img_num 、 1 } } 
1を 返す
終わり



2皮類のctrをカりントしおいるため、最埌の䞖代から最初の䞖代ず䞀般的な䞖代の2぀をカりントするため、クリックプロシヌゞャを䜜成し、nginx経由で呌び出したす。

関数クリック key 、 img_num 
stat_inc  key 、 clicks_1 、 img_num 
stat_inc  key 、 clicks_sum_1 、 img_num 
終わり


そしお衚瀺

関数 show  key_list 
list = slipt  key_list 、 '、' 
倀のリストリスト
する
pos = string.find  it 、 “ - ”  ;
key = string.sub  it 、 0 、 pos - 1  ;
img_num = string.sub  it 、 pos + 1 
stat_inc  key 、 shows_1 、 img_num 
stat_inc  key 、 shows_sum_1 、 img_num 
終わり
終わり


このようにしお、クリックずむンプレッションの䞡方をカりントしたす。

このトピックに興味を持っお、HTMLを生成するためのctrの蚈算方法ず画像の遞択方法を説明できたす。

Source: https://habr.com/ru/post/J275281/


All Articles