Giaosucan's blog - Chia sẻ kiến thức theo cách bá đạo

Ticker

20/recent/ticker-posts

FrequencyTribe - Chatbot

 


FrequencyTribe là 1 bot telegram được phái triển bởi tribers, một startup mới thành lập ở US. Có thể hiểu nhanh đây là 1 auto bot service cung cấp dịch vụ hỗ trợ khách hàng như đăng kí thành viên, gửi báo cáo remind theo schedule, hỏi đáp ….Chi tiết xem ở đây

Ngoài con bot Telegram, hệ thống bao gồm 1 tầng backend và các app front end phía trên dành cho đội quản lý và user

Theo kiến trúc như ở dưới


Architect

Phần backend API sử dụng python django

Django là một trong những Web Framework phổ biến nhất được viết bằng Python, cung cấp nhiều tính năng cho việc phát triển web về bảo mật, database access, session, routing, localization …

Django sử dụng mô hình MVT (Model-View-Template). Về phương thức hoạt động sẽ giống với mô hình MVC, trong đó V (View) sẽ tương đương với C (Controller), T (Template) sẽ tương đương với V (View) ở các framework khác.

Trước đây mình hay xài nodejs hay .netcore để làm phần backend API nhưng sau khi sử dụng Django thấy khá ưng ý, nhất là khả năng từ Code First. Phương pháp tạo các class Model sau đó phát sinh ra database. Mỗi khi cần update database structure chỉ cần sửa code rồi chạy migration là tự động table db được sinh ra và update. Mỗi lần thay đổi db đều được lưu lại thành versions để quản lý

Tuy nhiên, khi làm dự án gặp thanh niên nào nghịch ngợm vào db sửa bằng cơm là chạy lỗi tùm lum, fix thí mẹ luôn.

Con BOT được viết bằng PHP sử dụng API telegram để gửi message tới người dùng, và gọi API backend để thực hiện update dữ liệu dưới db

Phần frontend được viết bằng Angular 9, trước đây toàn code bằng React cho nên khi sang món này thì vừa làm vừa mò. Làm đến đâu GG đến đấy, cũng không phải là quá khó

Hệ thống cũng tích hợp với 1 số 3rd party bên ngoài 

Deployment

Infra dùng cloud của Digital Ocean, đánh giá chất lượng của DO so với AWS thì cũng giống như DO còn phải gọi AWS bằng sư phụ. Tuy nhiên được cái giá rẻ, phù hợp với startup. Lúc đầu, các app được deploy trên server droplet truyền thống. Nhưng sau đó được chuyển sang deploy trên K8S để tận dụng khả năng autoscale của K8S và nhiều lợi thế khác nữa


Ý tưởng cơ bản thì các app deploy trên các pod, expose ra qua ingress controller và ELB. Mỗi khách hàng sẽ được deploy một infra riêng như trên nhưng vẫn dùng chung 1 cluster K8S cho nó rẻ. Mỗi client sẽ được tạo 1 namespace riêng. Có khách hàng mới thì tạo namespace mới.

Jenkins được setup để thực hiện deploy tự động mỗi khi có PR merge vào bản master. App sẽ được deploy lên staging trước để verify, sau khi chạy ổn mới deploy lên production

Mình có setup thêm 1 k8S dashboard để developer có thể truy cập view các thông tin về infra như tính trạng memory, cpu xem log để debug….

Hệ thống còn nhiều vấn đề còn tồn đọng do developer đời trước để lại như

  • Các API thực hiện query join nhiều bảng và thực hiện select kiểu all data trong db dẫn tới performance quá chậm

  • Mỗi khách hàng sẽ có những features, info khác nhau như text, message display, configuration. Cần dùng 1 bộ code base duy nhất nhưng có thể deploy cho nhiều khách hàng khác nhau, chỉ cần thay đổi config

  • Một số chức năng như event reminder không handle những time zone sử dụng time DST dẫn tới thời gian remind bị sai lệch

Muốn biết các vấn đề trên được giải quyết ra sao, đón đọc phần tiếp theo


Đăng nhận xét

3 Nhận xét

  1. mình nên tìm hiểu như thế nào để có thể deploy app trên droplet sang k8s? Thanks!

    Trả lờiXóa