Vì sao tôi viết một cuốn sách về BEAM (Erlang VM)
(happihacking.com)- Từ kinh nghiệm thực chiến khi duy trì các hệ thống cốt lõi của Klarna, chỉ một lần BEAM dừng 15 mili giây cũng có thể gây ra sự cố thanh toán trên diện rộng và buộc phải ứng phó khẩn cấp
- Tác giả đã dành 10 năm để viết sách với mong muốn tạo ra một tài liệu tham chiếu đáng tin cậy về BEAM
- Trong quá trình viết, tác giả nhiều lần trải qua thất bại và làm lại do đổi nhà xuất bản, vấn đề kỹ thuật và việc tái cấu trúc liên tục
- Sau khi mã nguồn được mở, phản hồi và sự tham gia của cộng đồng, số sao tăng lên và những lời động viên đã trở thành nguồn khích lệ bền bỉ
- Nội dung cốt lõi tập trung vào cấu trúc và vận hành của BEAM VM, được xây dựng để thực sự hữu ích cho các kỹ sư làm việc thực tế
Động lực viết sách về BEAM
Post-mortem, cà phê và 10 năm kiên trì
- Khi vận hành hệ thống thanh toán cốt lõi tại Klarna, tác giả đã nhiều lần trải qua tình huống mà chỉ 15 mili giây gián đoạn của BEAM dẫn tới hàng triệu giao dịch thanh toán thất bại, các cuộc họp khẩn lúc rạng sáng và cả việc CEO bị gọi vào xử lý
- Tác giả luôn thấy tiếc vì thiếu tài liệu có thể giúp giải quyết nhanh những khủng hoảng như vậy, và đã viết The BEAM Book với hy vọng kỹ sư tiếp theo có thể xử lý vấn đề nhanh hơn
Quá trình viết ban đầu
Khởi đầu và thất bại
- Tháng 10/2012, dự án bắt đầu với một file DocBook cùng rất nhiều tham vọng
- Các commit trong 2 tuần đầu chủ yếu tập trung vào cấu trúc và cập nhật metadata, còn nội dung thực tế thì rất ít
- Sang tháng 11, tác giả chuyển sang AsciiDoc và custom build script và kỳ vọng hoàn thành trong 6 tháng, nhưng tiến độ rất chậm do liên tục viết lại và thay đổi cấu trúc
Hợp tác với nhà xuất bản
- Năm 2013, sau khi ký hợp đồng xuất bản với O’Reilly, tác giả di chuyển sang Atlassian Atlas nhưng liên tục gặp vấn đề mất file và quản lý chương
- Lịch sử Git dày đặc những lời than phiền và các lần chỉnh sửa cấu trúc
- Tháng 3/2015, tác giả thử các biện pháp tình thế như ép tách nội dung theo từng chương chỉ để build có thể chạy qua
- Hai tháng sau, hợp đồng bị chấm dứt một cách lặng lẽ, để lại cảm giác vừa tự ti vừa nhẹ nhõm
- Nỗ lực thứ hai với Pragmatic Bookshelf cũng dừng lại trong bối cảnh tiến độ chậm chạp
Thiết lập lại và sự tham gia của cộng đồng
- Tháng 1/2017, toàn bộ nội dung được chuyển sang repo mới bằng một massive commit (6622 file, 1 triệu dòng), nhưng việc viết lại vẫn tiếp tục đình trệ
- Tháng 3/2017, tác giả bắt đầu lại trong một repo GitHub riêng tư dựa trên Asciidoctor, chỉ sao chép những phần cần thiết
- Hai tuần sau khi chuyển sang công khai, các đóng góp từ bên ngoài như sửa typo, thêm sơ đồ và hỗ trợ về giấy phép đã xuất hiện rất tích cực
Những yếu tố tạo động lực bền bỉ
- Về bản chất, động lực lớn nhất là sự tò mò và mong muốn cá nhân nhằm hiểu BEAM thực sự hoạt động như thế nào
- Phản hồi và đề xuất từ cộng đồng giúp tăng quyết tâm viết tiếp, còn số sao trên GitHub tăng lên tạo ra hiệu ứng khích lệ kéo dài
- Các issue động viên như “Please continue being awesome” cũng đóng vai trò hỗ trợ tinh thần rất lớn
- Việc cuốn sách ngày càng được trích dẫn thường xuyên tại các hội thảo và conference liên quan tới Erlang và BEAM đã chứng minh nhu cầu thực tế của nó
- Những lần được nhắc đến và chia sẻ liên tục trên Twitter và các nơi khác cũng thúc đẩy tác giả tiếp tục viết
Cấu trúc sách và đối tượng độc giả chính
- Nội dung được viết xoay quanh những phần mà tác giả thực sự thấy cần thiết khi trực tiếp thiết kế và vận hành các hệ thống Erlang quy mô lớn
- Scheduler và quản lý process: nguyên lý scheduling process, độ ưu tiên và cân bằng trong tải thực tế
- Bộ nhớ của process: cách quản lý heap, stack, message, binary và tác động tới vận hành
- Garbage collection và mô hình bộ nhớ: cách GC theo từng process/toàn cục hoạt động, rò rỉ bộ nhớ và cấu trúc tham chiếu
- Hệ thống biểu diễn dữ liệu: cấu trúc tagging nội bộ của dữ liệu như số nguyên, số thực, tuple, binary
- Compiler và cấu trúc bên trong VM: luồng thực thi lệnh thực tế trong VM sau biên dịch
- Tracing và debugging:
dbg,erlang:trace, theo dõi message và event - Tối ưu hiệu năng: profiling mã thực tế, phân tích nguyên nhân độ trễ, cách hiểu reduction
- Kiến trúc hệ thống: nguyên lý phối hợp hoạt động giữa ERTS, BEAM VM và các subsystem
- Sách có tác động rất thực tế với người vận hành Erlang/Elixir trong môi trường production, và mục tiêu cốt lõi là trở thành một cẩm nang tổng hợp đáng tin cậy thay cho các tài liệu rời rạc
Bài học rút ra từ quá trình viết
- Sự bền bỉ thắng chủ nghĩa cầu toàn. Ngay cả hai lần bị hủy xuất bản cũng dẫn tới kết luận rằng hoàn thành vẫn tốt hơn để dang dở
- Tập trung và thiết lập ranh giới là rất quan trọng. Việc dành riêng thời gian viết, tắt thông báo và quản lý thời gian nghiêm ngặt là nguồn gốc của tiến triển thực sự
- Công khai và phản hồi là chìa khóa để nâng cao chất lượng. Hiệu đính, động viên và kích thích đều đặn từ bên ngoài giúp ích rất nhiều
- Quản lý phạm vi là điều bắt buộc. Nhờ điều chỉnh phạm vi, các chủ đề khó như Dirty Scheduler hay JIT được chuyển sang phụ lục sau này
- Chiến lược cải tiến lặp lại sau khi phát hành là rất quan trọng. BEAM thay đổi mỗi năm, và một repo Git sống có thể tiếp tục được bổ sung
- Việc đặt ra deadline thật sự là động lực thực tế. Mốc phải in xong trước sự kiện Code Beam Stockholm đã buộc tác giả chọn lọc những nội dung thiết yếu
Định nghĩa của sự hoàn thành
- Chỉ khi thực sự cầm bản in trên tay, tác giả mới cảm thấy đó là lúc có thể gọi là “hoàn thành”
- Những commit rời rạc cuối cùng đã được gom lại thành một thực thể là một cuốn sách, và tính tới hiện tại tác giả tuyên bố hành trình này đã kết thúc
Cách tham gia
- The BEAM Book 1.0 hiện có thể mua bản giấy trên Amazon
- Nếu phát hiện lỗi chính tả, điểm cần cải thiện hoặc muốn tìm hiểu về cấu trúc bên trong, bạn có thể dùng star, fork, đăng issue và pull request trong repo GitHub
- Tên thật của người đóng góp sẽ được nhắc tới trong phần cảm ơn
- GitHub: theBeamBook
- Vì review thực tế ảnh hưởng lớn hơn tới thuật toán nên tác giả cũng tích cực kêu gọi viết nhận xét
- Tác giả cũng có thể tổ chức workshop về BEAM internals xoay quanh các hệ thống thực chiến; liên hệ qua email happi@happihacking.com
1 bình luận
Ý kiến trên Hacker News
Có thể xem kho git tại đây
Động lực của tác giả khi cứ tiếp tục đào sâu chỉ vì muốn thực sự hiểu BEAM gây ấn tượng mạnh. Tôi nghĩ chính kiểu đam mê này tạo ra những thành quả tuyệt vời. Vì vậy tôi quyết định mua ngay. Chia sẻ từ trải nghiệm của mình thì tôi đã nhiều lần nhận được đề nghị viết sách từ nhà xuất bản, nhưng chưa lần nào thành vì định hướng hai bên khác nhau. Ví dụ, tôi không muốn viết sách nhập môn Java cho đối tượng 14 tuổi, còn nhà xuất bản thì lại không quan tâm đến những chủ đề tôi thích đào sâu, như
classloader. Tôi tò mò không biết người khác tìm giao điểm giữa đam mê cá nhân và nhu cầu độc giả như thế nàoTrải nghiệm làm việc với BEAM và Erlang/OTP là một trong những trải nghiệm phát triển tốt nhất của tôi trong suốt năm qua. Tôi đã dùng cuốn “Programming Erlang: Software for a Concurrent World” của Joe Armstrong và rất muốn khuyên người mới nên đọc. “Designing for Scalability with Erlang/OTP” cũng được đánh giá cao nhưng tôi vẫn chưa bắt đầu. Tuy vậy, xét về độ sâu thì cuốn sách lần này áp đảo hoàn toàn. BEAM thực sự giống như công nghệ ngoài hành tinh do một nền văn minh cổ đại để lại. Cuốn sách này xuất hiện đúng thời điểm nên tôi mua ngay. Tôi thật sự khâm phục tiến sĩ Erik Stenman vì đã hoàn thành cuốn sách dù đã hai lần bị hủy xuất bản
Elixir và BEAM là lựa chọn ưa thích nhất của tôi khi xây dựng các hệ thống dựa trên mạng hoặc có nhiều pipeline. Tôi đã dùng chúng mỗi ngày trong production suốt nhiều năm, và dù ở các dự án gần đây việc lựa chọn không còn dễ dàng nữa, tôi vẫn luôn theo dõi xu hướng. Cảm ơn vì cuốn sách này đã được xuất bản. Vài năm trước, khi debug Elixir trên production, đây chính xác là cuốn sách mà tôi rất muốn có. Tài liệu sẵn có khi đó либо quá khó, либо lại quá đơn giản nên khá đáng tiếc
Có thể xem thông tin về BEAM (Erlang virtual machine) tại liên kết Wikipedia
Tôi nghĩ BEAM là một trong những công nghệ bị đánh giá thấp nhất trong thế giới mã nguồn mở. Ví dụ điển hình là whatsapp. Thật khó hiểu vì sao Elixir và Erlang lại không phổ biến hơn trong các dự án đòi hỏi đồng thời cao
Tôi thích phần giải thích rằng “Erlang Runtime System (ERS)” là cách gọi chung cho runtime Erlang nói chung, còn “Erlang RunTime System (ERTS)” là cách gọi chỉ giới hạn cho bản triển khai của Ericsson
Tôi đã mua sách ngay. Có thể đọc miễn phí online, nhưng tôi vẫn muốn ủng hộ tác giả một chút nên đã mua
Tôi không làm các hệ thống quy mô lớn như Klarna nên khó cảm nhận, nhưng thật lạ khi độ trễ 15ms lại trở thành một vấn đề phải viết postmortem
gen_serverđể bảo vệ shared state thì về cơ bản nó giống một mutex khổng lồ. Nếugen_servermất 20us để xử lý một yêu cầu, thì độ trễ 15ms đồng nghĩa với việc 750 message đã bị chất vào hàng đợi. Nếu lại dùng message queue theo pattern kém hiệu quả thì hiệu năng sẽ giảm rất mạnh. BEAM chỉ tối ưu hóa message queue cho một số pattern nhất định, còn với những pattern khác thì thời gian xử lý tăng theo độ dài hàng đợi. Nếu bên trong thư viện có dùngreceivekhông an toàn thì có thể phát sinh suy giảm hiệu năng ngoài dự đoán. Gần đây BEAM đã thêm tính năngaliasđể khắc phục vấn đề message queue, nhưng nhiều thư viện vẫn chưa dùng.aliaschủ yếu nhằm ngăn mất message, đồng thời ngăn hàng đợi bị ô nhiễm bởi timeout message. Thông thường các process sống lâu sẽ xử lý hàng đợi theo vòng lặpTôi tò mò liệu có VM nào tương tự BEAM không. Không biết là vì BEAM quá xuất sắc nên không có đối thủ, hay vì nó khó làm đến mức đó