Ảnh chân dung Nguyen Tran Tung

Nguyen Tran Tung

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.

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
  1. 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.

  2. 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.

  3. 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.

  4. 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.

  5. 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.

Ngôn ngữ & framework
  • Python
  • Django
  • Flask
  • C# / .NET Core 6
  • PHP
Dữ liệu
  • DynamoDB
  • Redis
  • MySQL
  • PostgreSQL
Hạ tầng & công cụ
  • Celery
  • Docker
  • Docker Compose
  • AWS EC2/S3
  • GitHub Actions
  • Locust
  • Datadog
Frontend
  • ReactJS
  • VueJS
  • Angular
  • PWA