5

Tôi gặp sự cố liên quan đến một số máy, hàng đợi tin nhắn và giao dịch. Vì vậy, ví dụ người dùng nhấp vào một trang web, nhấp chuột sẽ gửi một tin nhắn đến một máy khác, thêm một khoản thanh toán vào tài khoản của người dùng. Có thể có hàng nghìn nhấp chuột mỗi giây. Tất cả các khía cạnh của giao dịch phải chịu lỗi.các giao dịch và hàng đợi được phân phối, ruby, erlang, scala

Tôi chưa bao giờ phải đối phó với bất cứ điều gì như thế này trước đây, nhưng một chút đọc cho thấy đây là một vấn đề nổi tiếng.

Vì vậy, với câu hỏi của tôi. Tôi có đúng trong giả định rằng một cách an toàn để làm điều này là với một cam kết hai giai đoạn, nhưng giao thức đang chặn và vì vậy tôi sẽ không nhận được hiệu suất cần thiết? Tôi thường viết Ruby, nhưng có vẻ như các DB như redis và hệ thống xếp hàng như Rescue, RabbitMQ vv không thực sự giúp tôi nhiều - ngay cả khi tôi thực hiện một số kiểu cam kết hai pha, dữ liệu sẽ bị mất nếu redis crash vì về cơ bản nó chỉ là bộ nhớ.

Tất cả điều này đã khiến tôi nhìn vào Erlang và Scala - nhưng trước khi tôi lội vào và bắt đầu học một ngôn ngữ mới, tôi thực sự muốn hiểu rõ hơn nếu điều này đáng giá. Cụ thể, tôi có phải suy nghĩ rằng vì khả năng xử lý song song của họ, các ngôn ngữ này là một lựa chọn tốt hơn để triển khai một giao thức chặn như cam kết hai giai đoạn hay tôi nhầm lẫn? Và nếu có, có bất kỳ lý do nào để chọn một thay vì khác (đặc biệt trong ngữ cảnh này - tôi biết có rất nhiều chủ đề và blog so sánh hai chủ đề chung hơn)

Xin lỗi vì đã đăng bài - lần đầu tiên được đăng lên stack-exchange nhưng tôi đã thêm vào câu hỏi và phiên bản này có thể phù hợp hơn ở đây

Trả lời

9

1) 2 phase commit không chịu lỗi - xem liên kết. Bạn cần có total order broadcast hoặc cam kết nguyên tử không chặn, tùy thuộc vào việc xây dựng chính xác vấn đề bạn đang giải quyết.

2) Tôi sẽ không nói rằng Scala là phù hợp hơn nhiều so với hầu hết các ngôn ngữ mục đích chung khác để thực hiện cam kết hai giai đoạn. Cụ thể, các bộ sưu tập STMs, paralleldistributed sẽ không giúp bạn ở đây. Scala actors and remote actors có thể cung cấp cho bạn một API đẹp để gửi tin nhắn xung quanh không đồng bộ (trên cùng một máy hoặc từ xa), nhưng theo mặc định, chúng không cung cấp cho bạn các trừu tượng như các trình phát hiện lỗi khác nhau. bạn sẽ vẫn phải tự mình thực hiện (mặt khác, tôi tin rằng Akka có những sự trừu tượng này).

3) Tôi không thể nói cho Erlang và Ruby, nhưng như xa như Scala và Java có liên quan, bạn có thể muốn xem xét việc xem Akka. Nó dựa trên một mô hình diễn viên phân tán, cũng hỗ trợ các giao dịch và các mức độ chịu lỗi khác nhau. Nó có thể tốt hơn để tái sử dụng cơ sở hạ tầng của họ hơn là viết thời gian chạy lỗi phân phối lỗi của riêng bạn từ đầu.

+2

câu trả lời rất hữu ích - cảm ơn bạn và +1. Tôi vẫn quan tâm để xem những gì các quan điểm khác có trước khi chấp nhận điều này – chrispanda