#148 - Facebook scales hệ thống live stream cho hàng triệu người xem như thế nào?
Thứ 7 (21/11/2020) vừa rồi, tại văn phòng Axon đã diễn ra Grokking Techtalk #39 với hai chủ đề Gossip Protocol and applications và How to build an event driven architecture with Kafka & Kafka Connect được anh Nguyễn Anh Tú và Nguyễn Văn Lợi chia sẻ. Nếu bạn không thể tham gia sự kiện vừa rồi, bạn có thể xem lại livestream tại đây.
Những bài viết hay
Scaling Live streaming for millions of viewers - Facebook Engineering — engineering.fb.com
Facebook xây hệ thống live stream đáp ứng cho cả người dùng cá nhân lẫn những chương trình chuyên nghiệp như giải bóng đá La Liga, CONMEBOL, and UEFA.
Các kỹ sư tại Facebook đã xây dựng hệ thống như thế nào để phục vụ live stream cho các sự kiện lớn như trận đấu chung kết UEFA Champions League với hàng triệu người xem cùng lúc?
Tiếp nhận dữ liệu đáng tin cậy - Reliable ingestion
Các chương trình truyền hình thường giữ mọi thứ trên các đường truyền riêng, thường là hai đường truyền cáp quang độc lập hoặc một đường truyền cáp quang và một đường truyền vệ tinh dự phòng. Để phục vụ các chương trình phát sóng có lượng người xem cao, Facebook tận dụng cơ sở hạ tầng của chương trình truyền hình với bộ mã hoá riêng và được kết nối với các Data Centers của Facebook. Facebook cũng xây dựng cơ chế cho phép chuyển đổi từ luồng dữ liệu chính (main streams) sang luồng phụ một cách tự động hoặc thủ công trong trường hợp có sự cố. Điều này nhằm đảm bảo trải nghiệm người dùng vẫn hoàn hảo.
Truyền tải dữ liệu tới người xem
Ngoài việc tiếp nhận video từ nhà cung cấp một cách liền mạch, Facebook cũng cần giải quyết bài toán phân phối nội dung video đến hàng triệu người xem. Với những sự kiện lớn như giải bóng đá UEFA Champions League, hay các trận cầu siêu kinh điển, số lượng người theo dõi có thể lên đến hàng triệu thậm chí nhiều hơn. Điều này tạo ra một lượng lớn người xem tăng vọt khi Live stream vừa bắt đầu. Facebook đã xây dựng cơ sở hạ tầng mạnh mẽ và liên kết với các nhà mạng (ISP) để đảm bảo hệ thống vẫn hoạt động tốt trong trường hợp phải phục vụ lượng lớn người dùng cùng lúc.
Cho dù đã đạt được những thành công bước đầu, Facebook cũng nhận ra một số vấn đề như việc phân phối qua sóng vô tuyến là một thách thức lớn vì những hạn chế của công nghệ di động. Qua đó họ đang nguyên cứu áp dụng LTE-Broadcast để giải quyết bài toán trên.
JavaScript Best Practices for Readable and Maintainable Code — blog.bitsrc.io
Any fool can write code that a computer can understand. Good programmers write code that humans can understand.
- Martin Fowler
Martin Fowler đã nhấn mạnh tầm quan trọng của việc code sao cho người khác có thể hiểu. Một nguyên nhân đơn giản là các sản phần mềm đa số được thiết kế và implement bởi nhiều người, và qua nhiều "thế hệ", người viết code có thể không phải là người maintain. Sau đây là một số best practices được Mahdhi Rezvi liệt kê, tuy bài viết được viết trong ngữ cảnh Javascript nhưng chúng có thể được áp dụng cho bất kì ngôn ngữ nào khác.
Góc Distributed System
Đối với bài toán event messaging, chúng ta cần một hệ thống có đủ high availability, scalability và hỗ trợ nhiều ngôn ngữ cho client-side. Một giải pháp phổ biến hiện nay là sử dụng Kafka. Có bao giờ bạn tự hỏi ngoài Kafka thì còn giải pháp nào khác không ? Đáp án thì có nhiều: RabbitMQ, ActiveMQ, NATS, Apache Pulsar, etc. Trong các giải pháp này, NATS có một số điểm khác biệt:
NATS cung cấp cơ chế log-based streaming giúp việc lưu trữ và replay messages dễ dàng; thay cho việc phải cố gắng persist messages.
NATS streaming subscribers vẫn có thể nhận được message gửi đi trong thời gian chúng offline thông qua cơ chế buffer.
NATS có hệ sinh thái đa dạng về Streaming và clients ở nhiều ngôn ngữ: Go, Python, Ruby, Node.js, Elixir, Java, C và C#, Arduino, Rust, Lua, PHP, Perl.
NATS đã được đưa vào incubator-level projects của CNCF, hứa hẹn sẽ được lựa chọn để tích hợp vào rất nhiều giải pháp trong hệ sinh thái của CNCF.
Góc DS tuần này giới thiệu tới các bạn loạt bài viết chi tiết về cách áp dụng NATS ở Choria.io :
Góc Database
The Absolute Minimum Everyone Working With Data Absolutely, Positively Must Know About File Types, Encoding, Delimiters, and Data types — theonemanitdepartment.wordpress.com
Bạn đã từng làm việc với data?
Bạn có bao giờ làm việc với tập dữ liệu có nhiều hàng và cột không?
Bạn đã bao giờ gặp phải một trong những vấn đề sau đây:
Các ký tự kỳ lạ xuất hiện ở giữa một từ: à © €µ.
Các hàng đột nhiên có nhiều hoặc ít cột hơn hoặc các giá trị kết thúc trong cột bị sai.
Dữ liệu về ngày hoặc số không được load theo cách bạn mong đợi.
Có một số insight về cách dữ liệu được lưu trữ mà bạn nên biết để giải quyết những vấn đề này. Nếu bạn làm việc với dữ liệu, bài viết này sẽ giúp ích cho bạn khá nhiều:
File types – and why CSV files are not Excel files
Encoding – and why text does not exist
Byte Order Mark – and why text exists
Newlines – and why everything is text
Delimiters – and why columns don’t exist
Data types – and why numbers and dates don’t exist
Bloom Filters by Example — llimllib.github.io
Bloom filter là cấu trúc dữ liệu xác suất (probabilistic data structure), được thiết kế để cho bạn biết một phần tử có trong một tập hợp hay không một cách nhanh chóng và hiệu quả. Nếu kết quả trả về là False thì chắc chắn phần tử sẽ không nằm trong tập xác định. Nhưng vì dựa vào xác suất, nên nếu kết quả trả về là True thì phần tử chưa chắc đã nằm trong tập xác định.
Cấu trúc dữ liệu cơ sở của Bloom Filter là một Bit Vector. Nguyên lý hoạt động của Bloom Filter tương đối đơn giản. Khi một phần tử được thêm vào, giá trị của nó sẽ được hash, lấy một vị trí trong mảng bit và chuyển vị trí này thành 1. Để kiểm tra một phần tử tồn tại trong một tập hơp hay không, Bloom filter sẽ kiểm tra giá trị băm của phần tử và bit tương ứng trong dãy bits đã được chuyển thành 1 hay chưa. Trong bài viết, tác giả sẽ phân tích kĩ hơn về cơ chế của Bloom Filter.
Về mặt ứng dụng, một số database như Google Bigtable, Apache HBase, Apache Cassandra và PostgreSQL sử dụng bộ lọc Bloom để giảm tra cứu đĩa cho các hàng hoặc cột không tồn tại, hoặc để kiểm tra liệu một partition key có nằm trong một partition data hay không. Việc tránh tra cứu ổ đĩa tốn kém sẽ làm tăng đáng kể hiệu suất của hoạt động truy vấn cơ sở dữ liệu.
Code & Tools
Tin tức khác
GitHub Reinstates Youtube-DL — torrentfreak.com
GitHub đã phục hồi lại repo youtube-dl sau khi kết luận rằng repo này không vi phạm đạo luật bản quyền Digital Millennium Copyright Act.
This week sponsor
Established in 2012, Chotot.com is the leading online classified website in Vietnam with more than 1,2 billion monthly page views, 10 million monthly users, 3,6 million transactions in 2019. With the motto “Muốn Là Có” (“A Way to Your Wants”), Chotot.com provides an effective online marketplace for Vietnamese to buy and sell various types of products easily. For more information, please visit www.chotot.com.
Góc tuyển dụng
ChoTot create product using a variety of open source and cloud native technologies, to name some: Kubernetes, Kafka, Elastic Search, PostgreSQL, MongoDB, TimescaleDB. We utilize Google Cloud Platform, such as Airflow, Argo, Data Catalog, Google AI Platform, Google BigQuery, Google Analytics, Superset for our infrastructure needs while running our heavy workloads on our own on-premises infrastructure. Visit careers.chotot.com to learn more about our vacancies and company culture.
Quotes
"Evolution is necessary to meet the challenges of a changing world and to incorporate new ideas."
- Bjarne Stroustrup