د VKontakte پیغام ډیټابیس له سکریچ څخه بیا ولیکئ او ژوندي پاتې شئ

زموږ کاروونکي یو بل ته پیغامونه لیکي پرته لدې چې ستړیا پوه شي.
د VKontakte پیغام ډیټابیس له سکریچ څخه بیا ولیکئ او ژوندي پاتې شئ
دا خورا ډیر دی. که تاسو د ټولو کاروونکو ټول پیغامونه لوستلو ته وټاکئ، نو دا به د 150 زرو کلونو څخه زیات وخت ونیسي. په دې شرط چې تاسو په کافي اندازه پرمختللي لوستونکي یاست او په هر پیغام کې له یوې ثانیې څخه ډیر مه مصرفوئ.

د معلوماتو دومره حجم سره، دا مهمه ده چې د ذخیره کولو او لاسرسي لپاره منطق په ښه توګه جوړ شوی وي. که نه نو، په یوه نه په زړه پورې شیبه کې، دا ممکن روښانه شي چې هرڅه به ژر غلط شي.

زموږ لپاره، دا شیبه یو نیم کال مخکې راغله. موږ څنګه دې ته راغلو او په پای کې څه پیښ شوي - موږ تاسو ته په ترتیب سره وایو.

پس منظر

په لومړي تطبیق کې، د VKontakte پیغامونو د پی ایچ پی بیکینډ او مای ایس کیو ایل په ترکیب کې کار کاوه. دا د کوچني زده کونکي ویب پا toې لپاره په بشپړ ډول نورمال حل دی. په هرصورت، دا سایټ په غیر منظم ډول وده وکړه او د ځان لپاره د ډیټا جوړښتونو اصلاح کولو غوښتنه یې پیل کړه.

د 2009 په پای کې، د لومړي متن انجن ذخیره لیکل شوې، او په 2010 کې پیغامونه لیږدول شوي.

د متن انجن کې، پیغامونه په لیستونو کې زیرمه شوي - یو ډول "میل باکسونه". هر دا ډول لیست د uid لخوا ټاکل کیږي - هغه کارن چې دا ټول پیغامونه لري. یو پیغام د ځانګړتیاوو مجموعه لري: د مخاطب پیژندونکی، متن، ضمیمې، او داسې نور. د "بکس" دننه د پیغام پیژندونکی ځایی_id دی، دا هیڅکله نه بدلیږي او د نوي پیغامونو لپاره په ترتیب سره ټاکل کیږي. "بکسونه" خپلواک دي او د انجن دننه د یو بل سره همغږي نه دي؛ د دوی ترمنځ اړیکه د PHP په کچه واقع کیږي. تاسو کولی شئ د دننه څخه د متن - انجن ډیټا جوړښت او وړتیاوې وګورئ دلته.
د VKontakte پیغام ډیټابیس له سکریچ څخه بیا ولیکئ او ژوندي پاتې شئ
دا د دوو کاروونکو ترمنځ د لیکنې لپاره کافي و. اټکل وکړئ چې بیا څه پیښ شوي؟

د 2011 په می کې، VKontakte د ډیری ګډون کونکو سره خبرې اترې معرفي کړې - څو خبرې. د دوی سره د کار کولو لپاره، موږ دوه نوي کلسترونه پورته کړل - د غړو چیټ او د چیټ غړي. لومړی د کاروونکو لخوا د چیټونو په اړه ډیټا ذخیره کوي ، دوهم د چیټونو لخوا د کاروونکو په اړه ډیټا ذخیره کوي. پخپله د لیستونو سربیره، پدې کې شامل دي، د بیلګې په توګه، بلنه ورکوونکي او هغه وخت چې دوی په چیٹ کې اضافه شوي.

"PHP، اجازه راکړئ چیټ ته یو پیغام واستوو،" کارن وايي.
"راځه، {کارن نوم}،" پی ایچ پی وايي.
د VKontakte پیغام ډیټابیس له سکریچ څخه بیا ولیکئ او ژوندي پاتې شئ
د دې سکیم نیمګړتیاوې شتون لري. همغږي کول لاهم د PHP مسؤلیت دی. لوی چیٹ او کارونکي چې په ورته وخت کې دوی ته پیغامونه لیږي یوه خطرناکه کیسه ده. څرنګه چې د متن انجن مثال په uid پورې اړه لري، د چیٹ ګډون کونکي کولی شي ورته پیغام په مختلفو وختونو کې ترلاسه کړي. یو څوک کولی شي پدې سره ژوند وکړي که چیرې پرمختګ لاهم ودریږي. مګر دا به نه وي.

د 2015 په پای کې، موږ د ټولنې پیغامونه پیل کړل، او د 2016 په پیل کې، موږ د دوی لپاره یو API پیل کړ. په ټولنو کې د لوی چیټ بوټونو په راتګ سره، دا ممکنه وه چې حتی د بار ویشلو په اړه هیر کړئ.

یو ښه بوټ هره ورځ څو ملیون پیغامونه تولیدوي - حتی ډیری خبرې کونکي کارونکي پدې فخر نشي کولی. دا پدې مانا ده چې د متن انجن ځینې مثالونه، په کوم کې چې دا ډول بوټان ژوند کوي، په بشپړ ډول زیانمن شوي.

په 2016 کې د پیغام انجنونه 100 د چیټ-غړو او غړو-چیټونو، او 8000 متن-انجنونه دي. دوی په زرو سرورونو کې کوربه شوي، هر یو د 64 GB حافظې سره. د لومړي اضطراري اقدام په توګه ، موږ حافظه د بل 32 GB لخوا لوړه کړه. موږ وړاندوینې اټکل کړې. د سختو بدلونونو پرته، دا به د بل کال لپاره کافي وي. تاسو اړتیا لرئ یا هارډویر ونیسئ یا پخپله ډیټابیسونه اصلاح کړئ.

د معمارۍ طبیعت له امله ، دا یوازې په څو ضربو کې د هارډویر زیاتولو معنی لري. دا، لږترلږه د موټرو شمیر دوه چنده کول - په ښکاره ډول، دا خورا ګران لاره ده. موږ به اصلاح کړو.

نوی مفهوم

د نوې تګلارې مرکزي جوهر خبرې کول دي. چیټ د پیغامونو لیست لري چې ورسره تړاو لري. کارن د چیټونو لیست لري.

اړین لږترلږه دوه نوي ډیټابیسونه دي:

  • چیټ انجن. دا د چیٹ ویکتورونو ذخیره ده. هر چیٹ د پیغامونو ویکتور لري چې ورسره تړاو لري. هر پیغام د چیٹ دننه یو متن او یو ځانګړی پیغام پیژندونکی لري - chat_local_id.
  • د کارونکي انجن. دا د کاروونکو ویکتورونو ذخیره ده - د کاروونکو لپاره لینکونه. هر کاروونکی د peer_id ویکتور لري (متقابل کونکي - نور کارونکي، څو خبرې یا ټولنې) او د پیغامونو ویکتور. هر peer_id د پیغامونو ویکتور لري چې ورسره تړاو لري. هر پیغام د هغه کارونکي لپاره یو chat_local_id او یو ځانګړی پیغام ID لري - user_local_id.

د VKontakte پیغام ډیټابیس له سکریچ څخه بیا ولیکئ او ژوندي پاتې شئ
نوي کلسترونه د TCP په کارولو سره یو له بل سره اړیکه نیسي - دا ډاډ ورکوي چې د غوښتنو ترتیب نه بدلیږي. پخپله غوښتنې او د دوی لپاره تاییدات په هارډ ډرایو کې ثبت شوي - نو موږ کولی شو د انجن له ناکامۍ یا بیا پیل کولو وروسته هر وخت د قطار حالت بحال کړو. څرنګه چې د کاروونکي انجن او چیټ انجن هر یو 4 زره شارډونه دي، د کلسترونو ترمنځ د غوښتنې کتار به په مساوي توګه وویشل شي (مګر په حقیقت کې هیڅ هم شتون نلري - او دا خورا چټک کار کوي).

زموږ په ډیټابیسونو کې د ډیسک سره کار کول په ډیری قضیو کې د بدلونونو بائنری لاګ (بنلاګ) ، جامد سنیپ شاټونو او په حافظه کې د جزوي عکس ترکیب پراساس دي. د ورځې په جریان کې بدلونونه په بنلاګ کې لیکل کیږي، او د اوسني حالت یو سنیپ شاټ په دوره توګه رامینځته کیږي. سنیپ شاټ د ډیټا جوړښتونو ټولګه ده چې زموږ د اهدافو لپاره غوره شوي. دا سرلیک (د عکس میټینډیکس) او د میټا فایلونو سیټ لري. سرلیک د تل لپاره په RAM کې زیرمه شوی او دا په ګوته کوي چې چیرې د سنیپ شاټ څخه ډیټا لټوي. په هر میټا فایل کې هغه معلومات شامل دي چې احتمال لري په نږدې وختونو کې ورته اړتیا وي — د مثال په توګه ، د یو واحد کارونکي پورې اړوند. کله چې تاسو د سنیپ شاټ سرلیک په کارولو سره ډیټابیس پوښتنه کوئ، اړین میټا فایل لوستل کیږي، او بیا په بنلاګ کې بدلونونه چې د سنیپ شاټ رامینځته کیدو وروسته پیښ شوي په پام کې نیول کیږي. تاسو کولی شئ د دې طریقې د ګټو په اړه نور ولولئ دلته.

په ورته وخت کې، په هارډ ډرایو کې ډاټا یوازې په ورځ کې یو ځل بدلیږي - په مسکو کې د شپې ناوخته، کله چې بار لږ وي. د دې څخه مننه (په دې پوهیدل چې په ډیسک کې جوړښت د ورځې په اوږدو کې ثابت دی)، موږ کولی شو د ټاکل شوي اندازې سره د ویکتورونو ځای په ځای کړو - او د دې له امله، په حافظه کې لاسته راوړو.

په نوي سکیم کې د پیغام لیږل داسې ښکاري:

  1. د پی ایچ پی پس منظر د کارونکي انجن سره د پیغام لیږلو غوښتنې سره اړیکه نیسي.
  2. د یوزر انجن پراکسي د غوښتل شوي چیټ-انجن مثال ته غوښتنه کوي، کوم چې د کارن-انجن chat_local_id ته بیرته راځي - په دې چیٹ کې د نوي پیغام یو ځانګړی پیژندونکی. چیټ_انجین بیا په چیٹ کې ټولو ترلاسه کونکو ته پیغام خپروي.
  3. یوزر-انجن د چیټ انجن څخه chat_local_id ترلاسه کوي او یوزر_local_id PHP ته بیرته ورکوي - د دې کارن لپاره یو ځانګړی پیغام پیژندونکی. دا پیژندونکی بیا کارول کیږي، د بیلګې په توګه، د API له لارې د پیغامونو سره کار کولو لپاره.

د VKontakte پیغام ډیټابیس له سکریچ څخه بیا ولیکئ او ژوندي پاتې شئ
مګر په حقیقت کې د پیغامونو لیږلو سربیره، تاسو اړتیا لرئ یو څو نور مهم شیان پلي کړئ:

  • فرعي لیستونه د بیلګې په توګه، وروستي پیغامونه دي چې تاسو یې د خبرو اترو لیست پرانیزئ. نه لوستل شوي پیغامونه، د ټګونو سره پیغامونه ("مهم"، "سپیم"، او نور).
  • په چیټ انجن کې د پیغامونو کمپریس کول
  • د کاروونکي انجن کې د پیغامونو زیرمه کول
  • لټون (د ټولو ډیالوګونو له لارې او په یوه ځانګړي کې).
  • د ریښتیني وخت تازه کول (اوږده رایه ورکول).
  • په ګرځنده پیرودونکو کې کیشینګ پلي کولو لپاره تاریخ خوندي کول.

ټول فرعي لیستونه په چټکۍ سره جوړښت بدلوي. د دوی سره کار کولو لپاره موږ کاروو د ونو سپوږمۍ. دا انتخاب د دې حقیقت له مخې تشریح شوی چې د ونې په پورتنۍ برخه کې موږ کله ناکله د سنیپ شاټ څخه د پیغامونو ټوله برخه ذخیره کوو - د مثال په توګه ، د شپې له سره رینډیکس کولو وروسته ، ونه یو پورتنۍ برخه لري ، کوم چې د فرعي لیست ټول پیغامونه لري. د Splay ونه د توازن په اړه فکر کولو پرته د ورته عمودی مینځ ته ننوتل اسانه کوي. سربیره پردې، Splay غیر ضروري معلومات نه ذخیره کوي، کوم چې زموږ حافظه خوندي کوي.

په پیغامونو کې ډیری معلومات شامل دي، ډیری یې متن، کوم چې د کمپرس کولو وړ وي. دا مهمه ده چې موږ کولی شو په دقیق ډول حتی یو انفرادي پیغام هم غیر آرشیف کړو. د پیغامونو د کمپرس کولو لپاره کارول کیږي هفمن الګوریتم زموږ د خپل هوریسټیک سره - د مثال په توګه، موږ پوهیږو چې په پیغامونو کې د "غیر کلمو" سره بدیل کلمې - ځایونه، د ټکي نښه - او موږ د روسیې ژبې لپاره د سمبولونو کارولو ځینې ځانګړتیاوې هم په یاد لرو.

څرنګه چې د چیټ په پرتله ډیر لږ کاروونکي شتون لري، د چیټ انجن کې د تصادفي لاسرسي ډیسک غوښتنې خوندي کولو لپاره، موږ پیغامونه د کاروونکي انجن کې ذخیره کوو.

د پیغام لټون د کارن-انجن څخه د ټولو چیټ-انجن مثالونو ته چې د دې کارونکي چیټونه لري د ډیګونال پوښتنې په توګه پلي کیږي. پایلې پخپله د کارونکي انجن کې یوځای شوي.

ښه ، ټول توضیحات په پام کې نیول شوي ، ټول هغه څه چې پاتې دي نوي سکیم ته اړول دي - او په غوره توګه پرته له دې چې کاروونکي یې په پام کې ونیسي.

د معلوماتو مهاجرت

نو، موږ د متن انجن لرو چې د کارونکي لخوا پیغامونه ذخیره کوي، او دوه کلسترونه چیٹ-غړي او غړي-چیټونه چې د څو چیټ خونو او کاروونکو په اړه معلومات ذخیره کوي. څنګه له دې څخه نوي کارونکي انجن او چیټ انجن ته لاړ شئ؟

په زاړه سکیم کې د غړو چیټ په عمده ډول د اصلاح لپاره کارول کیده. موږ په چټکۍ سره اړین معلومات له دې څخه د چیټ غړو ته لیږدول، او بیا یې د مهاجرت په پروسه کې برخه نه درلوده.

د چیٹ غړو لپاره قطار. پدې کې 100 مثالونه شامل دي، پداسې حال کې چې د چیټ انجن 4 زره لري. د ډیټا لیږدولو لپاره ، تاسو اړتیا لرئ دا په مطابقت کې راوړئ - د دې لپاره ، د چیټ غړي په ورته 4 زره کاپيونو ویشل شوي ، او بیا د چیټ غړو بنلاګ لوستل په چیټ انجن کې فعال شوي.
د VKontakte پیغام ډیټابیس له سکریچ څخه بیا ولیکئ او ژوندي پاتې شئ
اوس د چیټ انجن د چیٹ غړو څخه د څو چیټ په اړه پوهیږي ، مګر دا لاهم د دوه متقابلو خبرو اترو په اړه هیڅ نه پوهیږي. دا ډول خبرې اترې د کاروونکو په حواله د متن انجن کې موقعیت لري. دلته موږ ډیټا "په سر کې" اخیستې: د چیټ-انجن هر مثال د متن - انجن ټولو مثالونو څخه وپوښتل که دوی ورته اړین ډیالوګ ولري.

عالي - د چیټ انجن پوهیږي چې څو څو چټ چیټونه شتون لري او پوهیږي چې کوم ډیالوګونه شتون لري.
تاسو اړتیا لرئ پیغامونه په څو چیټ چیټونو کې یوځای کړئ ترڅو تاسو په هر چیٹ کې د پیغامونو لیست سره پای ته ورسیږئ. لومړی، د چیټ انجن د متن انجن څخه د دې چیٹ څخه ټول کاروونکي پیغامونه ترلاسه کوي. په ځینو مواردو کې د دوی خورا ډیر شتون لري (تر سلګونو ملیونونو پورې) ، مګر د خورا نادر استثناء سره چیټ په بشپړ ډول په رام کې فټ کیږي. موږ بې ترتیبه ​​پیغامونه لرو، هر یو په څو کاپيونو کې - په هرصورت، دا ټول د کاروونکو سره په مطابقت کې د متن - انجن مختلف مثالونو څخه ایستل شوي. هدف د پیغامونو ترتیب کول او د کاپيونو څخه خلاصول دي چې غیر ضروري ځای نیسي.

هر پیغام یو مهال ویش لري چې د لیږلو وخت او متن لري. موږ د ترتیب کولو لپاره وخت کاروو - موږ د ملټي چیټ برخه اخیستونکو پخوانیو پیغامونو ته اشارې ورکوو او د ټاکل شوي کاپي متن څخه هشونه پرتله کوو ، د وخت سټیمپ زیاتوالي په لور حرکت کوو. دا منطقي ده چې کاپي به ورته هش او مهال ویش ولري، مګر په عمل کې دا تل داسې نه وي. لکه څنګه چې تاسو په یاد ولرئ، په زاړه سکیم کې همغږي کول د PHP لخوا ترسره شوي - او په نادره مواردو کې، د ورته پیغام لیږلو وخت د مختلف کاروونکو ترمنځ توپیر درلود. په دې قضیو کې، موږ خپل ځان ته اجازه ورکړه چې د مهال ویش ترمیم کړو - معمولا په یوه ثانیه کې. دویمه ستونزه د مختلف ترلاسه کونکو لپاره د پیغامونو مختلف ترتیب دی. په داسې قضیو کې ، موږ د مختلف کاروونکو لپاره د مختلف ترتیب کولو اختیارونو سره ، اضافي کاپي رامینځته کولو ته اجازه ورکړه.

له دې وروسته، په ملټي چیټ کې د پیغامونو په اړه معلومات د کارونکي انجن ته لیږل کیږي. او دلته د وارد شوي پیغامونو ناخوښه ځانګړتیا راځي. په نورمال عملیاتو کې، هغه پیغامونه چې انجن ته راځي په سختۍ سره د user_local_id لخوا په لوړ ترتیب کې امر کیږي. د کارونکي انجن ته د زاړه انجن څخه وارد شوي پیغامونه دا ګټور ملکیت له لاسه ورکوي. په ورته وخت کې ، د ازموینې اسانتیا لپاره ، تاسو اړتیا لرئ ژر تر ژره دوی ته لاسرسی ومومئ ، په دوی کې یو څه وګورئ او نوي اضافه کړئ.

موږ د وارد شوي پیغامونو ذخیره کولو لپاره د ځانګړي ډیټا جوړښت کاروو.

دا د اندازې ویکتور استازیتوب کوي د VKontakte پیغام ډیټابیس له سکریچ څخه بیا ولیکئ او ژوندي پاتې شئهرڅوک چیرته دی د VKontakte پیغام ډیټابیس له سکریچ څخه بیا ولیکئ او ژوندي پاتې شئ - مختلف دي او په نزولي ترتیب سره ترتیب شوي، د عناصرو ځانګړي ترتیب سره. په هره برخه کې د شاخصونو سره د VKontakte پیغام ډیټابیس له سکریچ څخه بیا ولیکئ او ژوندي پاتې شئ عناصر ترتیب شوي دي. په داسې جوړښت کې د عنصر لټون کول وخت نیسي د VKontakte پیغام ډیټابیس له سکریچ څخه بیا ولیکئ او ژوندي پاتې شئ له لارې د د VKontakte پیغام ډیټابیس له سکریچ څخه بیا ولیکئ او ژوندي پاتې شئ بائنری لټونونه. د یو عنصر اضافه کول په بشپړ ډول معاف کیږي د VKontakte پیغام ډیټابیس له سکریچ څخه بیا ولیکئ او ژوندي پاتې شئ.

نو، موږ معلومه کړه چې څنګه د پخوانیو انجنونو څخه نوي ته ډیټا انتقال کړو. مګر دا پروسه څو ورځې وخت نیسي - او دا امکان نلري چې پدې ورځو کې به زموږ کاروونکي یو بل ته د لیکلو عادت پریږدي. د دې لپاره چې پدې وخت کې پیغامونه له لاسه ورنکړي، موږ د کاري سکیم ته لاړ شو چې دواړه زاړه او نوي کلسترونه کاروي.

ډیټا د چیټ غړو او کارونکي انجین ته لیکل کیږي (او د متن انجن ته نه ، لکه څنګه چې د زاړه سکیم سره سم په عادي عملیاتو کې). د کارونکي انجن پراکسي د چیټ انجن غوښتنه کوي - او دلته چلند په دې پورې اړه لري چې ایا دا چیټ دمخه یوځای شوی که نه. که چیټ لا نه وي یوځای شوی، د چیټ انجن پخپله پیغام نه لیکي، او د هغې پروسس یوازې د متن انجن کې واقع کیږي. که چیټ لا دمخه د چیټ انجن سره ضمیمه شوی وي، دا د کارونکي انجن ته chat_local_id بیرته راګرځوي او پیغام ټولو ترلاسه کونکو ته لیږي. د کارونکي انجن ټول معلومات متن-انجن ته پراکسي کوي - نو که یو څه پیښ شي، موږ کولی شو تل بیرته راوګرځوو، په زاړه انجن کې ټول اوسني معلومات درلودل. د متن-انجین user_local_id بیرته راګرځوي، کوم چې کارن-انجین ذخیره کوي او شاتنۍ ته راستنیږي.
د VKontakte پیغام ډیټابیس له سکریچ څخه بیا ولیکئ او ژوندي پاتې شئ
د پایلې په توګه، د لیږد پروسه داسې ښکاري: موږ د کاروونکي خالي انجن او د چیټ انجن کلسترونه وصل کوو. chat-engine د ټولو چیټ غړو بنلاګ لوستل کوي، بیا پراکسي کول د پورته بیان شوي سکیم سره سم پیل کیږي. موږ زاړه ډاټا لیږدوو او دوه همغږي شوي کلسترونه (زاړه او نوي) ترلاسه کوو. ټول هغه څه چې پاتې دي د متن انجن څخه د کارونکي انجن ته لوستل او د پراکسي کولو غیر فعال کول دي.

پایلې

د نوې تګلارې څخه مننه، د انجنونو ټول فعالیت میټریکونه ښه شوي او د ډیټا ثبات سره ستونزې حل شوي. اوس موږ کولی شو په چټکۍ سره په پیغامونو کې نوي ځانګړتیاوې پلي کړو (او دمخه یې دا کار پیل کړی دی - موږ د چیټ ګډون کونکو اعظمي شمیره لوړه کړې، د فارورډ شوي پیغامونو لټون یې پلي کړي، پینډ شوي پیغامونه یې پیل کړي او د هر کارن پیغامونو مجموعي شمیره مو لوړه کړې) .

په منطق کې بدلونونه واقعیا خورا لوی دي. او زه غواړم په یاد ولرم چې دا تل د لوی ټیم لخوا د بشپړ کلونو پراختیا او د کوډونو بې شمیره لینونو معنی نلري. chat-engine او user-engine د ټولو اضافي کیسو سره لکه هفمن د پیغام کمپریشن لپاره، Splay Trees او د وارد شوي پیغامونو جوړښت د کوډ له 20 زره لینونو څخه کم دی. او دوی یوازې په 3 میاشتو کې د 10 پراختیا کونکو لخوا لیکل شوي (په هرصورت ، دا په پام کې نیولو سره ارزښت لري ټول درې پراختیا کونکی - د نړۍ اتلان د سپورت پروګرامونو کې).

سربیره پردې ، د سرورونو شمیر دوه چنده کولو پرځای ، موږ د دوی شمیر نیمایي ته راکم کړی - اوس د کارونکي انجن او چیټ انجن په 500 فزیکي ماشینونو کې ژوند کوي ، پداسې حال کې چې نوې سکیم د بار کولو لپاره لوی سر خونه لري. موږ په تجهیزاتو کې ډیرې پیسې خوندي کړې - شاوخوا $ 5 ملیون + $ 750 زره په کال کې په عملیاتي لګښتونو کې.

موږ هڅه کوو چې د خورا پیچلي او لوی کچې ستونزو لپاره غوره حلونه ومومئ. موږ ډیری یې لرو - او له همدې امله موږ د ډیټابیس ډیپارټمنټ کې د تکړه پراختیا کونکو په لټه کې یو. که تاسو مینه لرئ او پوهیږئ چې څنګه دا ډول ستونزې حل کړئ، د الګوریتمونو او ډیټا جوړښتونو غوره پوهه ولرئ، موږ تاسو ته بلنه درکوو چې د ټیم سره یوځای شئ. زموږ سره اړیکه ونیسئ HRد جزیاتو لپاره.

حتی که دا کیسه ستاسو په اړه نه وي، مهرباني وکړئ په یاد ولرئ چې موږ وړاندیزونو ته ارزښت ورکوو. یو ملګري ته یې ووایاست د پراختیا کونکي خالي ځایونه، او که هغه په ​​​​بریالیتوب سره د محاکمې موده بشپړه کړي، تاسو به د 100 زره روبلو بونس ترلاسه کړئ.

سرچینه: www.habr.com

Add a comment