ვებსოკეტის საშუალებით მიღებული განახლებების დამუშავება. კიდევ რაღაცის შექმნა

12.03.2019

წესები მარტივი იყო. თითოეულ მომხმარებელს შეეძლო აირჩიოს 16 ფერიდან ერთი და დახატა ერთი პიქსელი ტილოზე ნებისმიერ ადგილას. შესაძლებელი იყო იმდენი პიქსელის დახატვა, რამდენიც გინდოდა და რა ფერებით გინდოდა, მაგრამ შემდეგი პიქსელის ხელახალი შეღებვისთვის 5 წუთი უნდა დაელოდე.

მართალია, წესებში ნათქვამია: ”სხვებთან კოორდინირებით, თქვენ შეგიძლიათ შექმნათ ბევრად მეტი, ვიდრე მარტო მოქმედებით.”

რაც მოხდა მომდევნო 72 საათის განმავლობაში, შოკში ჩააგდო ორგანიზატორები. ეს გამოჩნდა ცარიელ ტილოზე:

ტილოზე თითოეული პიქსელი ხელით იყო განთავსებული. ყოველი ხატი, ყოველი დროშა, ყოველი მემი უმტკივნეულოდ შეიქმნა ასობით ათასი ადამიანის მიერ, რომელთაც არაფერი ჰქონდათ ერთმანეთთან, გარდა ინტერნეტ კავშირისა. ასეა თუ ისე, მაგრამ რაც მოხდა Reddit-ზე, სამართლიანად შეიძლება ჩაითვალოს ხელოვნების დაბადებად.

როგორ მოხდა ეს ყველაფერი

ამის რამდენიმე სიტყვით აღწერა შეუძლებელია. ტილოზე უთვალავი დრამა ხდებოდა - ჩხუბი, ბრძოლები და ომები, ხანდახან არც კი გაურკვეველია რა მიზეზით. ისინი ტარდებოდა პატარა ფორუმებზე, პირად ჩატებში, იმდენი იყო და ყველა ერთდროულად მოხდა, ამიტომ ყველაფრის თვალყურის დევნება შეუძლებელი იყო. ზოგადად, ტილო იყო მიკვლეული მარადიული ისტორიასამი ძალის შესახებ, რომელიც აუცილებელია კაცობრიობის შესაქმნელად.

შემქმნელები

შემქმნელები პირველები მოვიდნენ. ისინი იყვნენ მხატვრები, რომლებისთვისაც სუფთა ტილოს დაუძლეველი მიმზიდველობა აქვს.

შემქმნელებმა დაიწყეს პიქსელების შემთხვევითი შეღებვა, მხოლოდ იმის დასანახად, თუ რისი გაკეთება შეეძლოთ. ამიტომ, პირველი ნახატები უფრო ჰგავდა როკ ხელოვნება- მხატვრები ახლახან იწყებდნენ ფრთების გაშლას.

საკმაოდ სწრაფად მიხვდნენ, რომ მარტო მუშაობით და ყოველ 5-10 წუთში მხოლოდ ერთი პიქსელის განთავსებით, რაიმე მნიშვნელოვანის შექმნა შეუძლებელია. ვიღაც ვალდებულია გააფუჭოს მათი საქმე. მეტი რამის შესაქმნელად, მათ ერთად უნდა იმუშაონ.

შემდეგ კი ვიღაცამ შესთავაზა დახატვა ბადეზე, რომელიც ნათლად აჩვენებდა, სად უნდა დახატოს შემდეგი პიქსელი, რათა მიეღო თანმიმდევრული გამოსახულება. ასე რომ, ტილოს ქვედა მარცხენა ნაწილში გამოჩნდა დიკბატი - ცნობილი ინტერნეტ მემი, თინეიჯერული იუმორის გრძნობის ნაყოფი. ეს გახდა პირველი ერთობლივი ნამუშევარი.

მაგრამ შემქმნელები აქ არ გაჩერებულან. მათ დაიწყეს Dickbutt-ში სხვადასხვა ელემენტების დამატება, სხვადასხვა ფერებში შეღებვა და მისი გარდაქმნა Dickbutterfly-ადაც კი. ამ სულელური იდეის უკან იყო მინიშნება მოსალოდნელი შემოქმედებითი ცუნამის შესახებ.

თუმცა, ეს მაშინვე არ მომხდარა. შემქმნელები თავიანთი ძალით იყვნენ ნასვამები. Dickbutt-ის გვერდით გამოჩნდა Pokemon Charmander, რომელშიც თათის ნაცვლად წევრმა დაიწყო ზრდა, შემდეგ კი კიდევ ორი.

ეს უკვე დიზაინი აღარ იყო. ზოგიერთი შემქმნელი სასოწარკვეთილად ცდილობდა პროვოკაციული დამატებების ამოღებას და მოუწოდებდა "სუფთა" ხელოვნებას, მაგრამ სხვები აგრძელებდნენ. მაგრამ იქ არ იყო.

გაირკვა, რომ ზედმეტი თავისუფლება იწვევს ქაოსს. კრეატიულობას ისევე სჭირდება საზღვრები, როგორც თავისუფლებას. როდესაც ვინმეს შეუძლია ნებისმიერი პიქსელის დაყენება სადმე, როგორ შეიძლება ამან არ გამოიწვიოს არეულობა?

მცველები

ეს პრობლემა ძალიან სწრაფად მოაგვარეს სხვა ტიპის მომხმარებლებმა - მეკარემ. ისინი მოვიდნენ ერთი მიზნით - დაეპყროთ მთელი მსოფლიო.

ფერის მიხედვით წილადების შექმნით, მათ დაიწყეს სივრცის დაპყრობა გარკვეული ფერით შეღებვით. ერთ-ერთი პირველი და უდიდესი იყო ფრაქცია Blue Corner. ქვედა მარჯვენა კუთხეში გამოჩენის შემდეგ ჭირივით გავრცელდა. მისმა მიმდევრებმა გამოაცხადეს, რომ ამ გზით ტილოს მთელი სივრცე უნდა მოეხვიათ. პიქსელ-პიქსელზე, მათ დაიწყეს თავიანთი იდეის რეალობად თარგმნა და მალე უზარმაზარი ტერიტორიები დაიკავეს.

Blue Corner არ იყო მარტო თავის მცდელობებში. ტილოს მეორე მხარეს კიდევ ერთი ჯგუფი გამოჩნდა - წითელი კუთხე (წითელი კუთხე). მისმა მონაწილეებმა განაცხადეს, რომ ისინი მემარცხენეობის მიმდევრები არიან პოლიტიკური შეხედულებები. კიდევ ერთმა ჯგუფმა - მწვანე გისოსი (მწვანე გისოსი) - აიღო მწვანე და თეთრი პიქსელების ყველგან შერწყმა. ის ძალიან ეფექტური აღმოჩნდა, რადგან მას უნდა დაეხატა ნახევარი პიქსელი, ვიდრე სხვა ფრაქციები.

მეკარეები შემქმნელებთან მიდიოდნენ ფრონტალურ შეტევაში. ჩარმანდერი გახდა ბრძოლის პირველი ადგილი. როდესაც აღმოაჩინეს, რომ ცისფერმა კუთხემ დაიწყო პოკემონების ლურჯი პიქსელებით ხოცვა, შემქმნელებმა გააცნობიერეს საფრთხე და დაასრულეს შიდა ომები.

ისინი იბრძოდნენ, შეცვალეს ყველა ლურჯი პიქსელი თავისით. მაგრამ ძალები არ იყო თანაბარი. მისი მონდომების წყალობით, Blue Corner-მა შეკრიბა გაცილებით დიდი ჯარი, ვიდრე შემქმნელები. და ერთადერთი, რაც ასეთ სიტუაციაში რჩებოდა შემქმნელებს, სიცოცხლის მათხოვრობა იყო.

და რატომღაც მან შეცვალა ტალღა. ცისფერ კუთხეში დაიწყო დებატები მათი როლის შესახებ შემოქმედებითი პროცესი. ერთ-ერთმა მონაწილემ დაუსვა კითხვა: „რადგან ჩვენი ტალღა გარდაუვალია მთელ მსოფლიოში, უნდა გამოვხატოთ თუ არა გულმოწყალება ხელოვნების სხვა ფორმების მიმართ, რომლებსაც ვხვდებით?

ეს იყო კითხვა, რომელიც ადრე თუ გვიან ყველა ფრაქციას დაუპირისპირდა. მთელი მათი ექსპანსიონისტური გულმოდგინების მიუხედავად, რა უნდა გაეკეთებინათ ხელოვნებასთან, რომელიც მათ გზაზე იდგა?

ეს იყო გარდამტეხი მომენტი. უგუნური ფრაქციები დამცველებად გადაიქცნენ.

მაგრამ ჯერ არ დასრულებულა

მტაცებელი ფერებით სავსე სამყაროში, შემქმნელებმა შეძლეს თავიანთ შემოქმედებაში დაბრუნება. ელემენტების ერთი მეორის მიყოლებით დამატებით მათ დაიწყეს მათი უფრო რთული. სამი პიქსელიანი შრიფტების გამოყენებით დაიწყეს ტექსტების წერა. ერთ-ერთი ყველაზე ცნობილი ქმნილება იყო ვარსკვლავური ომების პრიკველი.

შემქმნელები გაერთიანდნენ ჯგუფებად, რომლებიც მუშაობენ საერთო პროექტზე. მათ ერთმანეთს გაუზიარეს სტრატეგიები და ნიმუშები. ერთ-ერთი ყველაზე წარმატებული იყო ჯგუფი, რომელმაც შექმნა Windows 95 პანელი კუთხეში Start ღილაკით.

სხვებმა შექმნეს გულის ბლოკი, როგორც ძველ ვიდეო თამაშებში, როგორიცაა Zelda. ცოტამ თუ დაიწყო ეს პროექტი, მაგრამ სხვებიც სწრაფად შეუერთდნენ მათ და შედეგად, სხვადასხვა დროშის ფერებში შეღებილი გულები ტილოს ნახევარზე გადაჭიმულიყო.

მეორე ჯგუფმა ხელახლა შექმნა ვან გოგის ვარსკვლავური ღამე.

თუმცა, ყველაფერი შეუფერხებლად არ წარიმართა. დამცველები, რომლებიც ოდესღაც მიესალმნენ ხელოვნების ნიმუშების შექმნას, გახდნენ მოდის ტირანები. მათ დაიწყეს იმის დაზუსტება, თუ რა შეიძლება შეიქმნას და რა არა. ეს დაიწყო ცოტა ხნით ადრე, სანამ შემქმნელები დაიწყებდნენ შექმნას საკუთარი წესებით.

ფრაქციებმა თვალი აარიდეს ერთმანეთს და მოითხოვეს, რომ მათი მიმდევრები ეპიკურ ბრძოლებში მხარი დაეჭირათ. მათ არ ჰქონდათ დრო, ყურადღება მიექციათ იმ შემქმნელების საცოდავ ვედრებაზე, რომლებსაც სურდათ ახალი ხელოვნების იდეების მოწონება.

მცველებს შორის ჩხუბი სერიოზულად დაიწყო. Twitch-ის ლაივ სტრიმერებმა თავიანთ მიმდევრებს მოუწოდეს, თავს დაესხნენ Blue Corner-სა და Purple-ს. საბრძოლო გეგმები მზადდებოდა. მათ მოუწოდეს ემოციებისკენ.

იყო თვინიერი თავდასხმებიც კი, როდესაც იმავე ფერის მიმდევრები მოწინააღმდეგის პიქსელებს ათავსებდნენ საკუთარ თავში, რათა მათ შეეძლოთ უჩივლონ დარღვევაზე და თავდასხმას უპასუხონ.

თუმცა ყველაზე დიდი პრობლემა მკაცრი წესი იყო - ტილოს გადიდება არ შეიძლება. მეომარმა ფრაქციებმაც და შემქმნელებმაც დაიწყეს იმის გაცნობიერება, რომ მათ უბრალოდ ადგილი არ ექნებოდათ ახალი ხელოვნებისთვის.

ტილოზე თავიდანვე დროშები გამოჩნდა სხვადასხვა ქვეყნებში. ისინი გაიზარდნენ და ერთმანეთს შეეჯახნენ. ნამდვილი ეპიკური ბრძოლა დაიწყო გერმანიისა და საფრანგეთის დროშებს შორის. ცხადი გახდა, რომ ახალი სივრცეების გასავითარებლად შუამავალი იყო საჭირო.

უეცრად, მსოფლიო, თავიდან პრიმიტიული თავდასხმებისგან თავის დაღწევის შემდეგ, მზად გახდა სრულმასშტაბიანი ომისთვის. დიპლომატიური გზით პრობლემის გადაჭრის სასოწარკვეთილი მცდელობები უშედეგოდ დასრულდა. ჩეთებში შეხვედრისას შემქმნელთა და დამცველთა ლიდერები მხოლოდ ერთმანეთს ადანაშაულებდნენ.

ჩვენ გვჭირდებოდა ჭკვიანი, რომელსაც ყველა დაეთანხმებოდა.

გამანადგურებლები

ინტერნეტ საიტზე 4chan-მა გაამახვილა ყურადღება იმაზე, რაც ხდებოდა Reddit-ზე. და მათ ვერ გადალახეს. მათმა მომხმარებლებმა ყველაზე მეტად გულთან ახლოს - შავი აირჩიეს. ისინი გახდნენ სიცარიელე.

როგორც ცრემლი ნელ-ნელა ავრცელებს ზედაპირზე, ისე შავმა პიქსელებმა დაიწყეს გამოჩენა ტილოს ცენტრში, რომლებიც ანადგურებდნენ ყველაფერს მის გზაზე.

თავიდან სხვა ფრაქციები ცდილობდნენ მათთან ალიანსის დამყარებას, გულუბრყვილოდ თვლიდნენ, რომ დიპლომატია იმუშავებდა. მაგრამ ისინი ვერ შეძლეს, რადგან Void განსხვავებული იყო.

სიცარიელე არ იყო მფარველი. სხვა ფრაქციებისგან განსხვავებით, იგი არ ავლენდა რაიმე ერთგულებას ხელოვნების მიმართ. Void-ის მიმდევრები ახორციელებდნენ დესტრუქციულ ეგალიტარიზმს ლოზუნგით „სიცარიელე ყველაფერს შთანთქავს“. მათ არ ჰქონდათ კონტაქტი სხვებთან. მათ უბრალოდ სურდათ მთელი სამყარო შავად დაეხატათ.

და ეს იყო ზუსტად ის, რაც საჭირო იყო. გადაშენების პირას მყოფი პროექტის ყველა წევრი გაერთიანდა და ებრძოლა სიცარიელეს თავიანთი ხელოვნების გადასარჩენად.

მაგრამ სიცარიელის დამარცხება არც ისე ადვილი იყო, რადგან ის საჭირო იყო. საჭირო იყო ყველაფრის განადგურება, რათა ფერფლიდან ხელახლა დაბადებულიყო ახალი ხელოვნება, საუკეთესო. და სიცარიელის გარეშე ეს შეუძლებელი იყო.

ასე რომ, Void გახდა კატალიზატორი ხელოვნების უდიდესი ნაწარმოების შესაქმნელად.

თავიდანვე იყო ჯიუტი ბრძოლა ტილოს ცენტრალური ნაწილისთვის. შემქმნელებმა ეს ტერიტორია თავიანთი ნამუშევრებისთვის მოითხოვეს. თავდაპირველად ისინი ცდილობდნენ ამის გაკეთებას ხატების დახმარებით. შემდეგ კოორდინირებული მცდელობით შექმნათ პრიზმა, როგორც გარეკანზე ალბომი ვარდისფერიფლოიდი უკანა მხარემთვარე."

მაგრამ სიცარიელემ ყველაფერი შეჭამა. ერთმანეთის მიყოლებით შექმნილმა ქმნილებებმა მხოლოდ გაათბო მისი მტაცებლური მადა ქაოსისკენ.

და მაინც, ეს იყო ზუსტად ის, რაც საჭირო იყო. ხელოვნების განადგურებით The Void-მა მომხმარებლებს აიძულა უკეთესის მოფიქრება. მათ იცოდნენ, რომ შეძლებდნენ შავი მონსტრის დამარცხებას. მათ უბრალოდ სჭირდებათ კარგი პოტენციალის მქონე იდეა, რომელიც საკმარის მიმდევარს მოიზიდავს.

და ეს იდეა იყო ამერიკის დროშა.

პროექტის ბოლო დღეს ყველანი შეიკრიბნენ, რათა ერთხელ და სამუდამოდ მოეშორებინათ სიცარიელე. კოალიცია შეიქმნა იმ ადამიანებისგან, რომლებიც სხვაგვარად გაანადგურებდნენ ერთმანეთს - ტრამპის მხარდამჭერები და ოპონენტები, დემოკრატები და რესპუბლიკელები, ამერიკელები და ევროპელები.

ისინი გაერთიანდნენ, რათა შექმნან რაღაც ერთად, ინტერნეტის ამ პატარა კუთხეში, რაც დაამტკიცეს, რომ იმ ეპოქაში, სადაც ასეთი თანამშრომლობა შეუძლებელი ჩანს, მათ მაინც შეუძლიათ ამის გაკეთება.

ძველები მართლები იყვნენ

ცოტა ხნის შემდეგ Reddit-ის ექსპერიმენტი დასრულდა. დღეს მას თან ახლავს მრავალი ამბავი, რომელიც ათეულობით ჩატ-რუმშია მოთხრობილი. პროექტში შექმნილი თითოეული ხელოვნების ნიმუში ასობით ახლით იყო დაფარული, რომელთაგან მხოლოდ რამდენიმე დარჩა საბოლოო ტილოზე.

მაგრამ ყველაზე გასაკვირი, ალბათ, ის არის, რომ, მიუხედავად ანონიმურობისა და აკრძალვების არარსებობისა, საბოლოო ტილოზე არ იყო რასისტული ან მიზანთროპული სიმბოლოები. ეს იყო ხელოვნების, სიცოცხლისა და სიკვდილის მშვენიერი წრე. და ის არ იყო პირველი ჩვენს ისტორიაში.

მრავალი ათასწლეულის წინ, როდესაც კაცობრიობა (ნამდვილი და არა მხოლოდ Reddit-ზე) ჯერ კიდევ საწყის ეტაპზე იყო, ინდუისტური ფილოსოფოსები ვარაუდობდნენ, რომ ცა შედგებოდა სამი კონკურენტი, მაგრამ აუცილებელი ღვთაებისგან: ბრაჰმა შემოქმედი, ვიშნუ მცველი, და შივა- გამანადგურებელი.

ერთი მათგანის გარეშეც კი სამყარო ვერ იმუშავებს. სინათლე რომ იყოს, სიბნელე უნდა იყოს. სიცოცხლის არსებობისთვის საჭიროა სიკვდილი. შემოქმედებისა და ხელოვნებისთვის უნდა იყოს განადგურება.

პროექტის რამდენიმე დღემ აჩვენა, რომ ეს მიდგომა წინასწარმეტყველური აღმოჩნდა. ყველაზე წარმოუდგენელი გზით, Reddit-მა დაამტკიცა, რომ შექმნა სამივე კომპონენტის არსებობას მოითხოვს.

საბოლოო ტილო

ფეისბუქი

Twitter

ჯიბე

LinkedIn

ფბ მესენჯერი

არ შეიძლება ითქვას, რომ იუმორის დღეს კორპორატიული ხუმრობების 100% წარმატებული და მიმზიდველია. წელს Reddit-ის ადმინისტრაციამ გამოუშვა Place, ინტერაქტიული 1000 x 1000 პიქსელიანი გრაფიკული ტილო და მასზე მიძღვნილი განყოფილება. ითვლებოდა, რომ საზოგადოების წევრები ერთობლივად დახატავდნენ ამ ტილოს ისე, როგორც მოესურვებოდათ. მაგრამ შედეგად, იგი გადაიზარდა ბრძოლაში ადგილისთვის, ზოგჯერ გადაიზარდა ფილოსოფიურ დაპირისპირებაში. ჩვეულებრივი ხატვის სავარჯიშო ამაღელვებელ სოციალურ ექსპერიმენტად იქცა. სიუჟეტი თავიდან ბოლომდე დოკუმენტირებული იყო Sudoscript ბლოგის მიერ.

ადგილის წესები მარტივი იყო. თითოეულ მონაწილეს შეეძლო აირჩიოს ერთი პიქსელი 16 ფერიდან და განათავსოს იგი ტილოზე სადმე. თქვენ შეგეძლოთ იმდენი პიქსელის განთავსება, რამდენიც გინდოდათ, მაგრამ თითოეულ განთავსებას შორის უნდა დაელოდოთ 5 წუთი. 72 საათის შემდეგ ეს ძალიან მარტივი წესებიგამოიწვია საოცარი კოლექტიური ტილოს შექმნა:

ზემოთ ხილული თითოეული პიქსელი ხელით იყო განთავსებული. ყოველი ხატი, ყოველი დროშა, ყოველი მემი მტკივნეულად შეიქმნა ათასობით ადამიანის მიერ, რომელთაც არაფერი ჰქონდათ საერთო, გარდა ინტერნეტის.

შექმნის დროს იყო უამრავი დრამა, იდეა, ჩხუბი, ომებიც კი. მაგრამ ზოგადად, ადგილის ისტორია არის მარადიული დრამა სამი ძალის შესახებ, რომელიც კაცობრიობას სჭირდება ტექნოლოგიების შესაქმნელად და შესაქმნელად.

შემქმნელები

ჯერ შემქმნელები იყვნენ. ესენი იყვნენ მხატვრები, რომლებისთვისაც ცარიელი ტილო დაუძლეველ შესაძლებლობად ჩანდა. ადრეული შემსრულებლები ათავსებდნენ პიქსელებს შემთხვევით, მხოლოდ იმის დასანახად, თუ რა შეიძლება გაკეთდეს. პირველ წუთებში გამოჩნდა პირველი ესკიზები. უხეში და გაუაზრებელი, ისინი მღვიმეების გამოქვაბულის ნახატებს ჰგავდნენ.

შემქმნელებმა მაშინვე დაინახეს, თუ რა ძალასა და პოტენციალს მალავენ პიქსელები. მაგრამ მარტო მუშაობით, მათ შეეძლოთ თითო პიქსელის განთავსება ყოველ 5 ან 10 წუთში. შემოქმედება აზრიანი ნახატისამუდამოდ წაიღებდა. რაღაცის დასახატად მათ ერთად მოუწიათ მუშაობა.

შემდეგ ვიღაცას გაუჩნდა ბრწყინვალე იდეა, რომ გამოეყენებინა ბადე ნახატზე, რომელიც გადაფარავდა ნახატს და აჩვენებს, სად უნდა იყოს შემდეგი პიქსელები. პირველი, ვინც გაიარა ეს ექსპერიმენტი, იყო ინგლისურენოვანი ინტერნეტ დიკბუტის ცნობილი მემი. და ადგილის მაცხოვრებლები შეუდგა მუშაობას: დიკბატი მატერიალიზდა რამდენიმე წუთში ტილოს ქვედა მარცხენა კუთხეში. კოლექტიური შემოქმედების პირველი ქმნილება ადგილზე გამოჩნდა.

შემდეგ, როდესაც შემქმნელები ცოტათი დათვრნენ შესაძლებლობებზე, გამოჩნდა Pokemon Charmander, რომელშიც წევრი საკმაოდ მალე გამოჩნდა ფეხის ნაცვლად. და დაიწყო პირველი კონფლიქტი: ზოგიერთი შემქმნელი გულმოდგინედ ცდილობდა შეურაცხმყოფელი ნახატების გაწმენდას, მაგრამ სხვები დაჟინებით ამატებდნენ უცენზურო ნივთებს.

შემქმნელები ფუნდამენტური ფილოსოფიური პრობლემის წინაშე დგანან: ზედმეტი თავისუფლება იწვევს ქაოსს. კრეატიულობას ისევე სჭირდება შეზღუდვა, როგორც თავისუფლებას.

დამცველები

Place-ს ჰყავდა განსხვავებული ტიპის მომხმარებელი, რომელსაც ზუსტად ამ პრობლემასთან უნდა გაუმკლავდეს. მაგრამ მათ დაიწყეს უფრო პრიმიტიული მიზნებით: სამყაროს დაპყრობა. ფერის მიხედვით ფრაქციებად დაყოფით, ისინი ცდილობდნენ ადგილის დაკავებას. ერთ-ერთი პირველი იყო ლურჯი კუთხე. ქვედა მარჯვენა კუთხეში გაჩნდა და ჭირივით გავრცელდა.

მეორე ჯგუფმა დააარსა წითელი კუთხე ტილოს მოპირდაპირე მხარეს, ისინი პოლიტიკური მემარცხენეობისკენ დაიხარეს. სხვა ჯგუფმა, სახელად მწვანე ბადე, დახატა ტილო პიქსელის მეშვეობით - მწვანე უჯრედები შერეული თეთრით. ვინაიდან მათ მხოლოდ ნახევარი პიქსელის დახატვა უწევდათ, ისინი უფრო ეფექტური იყვნენ ვიდრე სხვა ფრაქციები.

დიდი ხანი არ გასულა, სანამ ფრაქციები შემქმნელებს დაუპირისპირდნენ. ჩარმანდერი ბრძოლის ერთ-ერთი პირველი ობიექტი გახდა. ცისფერმა კუთხემ დაიწყო პოკემონის ლურჯი პიქსელებით დახატვა და შემქმნელები "ფალიური ომებიდან" (რომლებიც უფრო მეტ წევრს იზიდავს) გადავიდნენ უფრო სერიოზულ საფრთხეზე. მათ ბრძოლა მიიღეს და ყველა ლურჯი პიქსელი თავისით დახატეს. მაგრამ რაოდენობრივი უპირატესობა არ იყო მათ სასარგებლოდ.

ასე რომ, შემქმნელები ჩაბარდნენ გამარჯვებულის წყალობას და რატომღაც ამან დააზარალა ბლუზის გრძნობები. მათ შორის გამოჩნდა ეჭვი მათ როლზე ადგილის სამყაროში. „ჩვენი ტალღა აუცილებლად დაფარავს მთელ სამყაროს, კიდედან კიდემდე, თუ ჩვენ შევეხებით სხვა ხელოვნებას“, - იკითხა ჯგუფის ერთ-ერთმა წევრმა.

თითოეულ ფრაქციას შეექმნა ეს საკითხი. და ყველამ გადაწყვიტა სხვა ნახატების შენახვა. ასე რომ, ფერადმა ტალღებმა დაიწყეს დენა ნახატების ირგვლივ მათზე დახატვის გარეშე.

ეს იყო გარდამტეხი მომენტი. უაზრო ფერადი ფრაქციები გახდნენ სასარგებლო დამცველები.

მაგრამ ეს არ არის ბედნიერი დასასრული

საბოლოოდ, დაუოკებელი ფერის ტალღები შეჩერდა და შემქმნელებს შეეძლოთ შემოქმედებითობას დაუბრუნდნენ. ნახატები უფრო და უფრო რთულდებოდა. გამოჩნდა პიქსელებით დაწერილი ტექსტები.

შემქმნელები შეიკრიბნენ მცირე ჯგუფებად, შექმნეს ქვესექციები Reddit-ზე, სადაც მათ შეეძლოთ ნახატების და სტრატეგიის პროექტების განხილვა. ერთ-ერთმა ყველაზე წარმატებულმა ჯგუფმა დახატა დავალების პანელი Windows 95-ის სტილში. კიდევ ერთმა დახატა ადგილი გულებით.

შემდეგ მოვიდა ვან გოგი.

მაგრამ ყველაფერი ასე მარტივი არ იყო. დამცველები გადაიქცნენ ტირანებად, კარნახობდნენ ნახატების სტილს. ისინი წყვეტენ რა შეიძლება დახატოს და რა არა. ფრაქციებმა დაიწყეს მომხმარებლების დაყოფა, წვეულებების მოწოდებით, ამასობაში შემქმნელები ახალი იდეების დამტკიცებას ელოდნენ.

მცველებს შორის ბრძოლები სულ უფრო გამწვავდა. Twitch-ის ერთ-ერთმა სტრიმპერმა მოუწოდა თავის მიმდევრებს დაესხას BLU-ს. შემუშავდა საბრძოლო სტრატეგიები. პროვოკაციებიც კი იყო: იმავე ფერის თაყვანისმცემლები საკუთარ ტერიტორიაზე მტრის ფერის პიქსელებს ხატავდნენ, რათა საპასუხო შეტევის საბაბი ჰქონოდათ. სანამ ფრაქციები ერთმანეთს ებრძოდნენ, შემქმნელებმა აღმოაჩინეს, რომ ახალი ნახატების ადგილი არ იყო.

დროშებმა ამოსვლა დაიწყეს სხვა და სხვა ქვეყნებიროდესაც ისინი იზრდებიან, ისინი აუცილებლად ეჯახებიან ერთმანეთს. მაგალითად, გერმანიისა და საფრანგეთის დროშები ერთმანეთს "არავის" ტერიტორიაზე შეეჯახა.

მსოფლიო თითქოს ომის ზღვარზე იყო. ყველა მხარე ცდილობდა კონფლიქტის მოგვარებას დიპლომატიური გზით. შემოქმედთა და დამცველთა ლიდერები საუბრობდნენ, მაგრამ, როგორც წესი, ურთიერთბრალდებებით მთავრდებოდა.

ადგილს სჭირდებოდა ბოროტმოქმედი, რომლის წინააღმდეგაც ყველას შეეძლო გაერთიანება.

გამანადგურებლები

სიცარიელე მოვიდა.

ეს დაიწყო 4chan-ით, მსოფლიოში ყველაზე ცნობილი გამოსახულების დაფით. მასში მობინადრე პრანკერებმა შეამჩნიეს რა ხდებოდა Reddit-ზე და ვერ გადიოდნენ. ისინი გახდნენ სიცარიელე.

ადგილის ცენტრში დაიწყო შავი პიქსელების ლაქა. თავდაპირველად ფრაქციები დიპლომატიური გზით ცდილობდნენ პაქტის დადებას Void-თან. მაგრამ მათ ვერ მოახერხეს, Void სხვაგვარად მოიქცა. ის არ იყო ერთ-ერთი დამცველი, ის არ იცავდა ხელოვნებას. მისი მიმდევრები ქადაგებდნენ, რომ სიცარიელე ყველაფერს შთანთქავდა. ისინი არ ქმნიდნენ გვერდებს, მათ მხოლოდ სურდათ მთელი სამყარო შავად დაეხატათ.

ზუსტად ის დარტყმა აკლდა პლეისს. საერთო საფრთხის წინაშე მყოფი შემქმნელები და დამცველები კიდევ ერთხელ გაერთიანდნენ ხელოვნების გადასარჩენად. მაგრამ Void-ის მნიშვნელობა არ იყო მხოლოდ განადგურება, რატომღაც მან წარმოშვა ახალი, უკეთესი ხელოვნება.

მაგალითად, ცენტრში მდებარეობა ერთ-ერთი ყველაზე სადავო იყო შემქმნელებს შორის. და როდესაც ის გაშავდა, დამცველები მიხვდნენ, რომ მათ უნდა შეექმნათ უკეთესი იდეა, რომელიც საკმარის მიმდევრებს მოიცავდა შავ ურჩხულთან საბრძოლველად. ერთ-ერთი ასეთი იდეა იყო აშშ-ს დროშა.

Place-ის ბოლო დღეს შეიქმნა ყველაზე წარმოუდგენელი კოალიცია სიცარიელესთან საბრძოლველად - ტრამპის ფანები და ტრამპის მოწინააღმდეგეები, რესპუბლიკელები და დემოკრატები, ამერიკელები და ევროპელები.

მალე Reddit-ის ექსპერიმენტი დასრულდა. ბოლო ტილოზე არ იყო არც ერთი რასისტული ნახატი, არც ერთი სიძულვილის სიმბოლო.

Twitter

ჯიბე

LinkedIn

ფბ მესენჯერი

Reddit-მა პირველი აპრილის პატივსაცემად გახსნა თვითგამოხატვის გვერდი, მაგრამ პროექტი, რომელიც ხუმრობით შეიქმნა, გახდა ერთგვარი კედელი კოლექტიური წარწერებისთვის მთელი მსოფლიოდან, სადაც ნაჩვენებია, თუ რა კვალი უნდა დატოვონ ისტორიაში.

1 აპრილს Reddit-მა გამოუშვა პროექტი Place, გვერდი ცარიელი ტილოებით, რომელზეც ფორუმის თითოეულ მომხმარებელს შეეძლო ნებისმიერი სურათის დახატვა. მხატვრებს ჰქონდათ შეზღუდვები: მათ შეეძლოთ 16 ფერიდან მხოლოდ ერთი პიქსელის დახატვა ყოველ ხუთ წუთში, ასევე შეზღუდული იყო ტილოს ზომაც. დახატული პიქსელების თავზე შეგიძლიათ სხვების დახატვა (და შემდეგ პირველ ავტორს შეუძლია კვლავ დახატოს საკუთარი პიქსელი მოწინააღმდეგის პიქსელის თავზე), რის გამოც სურათების ავტორები აპრიორი კონფლიქტში არიან. როგორც ტილოს აღწერილობაშია აღნიშნული, პროექტი შექმნილია ერთობლივი შემოქმედებისთვის - ”თითოეულ თქვენგანს შეუძლია შექმნას რაღაც ინდივიდუალური. ერთად თქვენ შეგიძლიათ შექმნათ რაღაც მეტი.”

პროექტის დაწყებისას ყველამ სიტყვასიტყვით აიღო ტილო - მასზე ყველა პიქსელი ივსებოდა. თავდაპირველად, მომხმარებლებმა უბრალოდ შეახვიეს ფერი თავისუფალ პიქსელებში, მაგრამ შემდეგ დაიწყო გუნდების ჩამოყალიბება, რომლებმაც დაიწყეს ერთ-ერთი უმარტივესი შესაძლო იდეის დახატვა, რომელიც პოულობს თანამოაზრეებს - სახელმწიფო დროშებს. რაც უფრო მეტი მომხმარებელი მუშაობდა ტილოზე, მით უფრო საინტერესო და რთული იდეებიმოვიდა მათ გონებაში. და "ადგილი" განვითარდა პირველი აპრილის პროექტიდან ადგილამდე, სადაც მომხმარებლები მთელი მსოფლიოდან იკრიბებიან რეალურ საზოგადოებებში, რათა აჩვენონ რაღაც მსოფლიოს და მხარი დაუჭირონ მათ შექმნას რეიდერების ჯგუფებისგან, რომლებსაც ნამდვილად სურთ რაღაცის დახატვა. საკუთარი ნახატის.

მოათავსეთ ოპერაციის პირველ საათებში

„The Place“ გახდა ონლაინ სტიკერ დაფა, თუმცა თითოეული მათგანი დიდი სირთულეებით იქმნება. მაგალითად, 48 x 68 პიქსელიანი ლინუქსის ლოგოს დახატვასა და მისი სკუტერებისგან დასაცავად, საჭიროა 3264 ადამიანი ერთდროულად დახატოს.

მომხმარებლები ერთიანდებიან იმ იდეების განსახორციელებლად, რომლებიც უფრო მცირე და მარტივია, მაგრამ მაინც ძალიან გუნდზე ორიენტირებული, როგორიცაა გულების ეს რიგი სხვადასხვა ქვეყნის დროშებით (და არა მხოლოდ): ყველა პასუხისმგებელია „თავის“ გულზე, მაგრამ ყველა ერთად ადამიანი უნებურად ქმნის ერთს. გუნდი.

და სხვები წერენ ტექსტის მთელ ტილოებს, მაგალითად, თაყვანისმცემელთა ამ ჯგუფის მსგავსად. Ვარსკვლავური ომები", რომელმაც დაწერა და ინარჩუნებს უზენაესი კანცლერის პალპატინის ცნობილ მონოლოგს სით დართ პლაგეისის შესახებ კოსმოსური საგის მესამე ეპიზოდიდან.

თუმცა, ზოგიერთი მომხმარებელი ჩიოდა, რომ პროექტის მონაწილეებმა საკუთარი თავის ნაცვლად ბოტები „დასვეს“, რომლებიც ავტომატურად ახლებენ ავტორის მიერ დაკავებულ პიქსელს ყოველ ხუთ წუთში ერთხელ. იმისდა მიუხედავად, რომ თითოეული პიქსელის დახატვისას მომხმარებელმა უნდა გაიმეოროს მოქმედებების ნაკრები (მაგალითად, გარკვეული ფერის არჩევა), ზოგიერთმა შეძლო დამცავი მექანიზმის გვერდის ავლით და შექმნა ბოტები, რომლებიც მათთვის სურათებს ხატავენ.

თუმცა არიან ისეთებიც, რომლებიც ჯერ კიდევ ქმნიან სპეციალურ ძაფებს და ცდილობენ მოუწოდონ თანამოაზრე ადამიანებს, რომლებიც დაგეხმარებიან ხატვაში და მომავალ თაობებს დაუტოვებენ რაღაცის მსგავსს... რიკ სანჩესს რიკ და მორტის მულტფილმიდან. სერიოზულად? მართლა ბოტები არ არიან?

72 საათიანი მუშაობის შემდეგ პროექტი დაიხურა. რესურსის ადმინისტრაციამ მადლობა გადაუხადა ყველას მონაწილეობისთვის და იმისთვის, რომ ხალხი გაერთიანდა „რაღაც მეტის შესაქმნელად“.

Reddit ხშირად ხდება ადგილი სხვადასხვასთვის სოციალური აქტივობები. მაგალითად, ახლახანს რესურსის მოწყენილმა მომხმარებლებმა გადაწყვიტეს ეკითხათ, როგორია ყოველდღე ღიმილით გაღვიძება. მანამდე კი Reddit-ის მკითხველებმა ერთმანეთს გაუზიარეს ისტორიები გოგონების შესახებ. პოპულარულ რესურსზე არა მხოლოდ ანონიმური ადამიანები სხედან: ცოტა ხნის წინ მსახიობი რამდენიმე საათის განმავლობაში პასუხობდა მომხმარებლების კითხვებს ფილმ "Trainspotting"-ის შესახებ.

დასაწყისისთვის, უაღრესად მნიშვნელოვანი იყო პირველი აპრილის პროექტის მოთხოვნების დადგენა, რადგან ის უნდა გაშვებულიყო „გადატვირთვის“ გარეშე, რათა Reddit-ის ყველა მომხმარებელს დაუყოვნებლივ ჰქონოდა მასზე წვდომა. თავიდანვე იდეალურად რომ არ ემუშავა, ძნელად თუ მიიპყრობდა ხალხის დიდი რაოდენობის ყურადღებას.

    "დაფა" უნდა იყოს 1000x1000 ფილა, რათა გამოიყურებოდეს ძალიან დიდი.

    ყველა კლიენტი უნდა იყოს სინქრონიზებული და აჩვენოს დაფის იგივე მდგომარეობა. ყოველივე ამის შემდეგ, თუ სხვადასხვა მომხმარებლებს აქვთ სხვადასხვა ვერსიებიმათ გაუჭირდებათ ურთიერთობა.

    თქვენ უნდა მხარი დაუჭიროთ მინიმუმ 100 000 მომხმარებელს ერთდროულად.

    მომხმარებლებს შეუძლიათ ყოველ ხუთ წუთში ერთი კრამიტის განთავსება. აქედან გამომდინარე, აუცილებელია შენარჩუნდეს განახლების საშუალო სიჩქარე 100,000 ფილა ხუთ წუთში (333 განახლება წამში).

    პროექტი უარყოფითად არ უნდა იმოქმედოს საიტის სხვა ნაწილებისა და ფუნქციების მუშაობაზე (თუნდაც r/Place-ზე მაღალი ტრეფიკია).

  • მოულოდნელი შეფერხებების ან წარუმატებლობის შემთხვევაში, უნდა იყოს მოქნილი კონფიგურაცია. ანუ, თქვენ უნდა შეგეძლოთ დაფის ზომისა და დაშვებული ნახაზის სიხშირის რეგულირება, თუ მონაცემთა რაოდენობა ძალიან დიდია ან განახლების სიჩქარე ძალიან მაღალია.

Backend

განხორციელების გადაწყვეტილებები

ბექენდის შექმნის მთავარი სირთულე იყო დაფის მდგომარეობის ჩვენების სინქრონიზაცია ყველა კლიენტისთვის. გადაწყდა, რომ კლიენტებმა მოესმინათ კრამიტის განთავსების მოვლენები რეალურ დროში და დაუყოვნებლივ მოითხოვონ მთელი დაფის მდგომარეობა. მისაღებია ოდნავ მოძველებული სრული მდგომარეობა, თუ თქვენ გამოიწერთ განახლებებს სრული მდგომარეობის გენერირებამდე. როდესაც კლიენტი იღებს სრულ მდგომარეობას, ის აჩვენებს ყველა ფილას, რომელიც მიიღო ლოდინის დროს; ყველა შემდგომი ფილა უნდა იყოს ნაჩვენები დაფაზე მიღებისთანავე.


იმისათვის, რომ ეს სქემა იმუშაოს, მოთხოვნა სრული მდგომარეობადაფები უნდა იმუშაოს რაც შეიძლება სწრაფად. თავიდან გვინდოდა მთელი დაფა ერთ ხაზზე შეგვენახა კასანდრაში და ყოველი მოთხოვნა უბრალოდ წაეკითხა ეს ხაზი. ამ მწკრივის თითოეული სვეტის ფორმატი იყო:


(x, y): („დროის შტამპი“: ეპოქები, „ავტორი“: მომხმარებლის_სახელი, „ფერი“: ფერი)

მაგრამ რადგან დაფა შეიცავს მილიონ ფილას, დაგვჭირდა მილიონი სვეტის წაკითხვა. ჩვენს საწარმოო კლასტერზე ამას 30 წამამდე დასჭირდა, რაც მიუღებელი იყო და შეიძლება გამოიწვიოს კასანდრაზე გადაჭარბებული დატვირთვა.


შემდეგ გადავწყვიტეთ მთელი დაფა შეგვენახა რედისში. ჩვენ ავიღეთ მილიონი ოთხბიტიანი რიცხვის ბიტის ველი, რომელთაგან თითოეულს შეეძლო ოთხბიტიანი ფერის დაშიფვრა, ხოლო x და y კოორდინატები განისაზღვრა ოფსეტით (ოფსეტი = x + 1000y) ბიტის ველში. დაფის სრული მდგომარეობის მისაღებად, საჭირო იყო მთელი ბიტის ველის წაკითხვა.


ფილების განახლება შესაძლებელია მნიშვნელობების განახლებით კონკრეტულ ოფსეტებზე (არ არის საჭირო დაბლოკვა ან მთელი წაკითხვის/განახლების/ჩაწერის პროცედურის გაკეთება). მაგრამ ყველა დეტალი მაინც უნდა იყოს შენახული კასანდრაში, რათა მომხმარებლებმა გაარკვიონ, ვინ და როდის გამოაქვეყნა თითოეული ფილა. ჩვენ ასევე ვგეგმავდით კასანდრას გამოყენებას დაფის აღსადგენად, როდესაც რედისი ჩამოვარდა. მისგან მთელი დაფის წაკითხვას 100 ms-ზე ნაკლები დასჭირდა, რაც საკმაოდ სწრაფი იყო.


აი, როგორ ვინახავდით ფერებს Redis-ში, მაგალითად, 2x2 დაფის გამოყენებით:



ჩვენ ვნერვიულობდით, რომ შეიძლება შეგვექმნა წაკითხვის გამტარუნარიანობა Redis-ზე. თუ ბევრი კლიენტი აკავშირებდა ან ახლდა ერთდროულად, მაშინ ყველა მათგანი ერთდროულად აგზავნიდა მოთხოვნას დაფის სრული მდგომარეობის მისაღებად. ვინაიდან დაფა იყო საერთო გლობალური სახელმწიფო, აშკარა გამოსავალი იყო ქეშირების გამოყენება. ჩვენ გადავწყვიტეთ ქეში ჩაგვეყენებინა CDN დონეზე (სწრაფად), რადგან მისი დანერგვა უფრო ადვილი იყო და ქეში ყველაზე ახლოს იყო კლიენტებთან, რამაც შეამცირა რეაგირების დრო.


სრული დაფის სტატუსის მოთხოვნები ქეშირებული იყო Fastly-ის მიერ წამში დროის ამოწურვით. Თავიდან რომ ავიცილოთ დიდი რიცხვიითხოვს, როდესაც ვადა ამოიწურება, ჩვენ გამოვიყენეთ stale-while-revalidate header. Fastly მხარს უჭერს დაახლოებით 33 POP-ს, რომლებიც დამოუკიდებლად ქეშირებენ, ამიტომ ველოდით, რომ მივიღებდით 33-მდე სრული დაფის სტატუსის მოთხოვნას წამში.


ყველა კლიენტისთვის განახლებების გამოსაქვეყნებლად, ჩვენ გამოვიყენეთ ჩვენი ვებსოკეტის სერვისი. ჩვენ ადრე წარმატებით ვიყენებდით Reddit-ის გასაძლიერებლად. Live 100000-ზე მეტ ერთდროულად მომხმარებელთან ერთად პირდაპირი პირადი შეტყობინების შეტყობინებებისა და სხვა ფუნქციებისთვის. მომსახურებაც იყო ქვაკუთხედიჩვენი წარსული პირველი აპრილის პროექტები - The Button and Robin. r/Place-ის შემთხვევაში, კლიენტებმა მხარი დაუჭირეს ვებსოკეტის კავშირებს, რათა მიეღოთ რეალურ დროში განახლებები ფილების განთავსებაზე.

API

დაფის სრული მდგომარეობის მიღება


თავდაპირველად თხოვნამ მიიღო Fastly. თუ მას ჰქონდა დაფის მოქმედი ასლი, მაშინ იგი დაუყოვნებლივ დააბრუნებდა მას Reddit აპლიკაციის სერვერებთან დაკავშირების გარეშე. თუ არა, ან ასლი ძალიან ძველი იყო, მაშინ Reddit-ის აპლიკაციამ წაიკითხა სრული დაფა Redis-დან და დააბრუნა Fastly-ში, რათა ქეშებულიყო და დაბრუნებულიყო კლიენტს.




გთხოვთ გაითვალისწინოთ, რომ მოთხოვნის სიჩქარე არასოდეს აღწევდა 33 წამში, ანუ Fastly-ით ქეშირება ძალიან იყო ეფექტური ინსტრუმენტიიცავს Reddit აპს უმეტესი მოთხოვნებისგან.



და როდესაც მოთხოვნამ მიაღწია განაცხადს, რედისმა ძალიან სწრაფად უპასუხა.

კრამიტის ნახაზი


კრამიტის დახატვის ეტაპები:

  1. მომხმარებლის მიერ განთავსებული ბოლო კრამიტის დროის ანაბეჭდი იკითხება კასანდრადან. თუ ხუთ წუთზე ნაკლები იყო, მაშინ არაფერს ვაკეთებთ და შეცდომა უბრუნდება მომხმარებელს.
  2. კრამიტის დეტალები ეწერება რედისს და კასანდრას.
  3. მიმდინარე დრო ჩაწერილია კასანდრაში, როგორც ბოლო დროს, როდესაც მომხმარებელმა მოათავსა ფილა.
  4. ვებსოკეტის სერვისი აგზავნის შეტყობინებას ახალი კრამიტის შესახებ ყველა დაკავშირებულ კლიენტს.

მკაცრი თანმიმდევრულობის შესანარჩუნებლად, კასანდრაში ყველა ჩაწერა და წაკითხვა შესრულდა თანმიმდევრული დონის QUORUM-ის გამოყენებით.


ფაქტობრივად, ჩვენ გვქონდა რბოლა აქ, რომლის დროსაც მომხმარებლებს შეეძლოთ რამდენიმე ფილების ერთდროულად განთავსება. 1-3 ეტაპებზე არ იყო დაბლოკვა, ამიტომ ფილების დახატვის ერთდროულმა მცდელობებმა შეიძლება გაიაროს ტესტი პირველ ეტაპზე და დახაზულიყო მეორეში. როგორც ჩანს, ზოგიერთმა მომხმარებელმა იპოვა ეს შეცდომა (ან იყენებდა ბოტებს, რომლებიც იგნორირებას უკეთებდნენ მოთხოვნის გაგზავნის სიხშირის ლიმიტს) - და შედეგად, დაახლოებით 15000 ფილა განთავსდა მისი გამოყენებით (~0,09% საერთო).


მოთხოვნის სიჩქარე და პასუხის დრო, როგორც ეს იზომება Reddit აპლიკაციით:



ფილების განლაგების პიკი იყო თითქმის 200 წამში. ეს არის ჩვენი გამოთვლილი ლიმიტის ქვემოთ 333 ფილა/წმ (საშუალოდ, თუ ვივარაუდებთ, რომ 100,000 მომხმარებელი განათავსებს თავის ფილებს ყოველ ხუთ წუთში).


დეტალების მიღება კონკრეტულ ფილაზე


კონკრეტული ფილების მოთხოვნისას, მონაცემები პირდაპირ კასანდრადან იკითხებოდა.


მოთხოვნის სიჩქარე და პასუხის დრო, როგორც ეს იზომება Reddit აპლიკაციით:



ეს მოთხოვნა ძალიან პოპულარული აღმოჩნდა. კლიენტის რეგულარული მოთხოვნის გარდა, ადამიანებს აქვთ დაწერილი სკრიპტები, რომ მოიძიონ მთელი დაფა ერთი ფილა ერთდროულად. ვინაიდან ეს მოთხოვნა არ იყო ქეშირებული CDN-ში, ყველა მოთხოვნას ემსახურებოდა Reddit აპლიკაცია.



ამ თხოვნებზე რეაგირების დრო საკმაოდ მოკლე იყო და შენარჩუნებული იყო იმავე დონეზე პროექტის მთელი ცხოვრების განმავლობაში.

ვებსოკეტები

ჩვენ არ გვაქვს ცალკეული მეტრიკა, რომელიც აჩვენებს, თუ როგორ იმოქმედა r/Place-მა ვებსოკეტის სერვისის მუშაობაზე. მაგრამ ჩვენ შეგვიძლია შევაფასოთ მნიშვნელობები პროექტის დაწყებამდე და მისი დასრულების შემდეგ მონაცემების შედარებით.


ვებსოკეტის სერვისთან კავშირების საერთო რაოდენობა:



საბაზისო დატვირთვა r/Place-ის გაშვებამდე იყო დაახლოებით 20000 კავშირი, პიკი იყო 100000 კავშირი. ასე რომ, პიკში ჩვენ ალბათ გვყავდა დაახლოებით 80,000 მომხმარებელი დაკავშირებული r/Place-თან ერთდროულად.


ვებსოკეტის სერვისის გამტარუნარიანობა:



r/Place-ზე პიკური დატვირთვის დროს, websocket სერვისი გადასცემდა 4 გბ/წმ-ზე მეტს (150 Mbps თითო ინსტანციაზე, სულ 24 შემთხვევა).

Frontend: ვებ და მობილური კლიენტები

Place-ის ფრონტ-ენდის შექმნის პროცესში ჩვენ მოგვიწია მრავალი რთული ამოცანის გადაჭრა, რომლებიც დაკავშირებულია პლატფორმის განვითარებასთან. ჩვენ გვინდოდა, რომ პროექტი ერთნაირად მუშაობდეს ყველა ძირითად პლატფორმაზე, მათ შორის დესკტოპ კომპიუტერებზე და მობილურ მოწყობილობებზე iOS და Android-ზე.


მომხმარებლის ინტერფეისს სამი მნიშვნელოვანი ფუნქცია უნდა შეესრულებინა:

  1. დაფის სტატუსის ჩვენება რეალურ დროში.
  2. ნება მიეცით მომხმარებლებს ურთიერთქმედონ დაფასთან.
  3. იმუშავეთ ყველა პლატფორმაზე, მათ შორის მობილურ აპლიკაციებზე.

ინტერფეისის მთავარი ობიექტი იყო ტილო და Canvas API იდეალური იყო მისთვის. ჩვენ გამოვიყენეთ ელემენტი ზომით 1000x1000 და თითოეული ფილა დახატული იყო როგორც ერთი პიქსელი.

ტილოზე ნახატი

ტილო რეალურ დროში უნდა ასახავდეს დაფის მდგომარეობას. საჭირო იყო მთელი დაფის დახატვა, როდესაც გვერდი ჩაიტვირთა და დასრულებულიყო ნახატის განახლებები, რომლებიც მოდიოდა ვებ სოკეტებიდან. ტილოს ელემენტი, რომელიც იყენებს CanvasRenderingContext2D ინტერფეისს, შეიძლება განახლდეს სამი გზით:

  1. დახატეთ არსებული სურათი ტილოზე drawImage()-ით.
  2. ფორმების დახატვა ფორმის ნახატის სხვადასხვა მეთოდის გამოყენებით. მაგალითად, fillRect() ავსებს მართკუთხედს გარკვეული ფერით.
  3. შექმენით ImageData ობიექტი და დახაზეთ იგი ტილოზე putImageData()-ით.

პირველი ვარიანტი არ შეგვეფერა, რადგან არ გვქონდა დაფა მზა გამოსახულების სახით. იყო ვარიანტები 2 და 3. უმარტივესი გზა იყო ცალკეული ფილების განახლება fillRect()-ის გამოყენებით: როდესაც განახლება მოდის websocket-ში, უბრალოდ დახაზეთ 1x1 მართკუთხედი პოზიციაზე (x, y). ზოგადად, მეთოდი მუშაობდა, მაგრამ არ იყო ძალიან მოსახერხებელი ხატვისთვის საწყისი მდგომარეობადაფები. putImageData() მეთოდი ბევრად უკეთესი იყო: ჩვენ შეგვიძლია განვსაზღვროთ თითოეული პიქსელის ფერი ერთ ImageData ობიექტში და ერთდროულად დავხატოთ მთელი ტილო.

დაფის საწყისი მდგომარეობის დახატვა

putImageData()-ის გამოყენება მოითხოვს დაფის მდგომარეობის განსაზღვრას Uint8ClampedArray-ის სახით, სადაც თითოეული მნიშვნელობა არის რვა ბიტიანი ხელმოუწერელი რიცხვი 0-დან 255-მდე. თითოეული მნიშვნელობა წარმოადგენს რაღაც ფერის არხს (წითელი, მწვანე, ლურჯი, ალფა) და თითოეულ პიქსელს სჭირდება. ოთხი ელემენტი მასივში. 2x2 ტილო მოითხოვს 16-ბაიტიან მასივს, სადაც პირველი ოთხი ბაიტი წარმოადგენს ტილოს ზედა მარცხენა პიქსელს, ხოლო ბოლო ოთხი ბაიტი წარმოადგენს ქვედა მარჯვენას.


აი, როგორ უკავშირდება ტილოს პიქსელები მათ Uint8ClampedArray გამოსახულებებს:



ჩვენი პროექტის ტილოსთვის დაგვჭირდა ოთხი მილიონი ბაიტის მასივი - 4 მბ.


უკანა ნაწილში, დაფის მდგომარეობა ინახება ოთხბიტიან ველად. თითოეული ფერი წარმოდგენილია რიცხვით 0-დან 15-მდე, რაც საშუალებას გვაძლევს შეგვეკრა ორი პიქსელი თითოეულ ბაიტში. კლიენტის მოწყობილობაზე გამოსაყენებლად, თქვენ უნდა გააკეთოთ სამი რამ:

  1. კლიენტს გადასცეთ ორობითი მონაცემები ჩვენი API-დან.
  2. ამოალაგეთ მონაცემები.
  3. გადაიყვანეთ 4-ბიტიანი ფერები 32-ბიტიანში.

ორობითი მონაცემების გადასატანად, ჩვენ გამოვიყენეთ Fetch API იმ ბრაუზერებში, რომლებიც მხარს უჭერენ მას. და მათ, ვინც არ უჭერს მხარს, გამოიყენება XMLHttpRequest answerType-ზე დაყენებულია "arraybuffer"-ზე.


API-დან მიღებული ბინარული მონაცემები შეიცავს ორ პიქსელს თითოეულ ბაიტში. ყველაზე პატარა TypedArray კონსტრუქტორი, რომელიც ჩვენ გვქონდა, გვაძლევს საშუალებას ვიმუშაოთ ბინარულ მონაცემებთან ერთი ბაიტიანი ერთეულების სახით. მაგრამ ისინი უხერხულია კლიენტის მოწყობილობებზე გამოსაყენებლად, ამიტომ ჩვენ გავხსენით მონაცემები, რომ გაგვიადვილდეს მუშაობა. პროცესი მარტივია: ჩვენ ვიმეორებთ შეფუთულ მონაცემებს, ვიღებთ მაღალ და დაბალ ბიტებს და შემდეგ ვაკოპირებთ მათ ცალკეულ ბაიტებად სხვა მასივში.


საბოლოოდ, ოთხბიტიანი ფერები უნდა გადაექცია 32-ბიტიანში.



ImageData სტრუქტურა, რომელიც გვჭირდებოდა putImageData()-ის გამოსაყენებლად ამას მოითხოვს საბოლოო შედეგიიყო Uint8ClampedArray-ის სახით ბაიტებით, რომლებიც კოდირებენ ფერთა არხებს RGBA თანმიმდევრობით. ეს ნიშნავს, რომ ჩვენ უნდა გაგვეკეთებინა კიდევ ერთი გახსნა, თითოეული ფერის დაყოფა არხის კომპონენტურ ბაიტებად და ჩასმა მათ სწორ ინდექსში. არ არის ძალიან მოსახერხებელი პიქსელზე ოთხი ჩაწერის გაკეთება. საბედნიეროდ, იყო სხვა ვარიანტი.


TypedArray ობიექტები არსებითად ArrayBuffer-ის მასივის წარმოდგენებია. აქ არის ერთი სიფრთხილე: რამდენიმე TypedArray ინსტანციას შეუძლია წაიკითხოს და ჩაწეროს ერთი და იგივე ArrayBuffer ინსტანციიდან. წერის ნაცვლად ოთხი ღირებულებარვა-ბიტიან მასივში შეგვიძლია ჩავწეროთ ერთი მნიშვნელობა 32-ბიტიანზე! ჩასაწერად Uint32Array-ის გამოყენებით, ჩვენ შევძელით ადვილად განვაახლოთ კრამიტის ფერები მასივის ერთი ინდექსის უბრალოდ განახლებით. მართალია, ჩვენ უნდა შევინახოთ ჩვენი ფერების პალიტრა ბაიტის შებრუნებული ბაიტით (ABGR) ისე, რომ ბაიტები ავტომატურად მოხვდეს სწორ ადგილებში Uint8ClampedArray-ის გამოყენებით წაკითხვისას.


ვებსოკეტის საშუალებით მიღებული განახლებების დამუშავება

drawRect() მეთოდი კარგად შეეფერებოდა პიქსელ-პიქსელ-პიქსელ განახლებებს, როგორც ისინი მიიღებდნენ, მაგრამ იყო ერთი სისუსტე: განახლებების დიდმა ნაწილმა ერთდროულად შეიძლება გამოიწვიოს ბრაუზერებში ჭუჭყიანი. ჩვენ გვესმოდა, რომ დაფის მდგომარეობის განახლებები შეიძლება ძალიან ხშირად მოხდეს, ამიტომ პრობლემა როგორმე უნდა მოგვარებულიყო.


იმის ნაცვლად, რომ ტილო დაუყოვნებლივ გადაგვეკეთებინა ყოველ ჯერზე, როდესაც მივიღებთ ვებსოკეტის განახლებას, ჩვენ გადავწყვიტეთ, რომ შევქმნათ ის ისე, რომ ვებსოკეტის განახლებები, რომლებიც ერთსა და იმავე დროს მოდის, შესაძლებელი იყოს შეფუთული და ნაყარი რენდერით. ამის მისაღწევად ორი ცვლილება განხორციელდა:

  1. შეწყვიტე drawRect()-ის გამოყენება - აღმოვაჩინეთ მოსახერხებელი გზაგანაახლეთ მრავალი პიქსელი ერთდროულად putImageData()-ით.
  2. ტილოს რენდერის გადატანა requestAnimationFrame ციკლში.

რენდერის ანიმაციის ციკლში შეფუთვით, ჩვენ შევძელით დაუყოვნებლივ ჩაგვეწერა ვებსოკეტის განახლებები ArrayBuffer-ზე, ხოლო რეალური რენდერის გადადება. ყველა websocket განახლება, რომელიც მოდის ჩარჩოებს შორის (დაახლოებით 16 ms) იყო შეფუთული და გაწეული ერთდროულად. requestAnimationFrame-ის გამოყენების წყალობით, თუ რენდერირებას ძალიან დიდი დრო დასჭირდა (16 ms-ზე მეტი), ეს გავლენას მოახდენდა მხოლოდ ტილოს განახლების სიხშირეზე (ვიდრე მთელი ბრაუზერის ეფექტურობის შემცირებას).

ურთიერთქმედება ტილოსთან

მნიშვნელოვანია აღინიშნოს, რომ ტილო საჭირო იყო იმისთვის, რომ მომხმარებლებისთვის უფრო მოსახერხებელი ყოფილიყო სისტემასთან ურთიერთობა. ურთიერთქმედების მთავარი სცენარი არის ფილების განთავსება ტილოზე.


მაგრამ თითოეული პიქსელის ზუსტად გადმოცემა 1:1 მასშტაბით ძალიან რთული იქნება და შეცდომებს არ ავიცილებთ თავიდან. ასე რომ, ჩვენ გვჭირდებოდა მასშტაბირება (დიდი!). გარდა ამისა, მომხმარებლებს სჭირდებოდათ ტილოზე ადვილად ნავიგაცია, რადგან ის ძალიან დიდი იყო ეკრანების უმეტესობისთვის (განსაკუთრებით ზუმის გამოყენებისას).

მასშტაბირება

ვინაიდან მომხმარებლებს შეეძლოთ ფილების განთავსება ხუთ წუთში ერთხელ, განლაგების შეცდომები მათთვის განსაკუთრებით იმედგაცრუებული იქნებოდა. საჭირო იყო ისეთი სიმრავლის მასშტაბის განხორციელება, რომ ფილა საკმარისად დიდი ყოფილიყო და მისი ადვილად განთავსება შესაძლებელი ყოფილიყო. Სწორი ადგილი. ეს განსაკუთრებით მნიშვნელოვანი იყო სენსორულ მოწყობილობებზე.


ჩვენ განვახორციელეთ 40x მასშტაბირება, ანუ თითოეულ ფილას ჰქონდა ზომა 40x40. ჩვენ შევფუთეთ ელემენტი in

, რომელსაც აქვს CSS ტრანსფორმაცია: მასზე გამოყენებული scale(40, 40). ეს იყო შესანიშნავი გამოსავალი ფილების დასაყენებლად, მაგრამ ართულებდა დაფის დანახვას (განსაკუთრებით მცირე ეკრანებზე), ამიტომ ჩვენ გავადიდეთ ორი გაჩერება: 40x ფილების დასახატავად, 4x დაფის სანახავად.


CSS-ის გამოყენებამ ტილოს მასშტაბირება გაუადვილა დაფის დახატვაზე პასუხისმგებელი კოდის გამოყოფა სკალირებაზე პასუხისმგებელი კოდისგან. მაგრამ ამ მიდგომას აქვს რამდენიმე ნაკლი. სურათის (ტილოს) სკალირებისას ბრაუზერები ნაგულისხმევად იყენებენ გამოსახულების გასწორების ალგორითმებს. ზოგიერთ შემთხვევაში, ეს არ იწვევს უხერხულობას, მაგრამ ის უბრალოდ ანადგურებს პიქსელის გრაფიკას, აქცევს მას საპნის ფაფად. სასიხარულო ამბავი ის არის, რომ არსებობს CSS-ის გამოსახულების რენდერის თვისება, რომელიც საშუალებას გვაძლევს „ვთხოვოთ“ ბრაუზერებს, არ გამოიყენონ ანტი-ალიასინგი. ცუდი ამბავი ის არის, რომ ყველა ბრაუზერს არ აქვს ამ ფუნქციის სრული მხარდაჭერა.


გადიდების დაბინდვა:



ასეთი ბრაუზერებისთვის სკალირების სხვა გზა უნდა მოიძებნოს. ზემოთ აღვნიშნე, რომ ტილოზე ხატვის სამი გზა არსებობს. პირველი, drawImage(), მხარს უჭერს არსებული სურათის ან სხვა ტილოს დახატვას. იგი ასევე მხარს უჭერს გამოსახულების სკალირებას რენდერის დროს (გაზრდის ან კლების). მიუხედავად იმისა, რომ მასშტაბირებას აქვს იგივე ბუნდოვანი პრობლემები, როგორც ზემოთ მოყვანილ CSS-ში, ისინი შეიძლება გადაწყდეს უფრო ზოგადი გზით ბრაუზერის მხარდაჭერის თვალსაზრისით CanvasRenderingContext2D.imageSmoothingEnabled დროშის გასუფთავებით.


ასე რომ, ჩვენ გადავწყვიტეთ ბუნდოვანი ტილოს პრობლემა რენდერის პროცესის კიდევ ერთი ნაბიჯის დამატებით. ამისათვის ჩვენ შევქმენით კიდევ ერთი ელემენტი , რომელიც არის იგივე ზომა და პოზიცია, როგორც კონტეინერის ელემენტი (ანუ დაფის ხილული ფართობი). ტილოს ხელახალი დახატვის შემდეგ drawImage() , მისი ხილული ნაწილი ახალ ტილოში სასურველი მასშტაბით იხაზება. იმის გამო, რომ ეს დამატებითი ნაბიჯი ოდნავ ზრდის რენდერის ხარჯებს, ჩვენ მას მხოლოდ ბრაუზერებში ვიყენებდით, რომლებსაც არ აქვთ CSS საკუთრების გამოსახულების რენდერის მხარდაჭერა.

ნავიგაცია ტილოზე

ტილო ლამაზია დიდი სურათი, განსაკუთრებით გადიდებისას, ამიტომ გვჭირდებოდა მასში ნავიგაცია. ეკრანზე ტილოს პოზიციის დასარეგულირებლად, ჩვენ გამოვიყენეთ იგივე მიდგომა, როგორც სკალირების შემთხვევაში: შევახვიეთ ელემენტი. სხვას

, რომელსაც აქვს CSS ტრანსფორმაცია: translate(x, y) გამოიყენება მასზე. ცალკე div-ის წყალობით, ჩვენ ადვილად ვაკონტროლეთ ტილოზე ტრანსფორმაციების განხორციელების თანმიმდევრობა, რაც აუცილებელი იყო მასშტაბის შეცვლისას „კამერის“ გადაადგილების თავიდან ასაცილებლად.


შედეგად, ჩვენ მივიღეთ მხარდაჭერა სხვადასხვა გზებიკამერის პოზიციის პარამეტრები:

  • „დააწკაპუნეთ და გადაათრიეთ“ (დაწკაპუნეთ-და-გადაათრიეთ, ან შეხებით გადაათრიეთ);
  • „Click to move“ (click-to-move);
  • კლავიატურის ნავიგაცია.

თითოეული ეს მეთოდი განსხვავებულად ხორციელდება.

"დააწკაპუნეთ და გადაიტანეთ"

ეს არის ნავიგაციის მთავარი გზა. ჩვენ შევინახეთ მაუსის ჩამორთმევის მოვლენის x და y კოორდინატები. თითოეული ამ მოვლენისთვის ჩვენ ვიპოვნეთ მაუსის კურსორის პოზიციის ოფსეტი საწყის პოზიციასთან მიმართებაში და შემდეგ დავამატეთ ეს ოფსეტი არსებულ ტილოზე ოფსეტზე. კამერის პოზიცია მაშინვე განახლდა, ​​ამიტომ ნავიგაცია ძალიან რეაგირებადი იყო.

"დააჭირე გადასაადგილებლად"

ფილაზე დაწკაპუნებისას ის მოთავსებულია ეკრანის ცენტრში. ამ მექანიზმის განსახორციელებლად, ჩვენ უნდა გაგვედევნებინა მანძილი მაუსის ჩამორთმევასა და მაუსის აწევის მოვლენებს შორის, რათა განვასხვავოთ „დაწკაპუნებები“ „მოძრაობებისგან“. თუ მაუსის გადაადგილებული მანძილი არ იყო საკმარისი იმისათვის, რომ ჩაითვალოს "მოძრავად", "კამერის" პოზიცია შეიცვალა მაუსის პოზიციასა და ეკრანის ცენტრში არსებულ წერტილს შორის სხვაობის მიხედვით. ნავიგაციის წინა მეთოდისგან განსხვავებით, "კამერის" პოზიცია განახლდა შემსუბუქების ფუნქციის გამოყენებით. იმის ნაცვლად, რომ დაუყოვნებლივ დაგვეყენებინა ახალი პოზიცია, ჩვენ ის შევინახეთ „სამიზნედ“. ანიმაციური მარყუჟის შიგნით (იგივე გამოიყენება ტილოს გადასახატავად), ამჟამინდელი „კამერის“ პოზიცია მიზანთან უფრო ახლოს გადავიდა შემსუბუქების ფუნქციის გამოყენებით. ამან შესაძლებელი გახადა ძალიან მკვეთრი მოძრაობის ეფექტის მოშორება.

კლავიატურის ნავიგაცია

ტილოზე ნავიგაცია შესაძლებელი იყო კლავიატურის ისრებით ან WASD-ით. ეს კლავიშები აკონტროლებდნენ შიდა მოძრაობის ვექტორს. თუ არცერთი ღილაკი არ იყო დაჭერილი, მაშინ ნაგულისხმევ ვექტორს ჰქონდა კოორდინატები (0, 0). რომელიმე ნავიგაციის ღილაკზე დაჭერით დაემატა 1 x ან y. მაგალითად, თუ დააჭერთ "მარჯვნივ" და "ზევით", მაშინ ვექტორის კოორდინატები იქნება (1, -1). შემდეგ ეს ვექტორი გამოიყენებოდა ანიმაციის ციკლში „კამერის“ გადასატანად.


ანიმაციის დროს მოძრაობის სიჩქარე გამოითვლებოდა მასშტაბის დონის მიხედვით შემდეგი ფორმულის გამოყენებით:


მოძრაობის სიჩქარე = maxZoom / currentZoom * speedMultiplier

როდესაც მასშტაბირება გამორთული იყო, ღილაკები უფრო სწრაფი და ბუნებრივი იყო.


შემდეგ მოძრაობის ვექტორი ნორმალიზდა, გამრავლდა მოძრაობის სიჩქარეზე და მიმართა „კამერის“ ამჟამინდელ პოზიციას. ნორმალიზება გამოიყენებოდა დიაგონალური და ორთოგონალური მოძრაობების სიჩქარის შესატყვისად. საბოლოოდ, ჩვენ გამოვიყენეთ შემსუბუქების ფუნქცია თავად მოძრაობის ვექტორის ცვლილებებზე. ამან გაათანაბრა ცვლილებები მოძრაობის მიმართულებასა და სიჩქარეში, ისე, რომ "კამერა" ბევრად მოძრაობდა უფრო გლუვი.

მობილური აპლიკაციის მხარდაჭერა

iOS და Android აპლიკაციებში ტილოს ჩასმისას გარკვეული სირთულეები შეგვხვდა. პირველ რიგში, ჩვენ დაგვჭირდა მომხმარებლის ავთენტიფიკაცია, რათა მათ შეეძლოთ ფილების განთავსება. ვებ ვერსიისგან განსხვავებით, სადაც ავთენტიფიკაცია სესიაზეა დაფუძნებული, in მობილური აპლიკაციებიჩვენ გამოვიყენეთ OAuth: ამ შემთხვევაში, აპლიკაციებმა უნდა მიაწოდონ სისტემაში შესული მომხმარებელი WebView წვდომის ნიშნით. ამის განხორციელების ყველაზე უსაფრთხო გზაა OAuth ავტორიზაციის სათაურების შეყვანა JS ზარის საშუალებით აპლიკაციიდან WebView-ზე. ეს მოგვცემს საჭიროების შემთხვევაში სხვა სათაურების მორგების საშუალებას. შემდეგ ეს იყო მხოლოდ ავტორიზაციის სათაურების გაანალიზება ყოველ API ზარზე:


r.place.injectHeaders(('ავტორიზაცია': 'ტარებელი ’});

iOS-ის ვერსიაში ჩვენ დამატებით განვახორციელეთ შეტყობინებების მხარდაჭერა, როდესაც მომხმარებლის ფილა მზად იყო ტილოზე დასაყენებლად. ვინაიდან განთავსება მთლიანად განხორციელდა WebView-ში, ჩვენ უნდა განვახორციელოთ მშობლიური განაცხადის გამოძახება. საბედნიეროდ, iOS 8 და ზემოთ, ეს კეთდება მარტივი JS ზარით:


webkit.messageHandlers.tilePlacedHandler.postMessage(this.cooldown / 1000);

შემდეგ აპლიკაციაში დელეგატის მეთოდი აგზავნიდა შეტყობინებებს მასზე გადაცემული დატენვის ტაიმერის საფუძველზე.


რა ვისწავლეთ

ყოველთვის რაღაც აკლია

ყველაფერი მშვენივრად დავგეგმეთ. ჩვენ ვიცოდით, როდის იქნებოდა გაშვება. ყველაფერი საათივით უნდა წასულიყო. ჩვენ გვქონდა წინა და უკანა ნაწილის ტესტირება დატვირთვის ქვეშ. ჩვენ ადამიანები უბრალოდ შეცდომის დაშვება აღარ შეგვეძლო. მართალია?


გაშვებამ მართლაც შეუფერხებლად ჩაიარა. დილით, როდესაც r/Place პოპულარობა იზრდებოდა, გაიზარდა კავშირების რაოდენობა და გაიზარდა ტრაფიკი WebSocket-ის ინსტანციებზე:




ჩვენ ვიწინასწარმეტყველეთ. და ჩვენ ვემზადებოდით იმისთვის, რომ შედეგად ქსელი გახდებოდა ბოსტნეულობა ჩვენს სისტემაში. მაგრამ აღმოჩნდა, რომ ჩვენ გვაქვს დიდი მარაგი. თუმცა, როდესაც გადავხედეთ CPU-ს გამოყენებას, ჩვენ ვნახეთ სრულიად განსხვავებული სურათი:



ეს არის რვა ბირთვიანი მანქანები, ამიტომ აშკარა იყო, რომ მათ მიაღწიეს თავიანთ ზღვარს. რატომ მოიქცნენ ეს „ყუთები“ ასე მოულოდნელად? ჩვენ გადავწყვიტეთ, რომ Place-ის მიერ გენერირებული დატვირთვა ძალიან განსხვავდება თავისი ბუნებით ადრე. გარდა ამისა, გამოყენებული იყო ძალიან მცირე შეტყობინებების დიდი რაოდენობა, მაშინ როდესაც ჩვენ ჩვეულებრივ ვაგზავნით უფრო დიდ შეტყობინებებს, როგორიცაა პირდაპირი თემის განახლებები და შეტყობინებები. ასევე, ჩვენ ჩვეულებრივ არ გვყავს იმდენი მომხმარებელი, რომელიც იღებს ერთსა და იმავე შეტყობინებას. ასე რომ, სამუშაო პირობები ძალიან განსხვავდებოდა ჩვეულებრივისგან.


ჩვენ გადავწყვიტეთ, რომ არაფერი საშინელი არ ხდება: ჩვენ გავზრდით და ეს არის ის. პასუხისმგებელმა თანამშრომელმა უბრალოდ გააორმაგა შემთხვევების რაოდენობა და ექიმთან მივიდა გრამი მღელვარების გარეშე.


და შემდეგ მოხდა ეს:



ერთი შეხედვით, არაფერი განსაკუთრებული. რომ არა ის ფაქტი, რომ ეს იყო ჩვენი RabbitMQ წარმოების მაგალითი, რომელიც ამუშავებს არა მხოლოდ websocket შეტყობინებებს, არამედ ყველაფერს, რაზეც დამოკიდებულია reddit.com. და ეს არ იყო კარგი. Საერთოდ არ არის კარგი.


მრავალრიცხოვანი გამოკვლევების, ხელის შეშლისა და მაგალითების განახლებების შემდეგ, ჩვენ შევამცირეთ პრობლემის წყარო მართვის ინტერფეისამდე. ის ყოველთვის რაღაცნაირად ნელი ჩანდა და ჩვენ გადავწყვიტეთ, რომ მას რეგულარულად ითხოვდა ჩვენი Rabbit Diamond კოლექციონერი. ჩვენ გვეგონა, რომ დამატებითი მონაცემთა გაცვლა, რომელიც დაკავშირებულია ახალი ვებსოკეტების ინსტანციების გაშვებასთან, ამ გაცვლასთან დაკავშირებით მიღებულ შეტყობინებების მასასთან ერთად, იწვევდა კურდღლის გადატვირთვას, რომელიც ცდილობდა თვალყური ადევნოდა მოთხოვნის შესრულებას. ადმინის პანელი. ასე რომ, ჩვენ უბრალოდ გამორთეთ - და სიტუაცია გაუმჯობესდა.


მაგრამ ჩვენ არ გვიყვარს სიბნელეში ყოფნა და ა.შ ნაჩქარევადმოაწყვეს იმპროვიზირებული მონიტორინგის სკრიპტი:


$ cat s****y_diamond.sh #!/bin/bash /usr/sbin/rabbitmqctl list_queues | /usr/bin/awk "$2~//(ბეჭდვა "servers.foo.bar.rabbit.rabbitmq.queues." $1 ".messages " $2 " " systime())" | /bin/grep -v "amq.gen" | /bin/nc 10.1.2.3 2013წ

თუ გაინტერესებთ, რატომ განვაგრძეთ პიქსელების განლაგების ვადის კორექტირება, პასუხი არის ის, რომ ჩვენ ვცდილობდით შეგვემცირებინა დატვირთვა მთელ პროექტზე. ამავე მიზეზით, გარკვეული პერიოდის განმავლობაში, ზოგიერთი პიქსელი დიდი ხნის განმავლობაში არ იყო ნაჩვენები დაფაზე.


სამწუხაროდ, ასეთი შეტყობინებების მიუხედავად:



გაგრილების ცვლილებები აქ ნახსენები იყო მხოლოდ ტექნიკური მიზეზები. თუმცა მათ შემდეგ საინტერესო იყო r/place/new ფილიალის ყურება:



ალბათ ეს იყო მომხმარებლების მოტივაციის ნაწილი.

ბოტები ბოტებად დარჩებიან

პროექტის დასკვნით ეტაპზე კიდევ ერთი არეულობა დაგვხვდა. ჩვენ რეგულარულად გვაქვს პრობლემები კლიენტებთან, რომლებიც არასწორად იქცევიან განმეორებითი მცდელობების თვალსაზრისით. ბევრი კლიენტი ხვდება შეცდომებს და უბრალოდ ხელახლა აგზავნის მოთხოვნებს. Და ისევ. Და ისევ. ანუ, როდესაც რაიმე პრობლემა ჩნდება საიტზე, ეს იწვევს მომხმარებლების განმეორებით მოთხოვნის ტალღას, რომლებმაც არ იციან რა არის ამონაწერი.


როდესაც ჩვენ გამორთეთ Place, ბოლო წერტილებმა, რომლებზეც წვდომა ბევრი ბოტი იყო, დაიწყეს არა-200-ე შეცდომების დაბრუნება. ეს კოდი არ იყო ძალიან წარმატებული. საბედნიეროდ, ყველა ეს განმეორებითი ზარი ადვილად დაიბლოკა Fastly დონეზე.

კიდევ რაღაცის შექმნა

r/Place არ იქნებოდა ასე წარმატებული, რომ არა კარგად კოორდინირებული გუნდური მუშაობა. გვსურს მადლობა გადავუხადოთ u/gooeyblob, u/egonkasper, u/eggplanticarus, u/spladug, u/thephilthe, u/d3fect და ყველას, ვინც დაეხმარა ამ პირველაპრილის ექსპერიმენტის რეალობად ქცევას.



მსგავსი სტატიები
 
კატეგორიები