Hơn 10 năm làm backend, 5 năm gần đây tập trung vào hệ thống live game trên Django và .NET Core. Phần lớn công việc là giữ dữ liệu không sai khi nhiều người chơi cùng ghi vào một chỗ, cho job chạy đúng lịch trên nhiều worker, load test trước khi lên production, và migrate hệ thống cũ sang stack mới mà không có downtime. Phần lớn những việc đó đều làm từ đầu đến cuối — viết design, code, test, rồi theo dõi lúc chạy thật.
Ownership một feature từ đầu đến cuối — design, code, test, monitor
Thiết kế data model chịu được ghi đồng thời
Load test feature mới để chuẩn bị scale server và DB trước khi phát hành
Migrate hệ thống đang chạy mà không có downtime
Công việc tiêu biểu
PvP Tournament
Lập lịch job phân tán
Giải đấu chạy lặp theo lịch, nhưng người chơi rải khắp các múi giờ, nên cùng một sự kiện phải diễn ra đúng giờ địa phương của từng người. Lịch dựng trên rrule; một master job điều phối các slave job phân phối phần thưởng và cập nhật leaderboard, tất cả chạy trên Celery với Redis làm broker, còn RedBeat cho phép đổi lịch ngay lúc hệ thống đang chạy mà không cần deploy lại. Bảy Celery app tách riêng, mỗi app một Redis và một cụm worker, nên một giải đang trả thưởng hàng loạt không làm nghẽn hàng đợi của tính năng khác.
Python
Celery
Redis
rrule
Daily Boss
Xử lý ghi đồng thời
Cả faction cùng đánh một con boss, nên damage của hàng loạt người chơi đổ vào cùng một bản ghi trong vài giây. Atomic DynamoDB update kèm conditional expression giúp các lượt submit không ghi đè lên nhau, không còn mất dữ liệu do race condition. Leaderboard theo faction và theo member dựng trên Redis sorted set — cộng điểm bằng zincrby thay vì đọc rồi ghi lại, lấy thứ hạng bằng zrevrank thay vì quét cả tập. Phần thưởng trả qua Celery job theo mốc damage và ngưỡng faction; toàn bộ luồng được phủ bằng unit test.
DynamoDB
Redis sorted sets
Celery
Atomic writes
Unit tests
Tactics Event
Kiến trúc service
Chuẩn hóa kiến trúc phân tầng (view/controller/service/manager/model) và pattern theo dõi tiến trình, hiện dùng chung cho mọi event system. Xây dựng cơ chế mở tier động, tự khởi tạo tier mới khi sự kiện đang diễn ra mà không cần full table scan. Sửa lỗi ghi nested attribute trên DynamoDB rồi áp dụng lại cách xử lý này ở các hệ thống khác.
Architecture
Design patterns
DynamoDB
Faction Feud
Migration & load test
Migrate Faction Feud từ Python 2 sang .NET Core 6, chuyển toàn bộ API mà không có downtime. Dựng mô hình hành vi người dùng bằng Locust ở mức người chơi đồng thời cao nhất mà một feature mới có thể kéo về, rồi đo API mới và API đã sửa theo mức đó. Kết quả dùng để chốt kịch bản scale server và database trước ngày phát hành, đồng thời chỉ ra các điểm nghẽn cần xử lý trước.
C# / .NET 6
Locust
Load testing
Capacity planning
Kinh nghiệm
Game Server Engineer
09/2021 – Hiện tại
Gear Games · Hà Nội
Hệ thống live event quy mô lớn — xem phần Công việc tiêu biểu ở trên.
Web Developer
07/2018 – 11/2021
Gear Games · Hà Nội
Xây tính năng cho công cụ LiveOps nội bộ dùng để điều khiển dữ liệu game đang chạy; phối hợp với team Unity và server thiết kế cấu trúc dữ liệu cho các bản phát hành mới.
Full Stack Developer
12/2017 – 06/2018
Software Outsourcing Vietnam (ICTS) · Hà Nội
Làm việc trực tiếp với khách hàng tại Nhật; triển khai bireki.jp (ReactJS, AWS EC2) và app Relotalent dạng PWA.
Web Developer
03/2016 – 01/2018
VTC Game · Hà Nội
Bắt đầu từ website marketing cho các đợt ra mắt game, sau chuyển sang VTCPay.vn — cổng thanh toán quy mô quốc gia, lần đầu tiếp xúc vận hành hệ thống lớn. Cũng đóng góp cho We25.vn và Game8.vn.
PHP Web Developer
09/2014 – 02/2016
MQ ICT Solutions · Hà Nội
Xây và bảo trì ứng dụng web PHP/MySQL cho dự án outsourcing khách hàng tại Nhật — lần đầu tự chịu trách nhiệm cả một codebase production.