Tech Stack 2021 @ RentSpree
สวัสดีครับ Blog นี้จะมาแชร์เกี่ยวกับ Tech Stack ของ RentSpree ที่เราใช้ในการพัฒนา Products ของเรา โดย product ของเราจะเป็น Web Application ทั้งหมด (ณ ต้นปี 2021) ซึ่งจะมาอธิบายทีละตัวว่าตอนนี้เราใช้ตัวไหนบ้าง ใช้แต่ละตัวทำอะไรบ้าง และเรากำลังทำอะไรอยู่ สำหรับ Product Development ของเราทั้งหมดในมุมของ Developers
Programming Languages
- JavaScript
เราใช้ภาษานี้เป็นภาษาหลักทั้งหน้าบ้านและหลังบ้าน บนพื้นฐาน ES6 - Golang
เนื่องจากเรากำลังจะใช้ KrakenD เป็น API-Gateway ตัวใหม่ ซึ่งบางอย่างไม่ตอบโจทย์การทำงานของระบบเดิม ทำให้ต้องเขียน custom plugin เพิ่มให้รองรับการทำงานกับระบบเดิม
Frameworks & Libraries
- NodeJS
เนื่องจากเราใช้ JavaScript เป็นภาษาหลัก ซึ่ง NodeJS ก็เป็น runtime ที่นิยมมากๆ สำหรับการทำ Web Application และ Backend ทั้งหมดเขียนด้วย NodeJS - React
สำหรับ Frontend ทุกโปรเจคของเรา เราเลือกใช้ React ในการพัฒนา และใช้ react-boilerplate เป็นตัวเริ่มสร้างโปรเจค - Redux + Saga
สำหรับเรื่อง state management เราเลือกใช้ redux และใช้ redux-saga เป็น middleware ที่คอยจัดการ actions ต่างๆ ของ redux อีกที ซึ่งเหตุผลที่เราเลือกใช้เพราะว่ามันรองรับการทำ Asynchronous Process และทำ Pallarel excution ได้ เขียนเทสได้สะดวก และยังมี Official Document ที่เข้าใจง่ายอีกด้วย - SenecaJS
ระบบของเราออกแบบเป็น Microservices เวลา service หลังบ้านคุยกัน เราจะ register service เข้าหากันผ่าน Seneca และให้ตัว Seneca จัดการเรื่อง routing, endpoint ให้ผ่าน role, command ที่เราระบุไว้ในแต่ละ service - Express.js
หลักๆ ที่เราใช้ จะเอามาใช้เป็น API-Gateway สำหรับ request จาก Frontend แล้วส่งต่อข้อมูลให้กับ microservices ผ่าน Senecajs - KrakenD
ตอนนี้เรากำลังทำ API-Gateway ตัวใหม่ขึ้นมาแทน gateway ตัวเดิมที่เขียนด้วย ExpressJS สาเหตุหลักที่เราเปลี่ยนมาใช้ตัวนี้เพราะว่ามันเกิดมาเป็น API-Gateway โดยเฉพาะ มี plugins ให้พร้อมใช้งาน เช่น logging, authentication, tracing หรือจะเขียน custom ขึ้นมาเองก็ทำได้ง่าย และแน่นอนที่สุดเรื่องของ performance ที่ไวกว่า ExpressJS หลายเท่า - GraphQL
เราเอา GraphQL มาใช้กับระบบ Admin เนื่องจากเรามี DB แยกตามประเภทของ Service โดยต่อกับ Database ตรงๆ หรือคุยผ่าน senecajs ไปที่แต่ละ service ซึ่ง GraphQL ค่อนข้างตอบโจทย์เรา - WordPress
เราเอามาทำ Web Page หลักของเว็บบริษัท - Strapi
Strapi เป็น headless cms ที่เราเอามาช่วยทำระบบ admin เพื่อเอาไว้สำหรับจัดการ content ต่างๆ ได้ง่ายขึ้น ตอนนี้มี 2 โปรเจคที่ขึ้นด้วย Strapi แล้ว - NextJS
อันนี้พึ่งเริ่มเอามาใช้กับโปรเจคเล็กๆ อันหนึ่งที่ต้องการ การทำงานแบบ SSR
Linting / Testing Tools
- ESLint + Prettier
ในส่วนเรื่อง Code Linter/Format เรามี linter + rules ทั้ง Frontend และ Backend ซึ่งทุกครั้งที่ push code ตัว Gitlab CI จะทำการตรวจ code ทุกครั้ง ถ้าไม่ผ่านจะต้องแก้ เพื่อให้เป็นมาตรฐานเดียวกันทุกทีม - Mocha + Sinon + Chai
ในส่วนการเขียน tests สำหรับ Backend เราเลือกใช้ Mocha + Sinon และใช้ Chai เป็น assertion library - Jest+ Enzyme + saga-test-plan
สำหรับ frontend เราใช้ตาม react-boilerplate และเนื่องจากเราใช้ redux-saga จึงต้องใช้ saga-test-plan ด้วย ซึ่งทำให้เขียน tests ในส่วน redux-saga ได้ง่ายขึ้นมาก - Factory Girl
เราเลือกใช้ factory-girl ในการ generate data สำหรับเขียน test - k6
ในส่วนของ Load testing tool เราเลือกใช้ k6 ซึ่งคิดว่าเป็นตัวที่เหมาะกับ Developer เพราะใช้ JavaScript ในการเขียน และค่อนข้างใช้งานได้ดี - Postman for Integration Tests
นอกจากจะใช้เป็น API Development แล้ว เราเอา Postman มาช่วยทำ Integration Tests ด้วย ซึ่งทำเป็น automated run ใน CI โดยใช้ newman อีกที
ที่ RentSpree เราจะเขียน Tests กับทุก features ที่เราพัฒนา ไม่ว่าจะเป็น frontend, backend และมีการ Review code กันตลอด ซึ่งทำให้เกิดบัคที่ Production น้อยมากๆ
และเราทำ TDD ด้วยครับ
Database
- MongoDB
DB เราเลือกใช้ mongodb เป็นตัวหลัก โดยระบบของเรา 1 microservice จะมี 1 database โดยแยกตามหลักการของการออกแบบ microservices - Redis
สำหรับ redis เราเอามาใช้แค่กับโปรเจคเล็กๆ เพื่อเก็บ key, values สำหรับจัดการเรื่อง tasks ต่างๆ ซึ่งตอนนี้เราพยายามจะเปลี่ยนไปใช้ RabbitMQ แทนแล้ว - Elasticsearch
เนื่องจากเราทำ Logging ด้วย Kibana + Elasticsearch ข้อมูล Logs ทั้งหมดจะเก็บอยู่บน Elasticsearch
สำหรับ Database ทั้งหมดของเราจะ deploy อยู่บน K8s ทั้งหมดแบบ StatefulSet
Message Queue
- RabbitMQ
เราเอามาช่วยทำในเรื่องของ event ต่างๆ ที่เป็น async (ไม่ต้องรอ response จาก service) เช่นเรื่องของ email, sms หรือ tasks อื่นๆ โดยจะมี service (publisher) จะทำหน้าที่เอาของเข้า queue แล้วจะมีอีก service (worker) คอยรับของไปทำ
Cloud Provider
- Google Cloud
Infrastructure ของเราอยู่บน Google Cloud ทั้งหมดครับ ซึ่ง service หลักๆ ที่เราใช้ก็ตามรายเอียดข้างล่างต่อเลย
Google Kubernetes Engine — แน่นอนเราใช้ GKE ที่เป็น managed service ของตัว Kubernetes ซึ่งค่อนข้างจัดการง่าย Document ก็เข้าใจง่ายและครบ
Google Container Registry — Container Image เราเก็บบน GCR
Cloud Storage — Object Storage เราใช้ สำหรับเก็บ Static files ทุกอย่าง และ Backup data
Cloud Monitoring + Logging (Stackdriver) สำหรับเก็บข้อมูล logs + metrics และ alerting
BigQuery สำหรับทีม Data Engineer ใช้ ซึ่งมีทำ ETL ข้อมูลมาเก็บเพื่อทำ Analytics บน Power BI อีกที
Infrastructure
- Cloudflare
ใช้จัดการเรื่อง Caching + CDN + DNS และ SSL/TLS ต่างๆ ให้เรา - Docker
Docker จะใช้แค่ตอนเขียนโปรแกรม เช่นรัน local DB หรือต้องการทดสอบอะไรบางอย่าง ซึ่ง Docker ช่วยให้ทำงานได้ง่ายขึ้น - Kubernetes
Containers + Microservices ยังไงก็หนีไม่พ้น Kubernetes ครับในยุคนี้ ทำให้ชีวิต Developer ทำงานได้ง่ายขึ้นเยอะ - Ingress
สำหรับ Ingress เราเลือกใช้ Nginx Ingress Controller มาเป็น external access service สำหรับ K8s ส่ง traffic ไปหา frontend, api-gateway อีกที - Logging
สำหรับ Logging Stack เราใช้แค่ Elasticsearch + Kibana ส่วนในการขน Logs เข้า Elasticsearch เรามี middleware ฝังไว้ที่ api-gateway เพื่อเก็บ access log หรือเป็น library ใน service ส่งเข้า elasticsearch อีกที ไม่ได้ใช้ Logstash และมีส่งเข้าไปเก็บที่ Stackdriver ตรงๆ ด้วย - Monitoring + Alert
หลักๆ ตอนนี้ใช้ที่ Google Cloud Monitoring เป็นหลัก และกำลังทำเพิ่มเองโดยเลือกใช้ Grafana ดึง Data Source จาก Google Cloud Metrics และมีใช้ kube-state-metrics + (node, mongodb, …)-exporters ต่างๆ เก็บเข้า Prometheus ด้วยเพื่อทำ Virtualization Dashboard + Alert โดยใช้ Gafrana
CI/CD + Tools
- Gitlab CI/CD
RentSpree เราใช้ Gitlab เป็น SCM อยู่แล้วก็เลยใช้ CI/CD ไปด้วยเลย ซึ่งที่ทำไว้จะมี Gitlab CI Template กลางไว้ 1 repo แล้วทุก service จะ include templates ไปใช้ ซึ่ง Stage หลักๆ ก็จะมี Build / Test / Code Quality / Release / Deploy - Code Quality with Code Climate
เราจะมีการ Review Code ทุกครั้งที่เปิด Merge Request เพื่อให้สอดคล้องกับ convention ที่เราทุกคนตั้งกันไว้ เราเอา Code Climate มาช่วยสร้าง report ให้อีกทางให้เราสามารถดูได้ว่าสิ่งที่เราเพิ่มหรือแก้ไข ส่วนไหน มี duplicate code, line of code หรือไม่ตรงกับ rules ที่เราตั้งไว้หรือเปล่า ซึ่ง Gitlab สามารถ Integrate เข้ากับ Code Climate ได้ทันที
- Argo CD
สิ่งที่จะมาช่วยให้เราทำเรื่องของ CD ได้ง่ายขึ้นตาม GitOps concepts ก็คือ Argo CD ซึ่ง RentSpree ก็เลือกเอามาช่วยจัดการในเรื่องของการ Deploy ไปแต่ละ Cluster หรือแต่ละ Environment ด้วย โดยตัว Argo CD จะคอยดูว่าถ้ามี Helm Chart ใหม่ขึ้นแสดงว่ามี Release ก็จะ detect change แล้วก็ deploy ให้เรา อันนี้ก็เป็นสิ่งที่เรากำลังทำอยู่ซึ่งใกล้จะเอามาใช้กับ UAT, Production แล้ว - Helm for manage application deployment
ส่วนเรื่อง Application Deployment ด้วยความที่ deployment ของเราไม่ค่อยมีความซับซ้อนเท่าไหร่ เราจึงเลือกใช้ Helm มาจัดการตรงส่วนนี้ สิ่งที่เราทำคือจะสร้าง frontend-template, backend-template charts เป็น dependencies ของแต่ละ service ให้เอาไปเรียกใช้ โดยแค่ส่ง values มาตาม environment เพื่อให้ง่ายต่อการแก้ไข - Helm Repository
อันนี้ต่อจากข้อก่อนหน้า คือเราเก็บ Helm Package โดยใช้ Chartmuseum เป็น API และใช้ Google Cloud Storage เก็บข้อมูลให้เรา - RentSpree CLI
เป็น CLI สำหรับ Dev ที่สร้างขึ้นมาช่วยการทำงานที่ซ้ำๆ กันในหลายๆ ทีม เช่นการสร้าง Release, ดู Merge Requests หรือดู CI Pipelines ทีเดียวทั้งหมด - GitSpree
อันนี้จะไม่ค่อยเกี่ยวเท่าไหร่ แต่เห็นว่าเรื่องคล้ายกันเลยใส่ไว้ด้วยกันเลย ก็คือเราจะมี Internal tools ไว้ดูภาพรวม CI/CD ด้วย
จากที่เล่ามาเกี่ยวกับ CD จะเห็นว่าเรามีใช้ GitOps concepts ในการทำ Continuous Deployment มี internal tools ที่เขียนขึ้นมาเพื่อช่วยทำในเรื่องของ Automated Deployment เช่น Webhook หรือ Cli ในการสร้าง release, tag version และทุกอย่างอยู่บน Git
Software Management Tools
ไหนๆ ก็มาเล่า Tech Stack แล้ว ก็เลยอยากแชร์ Management Toolsในฝั่งของ Developers ทุกคนใช้ในระหว่างพัฒนาโปรแกรมไปด้วยเลย
Jira จัดการ sprint และ story, tasks
Confluence จัดการเรื่อง Documents
Lucidchart จัดการเรื่อง Diagrams
Slack พิมพ์พูดคุย และระหว่าง WFH จะเป็น Discord สำหรับพูดคุยกันภายในทีม
Google Meet สำหรับ Online Meetingสำหรับใครที่อยากรู้ว่า Developers ที่ RentSpree ทำงานกันยังไงไปอ่านได้ที่ How we perform Agile at RentSpree as a growing startup และ A day at RentSpree
สรุป
สำหรับใครที่อยากรู้เรื่อง Tools ที่เราใช้เพิ่มเติม หรืออยากรู้ว่าทำไมเราถึงใช้ตัวนั้นตัวนี้ สามารถ Comment ไว้ได้เลยนะครับ และถ้ามีโอกาส ผมจะมาเขียนเจาะให้แต่ละส่วนให้ในครั้งถัดไป
และที่เล่ามาทั้งหมด นี้คือสิ่งที่ Full Stack Developer ที่ RentSpree จะได้เรียนรู้และได้ลงมือทำได้ใช้ทุกอย่างตามที่เล่ามาครับ
ถ้าเห็นว่า Stack ของเราเยอะเกินไป ไม่ต้องตกใจครับ เรามีการเทรนนิ่ง และฝึกฝนแบบ Hands-on ซึ่ง Dev ที่ RentSpree จะได้ลองเล่นและลองใช้ สิ่งต่างๆ ที่เล่ามาข้างต้นจนชำนาญ
ใครสนใจอยากมาเป็น Dev ที่ RentSpree สมัครมาได้เลยครับ เรารับอีกเยอะมาก
https://www.rentspree.com/careers-th/
หรือจะเข้าไปทักทายกับเรา ทำความรู้จักกับ Rentspree ได้ที่ช่องทาง Facebook:
https://www.facebook.com/RentSpreeThailand ก็ได้เช่นกัน