2009-07-19 26 views
8

Dung sai lỗi Erlang (như tôi hiểu) bao gồm việc sử dụng các quy trình giám sát để theo dõi quy trình công nhân, vì vậy nếu một công nhân chết thì người giám sát có thể bắt đầu một quy trình mới.Quy trình giám sát hoạt động như thế nào? Có thể thực hiện tương tự trên JVM không?

Erlang thực hiện giám sát này như thế nào, đặc biệt trong trường hợp phân tán? Làm thế nào nó có thể chắc chắn quá trình đã thực sự chết? Nó có đập nhịp tim không? Có cái gì đó được xây dựng trong môi trường thời gian chạy không? Điều gì xảy ra nếu cáp mạng bị rút phích cắm - liệu nó có cho rằng các quá trình khác đã chết nếu nó không thể liên lạc với chúng? v.v.

Tôi đã suy nghĩ về cách đạt được cùng khả năng chịu lỗi vv được xác nhận bởi Erlang trong JVM (trong Java hoặc Scala). Nhưng tôi đã không chắc chắn nếu nó yêu cầu hỗ trợ xây dựng vào JVM để làm điều đó cũng như Erlang. Tôi đã không đi qua một định nghĩa về cách Erlang hiện nó tuy nhiên như là một điểm so sánh.

Trả lời

5

Giám sát Orlang OTP thường không được thực hiện giữa các quy trình trên các nút khác nhau. Nó sẽ làm việc, nhưng thực hành tốt nhất là làm điều đó một cách khác nhau.

Cách tiếp cận chung là viết toàn bộ ứng dụng để nó chạy trên mỗi máy, nhưng ứng dụng nhận thức được rằng nó không đơn độc. Và một số phần của ứng dụng có một nút giám sát để nó nhận thức được các nút xuống (điều này được thực hiện với ping mạng đơn giản). Bạn có thể sử dụng các nút giảm này để thay đổi quy tắc cân bằng tải hoặc rơi sang một quy tắc khác, v.v.

Ping này có nghĩa là có độ trễ trong việc phát hiện các nút xuống. Có thể mất một vài giây để phát hiện một nút ngang hàng chết (hoặc liên kết chết với nó).

Nếu người giám sát và quy trình chạy cục bộ, sự cố và tín hiệu cho người giám sát là khá nhiều tức thời. Nó dựa trên một tính năng mà một vụ tai nạn bất thường lan truyền đến các quá trình liên kết mà sụp đổ cũng trừ khi họ bẫy thoát.

+0

Cảm ơn, điều đó có ý nghĩa rất nhiều. Có vẻ như một điều phổ biến là việc gửi tin nhắn giữa các máy khác với việc gửi giữa các quy trình cục bộ (chi phí lớn hơn, nhiều lý do hơn có thể thất bại, v.v.). Vì vậy, mã ứng dụng của bạn để biết về điều này (không có viên đạn bạc để thực hiện cuộc gọi địa phương/từ xa như nhau, do đó, không thử). Điều này có nghĩa là một mô hình tương tự trong JVM chắc chắn là có thể. Chỉ giám sát các quy trình/chủ đề/sợi/diễn viên địa phương/bất cứ điều gì, và mã vào ứng dụng của bạn ping của các nút khác (và phải làm gì nếu bạn không thể đạt được một). –

0

Dường như ai đó đã triển khai similar strategy in Scala. Kỳ vọng của tôi sẽ là một người giám sát sẽ xử lý một thất bại mạng như là một tiến trình con không thành công, và tài liệu về quy trình Scala có vẻ như đã loại bỏ điều này.

+0

Cảm ơn - đó là một bài đăng thú vị. Tôi để lại một tin nhắn có cố gắng để làm việc ra nếu nó hỗ trợ các kết nối mạng. Tôi có cảm giác (có thể không chính xác) rằng nó đang xem cái gì đó khác trong JVM và không xử lý các vấn đề biên giới chéo. Nhưng nếu nó hoạt động thì nó sẽ rất tuyệt! –

0

Tôi nghĩ ý của bạn là do Người giám sát xử lý bản portmapper. Bạn có thể sử dụng bộ chuyển đổi/cơ sở hạ tầng Erlang qua JInterface - do đó bạn tránh tái phát minh bánh xe - trong trường hợp bạn vẫn muốn nó, bạn có ít nhất tất cả các giao diện được mô tả ở đó.

+0

Cảm ơn, nhưng tôi đã hy vọng chỉ có máy ảo Java xung quanh (không có Erlang VM). Giữ mọi thứ đơn giản hơn (chính trị). –

-1

Erlang là mã nguồn mở, có nghĩa là bạn có thể download the source và nhận câu trả lời cuối cùng về cách Erlang thực hiện điều đó.

Erlang thực hiện việc giám sát này, đặc biệt trong trường hợp phân tán như thế nào? Làm thế nào nó có thể chắc chắn quá trình đã thực sự chết? Nó có đập nhịp tim không? Có cái gì đó được xây dựng trong môi trường thời gian chạy không?

Tôi tin rằng nó được thực hiện trong thời gian chạy BEAM. Khi một quá trình chết, một tín hiệu sẽ được gửi đến tất cả các quá trình liên quan đến nó. Xem Chương 9 của Programming Erlang để có một cuộc thảo luận đầy đủ.

Điều gì xảy ra nếu cáp mạng bị rút phích cắm - có phải các quy trình khác đã chết nếu không thể liên lạc với chúng? v.v.

Trong Erlang, bạn có thể chọn giám sát nút và nhận thông báo {node_up, Node}{node_down, Node}.Tôi cho rằng những điều này cũng sẽ được gửi nếu bạn không còn có thể nói chuyện với một nút nữa. Cách bạn xử lý chúng tùy thuộc vào bạn.

Các vấn đề liên quan