Kako smo izgradili novi ActiveCollab — Feather tech stack

Ilija Studen - 27. Januar, 2015.

Mi smo A51 i kreirali smo ActiveCollab, popularni alat za upravljanje projektima, praćenje vremena i izdavanje računa. Time se bavimo već dosta vremena (prvo izdanje ActiveCollab-a je izašlo u leto 2006. godine) tako da se naš stack tokom godina prilično menjao.

U narednim redovima ću pričati o aktuelnoj verziji stack-a koju koristimo u razvoju sledeće major verzije sistema (peta po redu, kodno ime Feather).

Frontend

Koristimo Angular kao osnovu za Feather frontend. Izbor nije bio nasumičan, već rezultat eksperimenta. U jesen 2013. godinu smo probali da implementiramo novi ActiveCollab interfejs koristeći naš sopstveni JavaScript framework, Ember i Angular.

Od kreiranja sopstvenog framework-a smo brzo odustali, jer su stvari vrlo brzo počele da se otimaju kontroli i počelo je da izgleda kao da kreiramo novi Ember ili Angular. Ako ovi projekti već postoje i ako su se već dokazali, zašto praviti našu verziju toga?

Tako smo prvu opciju otpisali i ostalo je da se odlučimo izmedju Embera i Angulara.

Nakon što je naš tim napravio uzorak novog interfejsa koristeći oba frameworka, Angular se ispostavio kao prihvatljivije rešenje. Bio je lakši, imao je više potencijala i trakcije i tim se osećao komfornije sa njim.

Naša frontend ekipa više preferira da piše plain JavaScript. Nije bilo velikog interesovanja za CoffeeScript ili slično rešenje (možda za Dart, ali itu samo zbog mnogo boljih performansi u Chrome browseru koji koristi preko 50% ActiveCollab korisnika).

Backend

Na backend strani koristimo PHP, MySQL, memcached, Redis, ElasticSearch i Node.js. Prve tri komponente su dobro poznate i istestirane (projekti stari 10+ godina). Iza nas su godine iskustva sa ovom platformom, što nas čini izuzetno produktivnim. Stabilnost i poznavanje je osnovno pravilo za odabir backend tehnologije.

Nije stvar u tome “Koliko je to cool?” ili “Zatvorio bih se u sobu ceo vikend da bih se igrao sa ovim jezikom ili framework-om”, već “Da li mi imamo iskustva sa ovim?”, “Koliko je to stabilno?” i “Ako napravimo da je ovo system requirement, da li će ljudi i dalje biti sposobni da self-hostuju activeCollab?”

Kada pogledamo PHP, MySQL i memcached, na sva tri pitanja odgovori su “Da”. Ova platforma je postajala sve bolja kako je vreme prolazilo. PHP je znatno robustniji nego ranije (hejteri će hejtovati, ostavite ih – za uspeh startapa izbor programskog jezik je relevantan isto koliko i koji broj cipela nosite), MySQL je zreo i pouzdan, a memcached je… pa, stari dobri memcached.

Stack elementi koji su novi u Feather-u su:

  1. Redis, kada nam je potrebno više nego prost memory keš,
  2. ElasticSearch, za pretragu i logovanje i
  3. Node.js, kao web-socket menadžer za realizaciju real-time funkcionalnosti.

Feather nije nov proizvod i imaćemo dosta saobraćaja već prvog dana, tako da nam je potrebno nešto što provereno dobro radi. Iskustva drugih kompanija nam govore da su ove tehnologije stabilne i da lepo scale-uju.

API

“Lepak” koji povezuje sve ActiveCollab frontend-e (glavni web interface, iOS i Android aplikaciju, browser ekstenzije i ActiveCollab Timer) je naš novi i unapređeni AciveCollab API.

Uložili smo značajnu količinu rada i mislimo da će se svideti ljudima (mi ga svakodnevno koristimo i radi dobro). Jasno razgraničavanje između backend-a i svih frontend-ova je bio odličan momenat za naš tim i učinio nas je mnogo produktivnijim – backend developeri se brinu da stvari rade pouzdano i brzo na backend stranci, a frontend developeri imaju istestiran i opširan API i ne zanima ih šta leži iza njega.

Infrastruktura

Naša cloud infrastruktura je napravljena od osam servera podeljenih u tri sloja: front, app i storage.

Svrha front sloja je da osigura da workload bude ravnomerno raspoređen na aplikacionim serverima (load-balancing) i da izvršava neke lakše zadatke, kao što je SSL terminacija, rukovanje statičkim fajlovima itd.

App sloj je mesto gde se izvršava sam ActiveCollab kod. Ovi serveri su prilično jaki i mogu da rade pod priličnim opterećenjem. Pored same aplikacije, na ovom sloju je distributian i memory keš, kako bi bio lakodostupan aplikaciji.

Iz istog razloga smo nedavno prebacili i bazu na ovaj sloj. Network latency možda nije bio velik, ali smo išli na to da ga nema dok za time ne bude stvarne potrebe. Kada zahtev dođe do aplikacionog servera, sve je na samom serveru i to značajno skraćuje vreme izvršavanja.

Storage sloj je mesto gde držimo sve fajlove koje korisnici upload-uju. Serveri u ovom sloju imaju relativno slabe procesore, ali ogromne diskove sa zamašnim keševima na RAID kontrolorima.

Svi serveri imaju replikacije koje mogu da “uskoče” ako glavnim server počne da brlja. Aplikacioni nivo nema rezervu jer je “elastičan” – svi serveri uvek rade i uvek obrađuju izvestan procenat zahteva. Kada opterećenje pređe određeni nivo, mi dodamo nove servere u sloj da bismo spustili load na prihvatljiv nivo.

Testiranje i CI

Neki delovi ActiveCollab-a su godinama pokriveni testovima, ali postojali su delovi gde nije bilo testova. Sa Feather-om smo osigurali da svi važni elementi sistema imaju testove koji ih pokrivaju, gledano interno (unit test) i eksterno (testovi koji koriste API za simulaciju različitih scenarija upotrebe). Koristimo phpunit za unit testiranje i Narrative za testiranje API-ja.

Odlična stvar kod Narrative-a (i jedan od glavnih razloga zašto smo ga napravili) je to što izvršava testove i pravi developer dokumentaciju iz istog seta scenarija. To znači da se dokumentacija piše tokom razvoja i da sadrži više detalja nego što bi imala da smo njeno pisanje ostavili za kraj. Takođe je uvek up-to-date.

Selenijum koristi naš QA za front-end testiranja i kao alat za automatizaciju.Koristimo GitFlow zato što moramo da izbacujemo softver po verzijama (jer ActiveCollab ima izdanje koje korisnici mogu da skinu i instaliraju kod sebe na server).

Ova strategija grananja je dobra za softvere kao što je naš, ali može da bude nepotrebno komplikovana ako ste samo u SaaS poslu i želite da imate brze i kratke razvojne cikluse. U tom slučaju je GitHub proces verovatno bolji za vas. Naš CI (koristimo Jenkins) je podešen da izvršava čitav set testova na razvojnoj grani. Ako su testovi prošli, bilo ko može da spoji ove izmene sa masterom i prebaci ih na naš “staging” server.

Upravljanje projektima i kolaboracija

Ovo bi trebalo da bude očigledno. Koristimo ActiveCollab kao primarni alat za upravljanje projektima i kolaboraciju. Za kompanijski chat koristimo HipChat, ali tim već radi na rešavanju tog “problema” :)

Kod je delimično hostovan na GitHub-u (javni i legacy projekti), a delimično na našem serveru. Nadam se da vam nije bilo dosadno sa svim ovim tekstovima i linkovima. Ako imate bilo kakvih pitanja, molim vas da ostavite komentar.

Hoćete da saznate kako da uposlite backend tehnologije pomenute u ovom članku? ActiveCollab ekipa organizuje besplatnu radionicu gde ćemo u 2 susreta kreirati, testirati i deploy-ovati novi backend infrastrukturni servis kojeg će koristiti hiljade timova. Imamo samo 6 mesta za prvu radionicu, pa požurite da saznate više i prijavite se.