Duolingo và Thử Thách Khổng Lồ: Bí Mật Gửi 4 Triệu Notification Siêu Tốc

folder Tin tức công nghệ 24h
today 26/07/2024 22:31
Và đó là các thông báo từ con chim xanh "bố láo" của ứng dụng Duolingo 😂😂😂. Những chiến dịch truyền thông và đội content của Duolingo đã rất thành công để giữ chân người dùng.
duolingo-va-thu-thach-khong-lo:-bi-mat-gui-4-trieu-notification-sieu-toc

Góp phần đưa ứng dụng này trở thành một ứng dụng nổi tiếng có 500 triệu người đã đăng ký tài khoản, với 32.4 triệu daily active user. Có đến 100 khóa học cho hơn 40 ngôn ngữ khác nhau.

image.png

Đó là nhờ đội marketing vô cùng đỉnh của chóp.

Cùng tìm hiểu một bài toán cực khoai mà đội Dev phải đối mặt do yêu cầu từ đội marketing này nha****

1. Nhiệm vụ của đội Developer

Để thêm quảng bá cho sản phẩm thì team marketing đã có kế hoạch chạy một quảng cáo dài 5 giây trong Super Bowl (sự kiện thể thao lớn nhất tại Mỹ, diễn ra hàng năm vào đầu tháng Hai), sự kiện có 123,4 triệu người xem, con số cao nhất trong lịch sử. Quảng cáo dự kiến sẽ có sự xuất hiện của "mông Duo" (linh vật của Duolingo) và đội marketing cũng muốn gửi thông báo đẩy (Push notification) đến thiết bị của người dùng ngay khi quảng cáo được phát sóng

image.png

Nhưng việc quảng cáo chỉ chiếu trong 5 giây và cần gửi để người dùng có thể nhận ngay thông báo ngay khi quảng cáo được phát sóng đã đặt ra một bài toán vô cùng khó khăn cho anh em dev tại Duolingo.

Họ cần phải gửi Push notification đến 4 triệu người trong vòng 5s, tương đương cần gửi 800.000 noti mỗi giây. Trong khi hệ thống thông báo của họ hiện tại đang chỉ chịu tải khoảng 10,000 thông báo mỗi giây. Tức là cần nâng cấp để có thể xử lý gấp 80 lần hệ thống hiện tại.

image.png

Nhưng chiến dịch quảng cáo này không chỉ khó ở việc cần gửi lượng thông báo lớn mà họ cần xem xét cẩn thận mọi thứ, ví dụ điển hình là hệ thống Coinbase vào năm 2022, Coinbase đã tung ra một chiến dịch quảng cáo với mã QR nảy trên màn hình. Chiến dịch này đã thu hút quá nhiều người truy cập vào trang web của Coinbase đến mức làm sập trang web của chính họ. Nghĩa là họ đã tự DDOS chính mình

Ứng dụng Android của Duolingo có một vấn đề là khi mỗi thông báo được gửi đi sẽ tạo ra một yêu cầu ngược lại về phía máy chủ. Điều này có thể gây quá tải hệ thống nếu gửi một lượng lớn thông báo cùng lúc. Và họ không muốn bị như Coinbase.

2. Kiến trúc hệ thống

Để làm được bài toán này đội ngũ kỹ sư tại Duolingo có 3 bài toán khó:

  1. Tốc độ: họ cần phải đạt được tốc độ gấp 80 lần hệ thống hiện tại: 800,000 noti/s
  2. Scale: Do triển khai hạ tầng trên AWS, họ cần đảm bảo hệ thống có thể scale đáp ứng được lượng tải cao, và tối ưu chi phí phải bỏ ra
  3. Thời gian: Vì do quảng cáo vào một sự kiện thể thao, nên thời điểm nhà đài phát quảng cáo của sẽ rất khó xác định do thời gian bù giờ, thời gian chấn thương. Do đó họ không biết chính xác khi nào quảng cáo của bạn sẽ được phát sóng

Họ đã triển khai hệ thống có design như sau:

Do họ không biết chính xác khi nào quảng cáo của bạn sẽ được phát sóng. Họ đã thiết kết hệ thống với một nút màu đỏ hình vuông, và đội marketing sẽ theo dõi trực tiếp truyền hình và bấm nút ngay khi quảng cáo vừa xuất hiện trên tivi.

Còn tại sao là nút hình vuông thì mình sẽ nói sau ha. Và đội ngũ cần đảo bảo nếu hai người trong đội marketing bấm nút cùng lúc thì sẽ không bị gửi trùng lặp đến người dùng.

image.png

Tổng quan thì đây là một kiến trúc bất đồng bộ và sử dụng các service trên AWS

Vậy hệ thống hoạt động như nào nhỉ???

  1. Trước sự kiện vài tháng:

Họ sẽ tạo ra một chiến dịch thông báo gồm danh sách toàn bộ User Id sẽ nhận được thông báo. Server sẽ lấy dữ liệu từ DynamoDB một cách bất đồng bộ (asynchronously). Dữ liệu được lấy về sẽ được xử lý và đẩy vào lưu trữ tại AWS S3. Kết quả cuối cùng được ghi log lại vào Cloudwatch để đội kỹ sư có thể theo dõi.

image.png

  1. Vài tiếng trước khi sự kiện diễn ra

Đội kỹ sư sẽ scale số lượng Interim worker trong ECS Cluster lên khoảng 20 con interim worker, cụm notification được scale lên hơn 5000 con notification worker, giúp cho số lượng worker đủ để chịu tải.

image.png

20 interim workers này sẽ chịu trách nhiệm lấy trước dữ liệu từ Amazon S3 đã được lưu từ trước và lưu trữ vào bộ nhớ in-memory. Bước này rất quan trọng vì nó cho phép hệ thống truy cập nhanh chóng vào dữ liệu cần thiết khi quá trình gửi thông báo bắt đầu, từ đó giảm độ trễ và đảm bảo rằng các thông báo có thể được gửi đi trong vòng vài giây. Dữ liệu này bao gồm cả thông tin mapping giữa UserId và DeviceId. Toàn bộ quá trình sẽ được log để theo dõi trên CloudWatch.

  1. Thời điểm diễn ra sự kiện

Vào ngày diễn ra sự kiện, đội marketing cầm trên tay bỏng ngô và cái nút kích hoạt hình vuông màu đỏ, theo dõi và chờ thời điểm quảng cáo của Duolingo được phát sóng.

image.png

Thời điểm vàng đã đến, họ bấm nút, API server sẽ nhận request và gửi hơn 50 message đến FIFO Queue.

Interim Worker nhận message từ FIFO queue và phân phối hơn 10,000 message đến queue tiếp theo.

Các con worker hoạt động song song và lượng message được gửi đến SQS này cần đạt tới 800,000 message/s. Nhưng do SQS có giới hạn chỉ được gửi 120.000 mỗi giây. Họ đã gom nhóm 500 IOS user vào chung 1 message, 250 Android User vào chung một message. Rồi mới đẩy các nhóm vào SQS, điều này giúp họ lách được giới hạn của queue và đạt được rate 800,000 message/s

Hơn 500 con worker có nhiệm vụ gửi noti đang chờ sẵn và nhận các message và tiến hành gửi push noti bằng cách gọi đến API của APNS (Apple Push Notification Service) và FCM (Firebase Cloud Messaging), và từ đó các thiết bị Apple, Android của người dùng sẽ nhận được 1 push noti của Duolingo ngay khi quảng cáo vừa được phát vài giây.

Tại sao họ lại dùng FIFO queue nhỉ?

image.png

3. Thành quả xứng đáng

Vào ngày diễn ra sự kiện Super bowl, các kỹ sư theo dõi mọi thứ qua zoom cùng nhau để scale hệ thống, khi quảng cáo xuất hiện, đội marketing bấm nút, Bum. Hệ thống được kích hoạt, 99% thông báo đã được gửi trong 5.7s, trong đó có 95% được gửi trong 3.9 giây. Một kết quả vô cùng ấn tượng, tạo ra hiệu ứng lan truyền mạnh mẽ trên mạng xã hội. Chiến dịch này không chỉ giúp Duolingo tăng lượng người dùng đáng kể mà còn củng cố hình ảnh thương hiệu độc đáo và hài hước với hình ảnh mông của con chim xanh

After Credit

image.png

Việc họ dùng nút màu đỏ hình vuông thay vì hình tròn là do họ phát hiện ra, với các nút hình tròn khi nhấn vào các góc của nút bấm, mặc dù các góc này có màu trắng và không nằm trong vùng tròn, nhưng nó vẫn kích hoạt chức năng của nút.

Hiện tượng này trong thuật ngữ trò chơi điện tử được gọi là "hitbox" (vùng tương tác), nơi vùng tương tác thực tế của nút vẫn là một hình vuông dù nút hiển thị là hình tròn.

Do đó, để tránh lỗi do con người và đảm bảo mọi người đều biết rõ vùng nào cần nhấn, nhóm đã quyết định thay đổi nút bấm từ hình tròn sang hình vuông. Việc này giúp người dùng nhận biết rõ ràng hơn về vùng tương tác của nút, giảm nguy cơ nhấn nhầm.

Qua đó thấy được sự tỉ mỉ của anh em dev tại Duolingo

Bài viết cùng chuyên mục

hatonet

Sử dụng GitHub Copilot sao cho hiệu quả

today 27/06/2024 16:30
GitHub Copilot là một công cụ hỗ trợ lập trình được phát triển bởi GitHub và OpenAI. Sử dụng trí tuệ nhân tạo (AI), Copilot giúp lập trình viên viết mã nhanh hơn và hiệu quả hơn bằng cách gợi ý đoạn mã, hàm, và thậm chí là cả cấu trúc chương trình dựa trên ngữ cảnh mà bạn đang làm việc. Công cụ này tích hợp trực tiếp vào các môi trường phát triển như Visual Studio Code, giúp cải thiện trải nghiệm lập trình của người dùng.
Xem thêm arrow_right_alt
hatonet

Công cụ tính lương Net và Gross của Devwork

today 19/06/2024 14:48
Trong môi trường làm việc hiện đại, việc hiểu rõ về lương Gross và lương Net là điều rất quan trọng đối với cả người lao động và nhà tuyển dụng. Đặc biệt, đối với những người mới bắt đầu đi làm hoặc đang có nhu cầu thay đổi công việc, việc biết chính xác mức lương mà mình sẽ nhận được sau khi trừ thuế và các khoản khấu trừ khác là một yếu tố quyết định quan trọng. Để hỗ trợ người dùng trong việc này, Devwork đã phát triển công cụ tính lương Net và Gross, giúp người dùng dễ dàng chuyển đổi và ước tính mức lương của mình.
Xem thêm arrow_right_alt
hatonet

Công cụ tính tiền Nenkin của Devwork

today 19/06/2024 14:15
Việc sống và làm việc tại Nhật Bản mang lại nhiều cơ hội cho người lao động Việt Nam. Một trong những quyền lợi quan trọng mà người lao động ngoại quốc cần biết là việc hoàn thuế Nenkin sau khi kết thúc hợp đồng lao động tại Nhật. Hiểu rõ về Nenkin và các thủ tục liên quan có thể phức tạp đối với nhiều người. Để giải quyết vấn đề này, Devwork đã phát triển công cụ tính tiền Nenkin, giúp người lao động dễ dàng ước tính số tiền Nenkin mà họ sẽ nhận được sau khi về nước.
Xem thêm arrow_right_alt

Việc làm tại Hatonet

- ECパッケージシステムのフロントエンド(React)開発に参加。 - 主に新機能の開発を担当し、あわせてバグ修正やUI/UXの改善も行いました。

  • ReactJS
Remote
1. Technology stack: ● Front-End: Angular (primary framework), PrimeNG (UI widget library), and Tailwind CSS (styling framework). ● The developer must ensure seamless integration of the UI with the existing back-end infrastructure. 2. Project timeline: ● The foundational technology has been validated, and the current focus is on building the administrative UI layer, requiring significant front-end development. ● A soft launch is scheduled for September 2025, described as a market introduction to collect feedback rather than a full commercial release. ● The project is initially short-term, with potential for scaling based on market feedback and customer interest (some customers have already expressed interest). 3. Administrative requirements: ● A Non-Disclosure Agreement (NDA) is required to protect confidential project information. NKKTECH will provide an NDA template. ● The developer must pass a background check (e.g., verification of no criminal record, potentially via a US service like E-Verify) 4. Work environment: ● Remote: (14h-18h and 20h-24h) 5. Selection process: 2 Rounds • Round 1: Will conduct an interview to assess English proficiency and technical skills. • Round 2: The clientwill conduct interviews, which may involve discussing code samples to evaluate technical skills. Live coding tests are not confirmed but possible. • The selected candidate must pass a background check and sign an NDA before onboarding.

  • AngularJS
Remote