This page is READ-ONLY. It is generated from the old site.
All timestamps are relative to 2013 (when this page is generated).
If you are looking for TeX support, please go to VietTUG.org

Will Erlang Replace Java?

concurrency, distributed, fault-tolerance, clustering
Added by bronzeboyvn about 2 years ago  »  Votes: 1/1

Nhân dịp năm cũ kể chuyện ... mới. Trong số nhưng chuyện mới như việc làm mới, vị trí mới, suy nghĩ mới, tôi xin kể 1 mẩu nhỏ về ngôn ngữ mới, Erlang. Ngôn ngữ này có gì hay ho mà người ta chọn nó để viết database (RIAK), web framework (MOCHIWEB), instant messaging server (EJABBERD) ? Đơn giản là nó hỗ trợ những tính năng mà nhà thiết kế mong muốn có ở sản phẩm của mình, đáp án muôn thuở vẫn vậy.
Trong giới hạn hiểu biết, tôi xin trình bày 4 đặc điểm của ngôn ngữ Erlang mà các nhà thiết kế yêu thích: concurrency, distributed, fault-tolerance, clustering.

1. Concurrency:

Trong lãnh vực mạng xã hội (social network), người ta hay hỏi nhau câu "server của anh tại một thời điểm chấp nhận được bao nhiêu kết nối?". "Hàng chục ngàn, tới trăm ngàn kết nối" là một câu trả lời đầy hãnh diện, rồi hắn ta kể về những kĩ thuật (xử lý sự kiện), công cụ (Thrift, back-end của facebook dùng nó đấy), nhưng hắn quên bản chất ở đây là làm sao tạo được hàng trăm ngàn threads/processes trên hê thống, đó mới là giải pháp.
Trên một máy tính 32-bit thường thường, chương trình Erlang có thể tạo hàng chục nghìn processes. Tất nhiên process của Erlang không phải là một operating system process, OS không đủ tài nguyên để tạo ra chừng đó processes. Chương trình Erlang chạy trên virtual machine (Erlang VM), virtual machine chỉ là một operating system process, như vậy các Erlang processes chỉ là các threads chạy trong Erlang VM. Process của Erlang cũng không phải là một operating system thread, vì các thread chia sẻ chung không gian vùng nhớ của process (mỗi thread giống như 1 stack khi 1 function được sinh ra vậy), còn các Erlang processes thì không chia sẻ chung gì cả. Người ta thiết kết Erlang processes như là các operating system threads (nhưng không cho phép chia sẻ chung gì cả) chạy trong 1 operating system process (Erlang VM). Huyền diệu nằm ở chỗ, một operating system thread chiếm vài megabytes cho 1 stack, còn Erlang process chỉ chiếm vài trăm bytes cho stack, hơn nữa stack này có thể co giãn tùy nhu cầu. Sự khác biệt giữa ngàn và chục ngàn từ đó mà ra.
Người ta gọi process của Erlang là lightweight process.

Vi dụ, chương trình sinh ra 40000 Erlang processes chạy trên máy 4-cores:

               Erlang Virtual Machine                 Erlang VM là một OS process,
 _________________________________________________    trong nó chạy được nhiều nhất 4 kernel threads.
|  _________   _________   _________   _________  |   Mỗi kernel thread này đóng vai trò như một thread pool
| | Kernel  | | Kernel  | | Kernel  | | Kernel  | |   luân phiên nhau xử lý từng 10k Erlang processes.
| | Thread  | | Thread  | | Thread  | | Thread  | |   ( 10k Erlang processes/1 kernel thread là một tỳ lệ tượng trưng,
| |  1:     | |  2:     | |  3:     | |  4:     | |     tùy khối lượng công việc từng Erlang process mà stack của nó 
| |         | |         | |         | |         | |     to hay nhỏ. Erlang VM có nhiệm vụ cân bằng khổi lượng công
| | 10k     | | 10k     | | 10k     | | 10k     | |     việc của 4 thread pools này. Có thề sau khi xử lý xong, thống kê thấy
| | Erlang  | | Erlang  | | Erlang  | | Erlang  | |     kernel thread1 xử lý 15k Erlang processes,
| |procesess| |procesess| |procesess| |procesess| |     kernel thread2       20k Erlang processes,
| |_________| |_________| |_________| |_________| |     kernel thread3       1k Erlang processes,
|_________________________________________________|     kernel thread4       4k Erlang processes,
                                                       )

2. Distributed:

Tính phân tán được thể hiện qua cách thức giao tiếp giữa các Erlang processes. Cách thức phổ biến Ở các ngôn ngữ khác là chia sẻ vùng nhớ kết hợp với việc sử dụng khóa (shared memory with locks), còn Erlang chọn cách chuyển tin nhắn (passing message). Như vậy dữ liệu một process đang nắm giữ được sao lưu lại ở các processes khác.
- Không chia sẻ mà sao lưu, không phải là gây tốn kém tài nguyên sao?
- Có biện pháp nào để phân tán ngoài sao lưu à ? Bạn nên hỏi cách thức sao lưu dữ liệu giữa các Erlang processes có ưu điểm gì. Tập đoàn Ericsson đã tạo ra ngôn ngữ Erlang và người ta gọi Erlang là ngôn ngữ của viễn thông, một trong những sự nổi bật đó là một chuỗi ký tự dài ngắn thế nào nào thì nó cũng chỉ chiếm 4bytes với máy 32-bit (và 8 bytes với máy 64-bit). Sự huyền diệu nằm ở Erlang VM.

3. Fault-tolerance:

Các processes giao tiếp với nhau có thề biểu diễn qua một đồ thị. Erlang hỗ trợ chúng ta 2 loại supervisor processesworker processes. Một khi worker process gặp vấn đề, Erlang VM xử lý các ngoại lệ (ngôn ngữ nào dùng virtual machine đều có cơ chế handling exception rất tốt) để ép nó kết thúc. worker process này sẽ gởi tín hiệu tới các worker processes khác (có liên kết với nó trong đồ thị), ngoại trừ các supervisor processes. Hậu quả làm cho 1 chùm worker processes bị ép kết thúc, sau đó supervisor processes dính liếu đến chùm này sẽ gời tín hiệu cho chúng (lan truyên) khởi động lại.

Một ứng dụng điển hình là mô hình consumers-productors. Giả sử nhóm workers bên dưới supevisorA làm nhiệm vụ encode và xử lý media, còn nhóm workers bên dưới supevisorB có nhiệm vụ trình chiếu. Tình huống: bên nhóm A đã xử lý được 200Mb dữ liệu, bên nhóm B chiếu được 150Mb của film, đột ngột một trong processes nhóm A bị chết (đứt kết nối với dữ liệu). Ngay lúc đó ta xem film vẫn bình thường, nhóm B vẫn đảm bảo công việc (trong một khoảng thời gian ngắn nữa). Nếu ta thiết kế hệ thống tốt, supervisorC làm cho nhóm A sẽ khởi động lại kết nối với nguồn dữ liệu để tiếp tục xử lý, coi như hệ thống vẫn chưa xảy ra chuyện gì.
Erlang được chọn để phát triển cho các hệ thống viễn thông chạy từ năm này qua tháng nọ là vì vậy.

4. Clustering:

Trong network, trên một máy hoặc các máy khác nhau ta khởi động các Erlang VM instances, chúng nhận ra nhau bằng cách chuyển tin nhắn, mỗi instance có 1 cái tên [email protected]. NodeA gởi "ping" đến nodeB, kết quả nhận về là "pong", thì cà 2 nodes này nhận ra nhau tạo nên 1 cluster gồm 2 nodes. Giả sử trong network này, nodeC và nodeD cũng liên lạc nhau tạo thành 1 cluster khác gồm 2 nodes. Khi nay nếu nodeA liên lạc "ping-pong" tiếp với nodeD, chúng sẽ nắm thông tin của nhau và tạo thành 1 cluster 4 nodes{A, B, C, D}.
Dưới con mắt của Erlang devs, trong cluster, process của node này giao tiếp với process của node kia cũng chẳng khác gì việc giao tiếp giữa các processes trên cùng một node. Sự huyền diệu nằm ở Erlang VM.

Lời kết:

Khi tôi nhận được kết quả đầy bất ngờ từ một câu thần chú, tôi cho rằng câu thần chú đó huyền diệu. Hãy tìm hiểu Erlang xem, có thể bạn sẽ lặp tới, lặp lui một từ nào đó như tôi đang làm với từ "huyền diệu".


Comments

Added by icy about 2 years ago

Ôi bài chi tiết và dài quá :) Trông không đẹp mắt lắm, mình phải sửa cái Dragula nhiều đây :P

Added by bronzeboyvn about 2 years ago

Cái này chỉ là cưỡi ngựa xem hoa, tổng quan về thế mạnh của ngôn ngữ Erlang thôi, em chưa đá đụng gì semantic & syntax của ngôn ngữ. Ban đầu em định giới thiệu thêm mục functional, nhưng chẳng thấy nó liên quan đến 4 phần kia (mất hay), nên em bỏ. Em cũng nghĩ thêm vài trò để làm cho Dragula (cái mà các mạng XH của VN chưa có, thì blog mình sẽ có), để sau Tết đi cafe bàn sau :).