无标题
Đọc một số bài báo của Google.
Đọc một số bài báo của Google.
Đọc vài bài báo của Google
Chiều chủ nhật nằm dài trên giường lướt internet bằng chiếc điện thoại Treo, vô tình thấy bản dịch tiếng Trung của ba bài báo kinh điển nhà Google được cao nhân Myan giới thiệu trên Google Reader. Phải công nhận giao diện di động của Google Reader làm cực kỳ chỉn chu, dù điện thoại cùi bắp cũng dùng mượt mà nhờ thiết kế tối giản tiết kiệm lưu lượng GPRS. Ai chưa dùng qua thì nên trải nghiệm thử!
Ba bài báo này mình đều nghe danh từ lâu. Bài GFS ra đời sớm nhất, cách đây vài năm đồng nghiệp từng gửi bản tiếng Anh cho mình đọc. MapReduce thì thường xuyên nghe các tiền bối bàn luận. BigTable ít tiếp xúc hơn nhưng cũng hiểu đại khái nguyên lý hoạt động. Dù chưa từng đọc bản dịch tiếng Trung (chưa nói đến bản gốc tiếng Anh), mình vẫn nằm dài trên giường mày mò nghiên cứu từ từ qua màn hình điện thoại nhỏ.
Cả ba công trình này đều tập trung giải quyết vấn đề xử lý dữ liệu lớn phân tán. Nhìn qua tưởng chừng đơn giản, không có công nghệ cách mạng, nhưng khi triển khai thực tế lại cực kỳ phức tạp. Độ khó chủ yếu đến từ kỹ thuật triển khai hệ thống.
Những hệ thống ổn định thường có thiết kế đơn giản đến mức ngạc nhiên - dựa vào dữ liệu dư thừa để tăng hiệu suất và độ tin cậy. GFS làm nền tảng cho hai hệ thống còn lại, tận dụng cơ chế thao tác nguyên tử của hệ thống file bản địa mà không tự xây dựng từ đầu. Cách tiếp cận này giúp giảm độ phức tạp đáng kể. Khi thiết kế hệ thống game server của công ty, mình cũng áp dụng nguyên tắc tương tự: thay vì dùng database tiêu chuẩn, mình lưu trữ dữ liệu dựa vào bộ nhớ đệm và hệ thống file local.
GFS sử dụng thiết kế master đơn điểm kiểm soát toàn bộ hệ thống, tạo ra kiến trúc cực kỳ tối giản. Tuy nhiên điều này đòi hỏi phải giảm tải tối đa cho node master, khiến client hầu như không cần giao tiếp trực tiếp với master khi truy xuất dữ liệu. Mình rất đồng tình với nguyên tắc này - thiết kế đơn điểm kiểm soát không phải là điều xấu nếu biết cách phân tầng nhiệm vụ. Ví dụ như server đăng nhập hiện tại của công ty: tất cả người dùng đều đăng nhập qua một điểm duy nhất, nhưng sau khi xác thực xong sẽ ngắt kết nối để giảm tải.
Trong toàn bộ hệ thống, nhiều thành phần có thể thiết kế theo mô hình đơn điểm miễn là nhiệm vụ giao phó đủ đơn giản. Vấn đề điểm nghẽn đơn có thể giải quyết ở tầng kiến trúc thông qua cơ chế retry tự động và khởi động lại nhanh chóng. Dĩ nhiên không phải phần nào cũng áp dụng được, với những module quan trọng vẫn cần cơ chế dự phòng lẫn nhau.
BigTable là công trình khiến mình ấn tượng nhất. Mấu chốt trong thiết kế nằm ở việc xác định đúng yêu cầu cốt lõi, loại bỏ mọi thứ thừa thãi, chỉ giữ lại những chức năng thiết yếu nhất để từ đó tối ưu hiệu năng. Ví dụ như mô hình quan hệ phức tạp không cần thiết, nhưng kiểm soát phiên bản dữ liệu lại là điều bắt buộc. Thay vì hỗ trợ nhiều kiểu dữ liệu phức tạp, chỉ cần lưu trữ chuỗi ký tự là đủ. Những yêu cầu hợp lý này phải được đúc kết từ kinh nghiệm dày dặn mới có thể đưa ra quyết định tối ưu. Người thiết kế phải hiểu rõ những chức năng nào có thể tối ưu cực đại, người vận hành phải phân định được đâu là yêu cầu thiết yếu, đâu là yêu cầu có thể bỏ qua. Điều đó đòi hỏi đội ngũ phát triển vừa có kinh nghiệm thực chiến, vừa đủ khả năng thực hiện ý tưởng.
MapReduce về bản chất không phức tạp. Cốt lõi là tách biệt các nhiệm vụ phân tán thành ba bước: chia dữ liệu, xử lý song song, lọc kết quả dư thừa và hợp nhất kết quả. Hiệu suất tăng lên nhờ xử lý song song bằng cụm máy tính giá rẻ, đồng thời hệ thống tập trung tối ưu vào ba chức năng cơ bản: truyền tải, phân chia và hợp nhất dữ liệu. Đặc biệt là tạo ra sự phân tách rõ ràng giữa vị trí dữ liệu và phép toán xử lý.
Trên đây chỉ là vài suy nghĩ cá nhân, mong các cao thủ lượng thứ. Hiện tại mình chưa có cơ hội trực tiếp xây dựng hệ thống tương tự nên cũng chưa nghiên cứu kỹ các chi tiết. Tuy nhiên mình hiểu rõ rằng nếu thực sự triển khai sẽ gặp vô số khó khăn bất ngờ, khối lượng công việc không hề nhỏ chút nào.
Ngoài ra xin chia sẻ thêm về công việc gần đây. Có đồng nghiệp mới gia nhập, mình giao cho hoàn thiện module quản lý tài nguyên mình bắt đầu dở. Cách vài tháng, đoạn code mình viết trải qua vài lần sửa đổi cuối cùng cũng hoàn thiện, đưa vào kho mã nguồn và chưa thay đổi từ đó. Tuy nhiên lúc đó mới chỉ hoàn thành chức năng load tài nguyên từ hệ thống file local, chưa tích hợp chức năng đóng gói dữ liệu và đọc viết gói tài nguyên.
Mất gần cả tuần trời giảng giải thiết kế và code, may là đồng nghiệp mới thông minh nên đã hiểu được đống code gần nghìn dòng của mình mà không hề có lấy một dòng chú thích. Nhớ lại vài hàm nội bộ đặt tên không chuẩn, có khi chính mình còn phải suy nghĩ mới nhớ rõ ý tưởng ban đầu, thật sự ngại ngùng.
Điều đáng mừng là sau khi người mới nắm rõ, mình cũng ôn lại toàn bộ ý tưởng thiết kế ban đầu. Về cơ bản thiết kế vẫn hợp lý, phần code mới thêm vào không cần thay đổi bất kỳ giao diện cũ, cũng không cần tạo giao diện mới. Thông tin cần ẩn đã giấu tốt, chức năng cần phơi bày đã sử dụng đầy đủ. Code mới và cũ giữ được tính độc lập, không phát sinh công việc trùng lặp.
Có những thứ tưởng chừng đơn giản khi thiết kế, nhưng khi triển khai mới thấy rõ độ phức tạp. Mình cho rằng đó chính là bản chất của công việc kỹ thuật.