2009-09-17 19 views
8

Tôi có một ứng dụng máy chủ được thực hiện trong Erlang. Trong đó tôi có một bảng miaia lưu trữ một số thông tin về ảnh. Theo tinh thần "tất cả mọi thứ là một quá trình " Tôi quyết định bọc bảng đó trong mô-đun gen_server, để mô-đun gen_server là mô-đun duy nhất truy cập trực tiếp vào bảng. Truy vấn và thêm thông tin vào bảng đó được thực hiện bằng cách gửi thư đến quá trình đó (có tên đã đăng ký). Ý tưởng là sẽ có một số khách hàng xử lý thông tin truy vấn từ bảng đó.Sử dụng gen_server để đóng gói bảng mnesia?

Điều này chỉ hoạt động tốt, nhưng mô-đun gen_server không có trạng thái. Mọi thứ cần có yêu cầu được lưu trữ trong bảng mnesia. Vì vậy, tôi tự hỏi nếu một gen_server có lẽ là không phải là mô hình tốt nhất để đóng gói bảng đó?

Tôi có nên đơn giản là không làm cho nó trở thành một quá trình, và thay vào đó chỉ đóng gói bảng thông qua các chức năng trong mô-đun đó? Trong trường hợp xảy ra lỗi trong mô-đun đó, sẽ khiến quá trình gọi bị lỗi, điều tôi nghĩ có thể tốt hơn, vì nó sẽ chỉ ảnh hưởng đến một khách hàng, trái ngược với bây giờ, khi nó gây ra quy trình gen_server sự cố, để mọi người không có quyền truy cập vào bảng (cho đến khi người giám sát khởi động lại nó).

Bất kỳ đầu vào nào được đánh giá cao.

Trả lời

9

Tôi đoán theo Occam's razorkhông cần gen_server này để tồn tại, đặc biệt là kể từ khi có hoàn toàn là không một quốc gia lưu giữ trong nó. Quá trình này có thể cần thiết trong các tình huống khi bạn cần truy cập vào bảng (hoặc bất kỳ tài nguyên nào khác) là theo thứ tự chặt chẽ (ví dụ: có thể muốn tránh bất kỳ giao dịch bị hủy nào với chi phí nút cổ chai).

Việc đóng gói quyền truy cập vào bảng trong mô-đun là giải pháp tốt. Nó tạo ra không phức tạp thêm, trong khi cung cấp mức độ trừu tượng và đóng gói thích hợp.

6

Tôi không chắc mình hiểu tại sao bạn quyết định đóng gói một bảng với quy trình. Mnesia được thiết kế để làm trung gian nhiều truy cập đồng thời vào các bảng, cả cục bộ và được phân phối trên một cụm.

Tạo mô-đun API thực hiện tất cả hoạt động truy cập và cập nhật bảng cụ thể là một ý tưởng hay vì các hàm API sẽ truyền đạt ý định của bạn tốt hơn trong mã gọi chúng. Nó sẽ dễ đọc hơn là đưa các hoạt động trực tiếp vào các mã gọi.

Mô-đun API cũng cung cấp cho bạn tùy chọn chuyển từ chế độ mất trí nhớ sang một số hệ thống lưu trữ khác sau này nếu bạn cần. Việc sử dụng các giao dịch mất trí nhớ bên trong mô-đun API của bạn sẽ bảo vệ bạn khỏi một số lỗi lập trình vì mnesia sẽ khôi phục các hoạt động bị lỗi. Mô-đun API sẽ luôn có sẵn cho người gọi và cho phép bất kỳ số lượng người gọi nào thực hiện hoạt động đồng thời, trong khi API dựa trên gen_server có một điểm không thành công, quá trình này có thể khiến API không khả dụng.

Điều duy nhất mà API dựa trên gen_server cung cấp cho bạn qua API thuần túy là truy cập tuần tự vào bảng - đây là một yêu cầu bất thường và trừ khi bạn cần nó, nó sẽ là một kẻ giết hiệu suất.

0

Có thể là một ý tưởng hay khi xử lý bảng mnesia bằng tiến trình gen_server đơn khi bạn muốn sử dụng truy cập bẩn và tránh giao dịch. Cách tiếp cận này có thể nhanh hơn tx, nhưng thường thì bạn cần chuẩn hóa nó.