2010-01-28 27 views
13

Tôi đang xây dựng một máy chủ erlang. Người dùng gửi yêu cầu http đến máy chủ để cập nhật trạng thái của họ. Quá trình yêu cầu http trên máy chủ lưu thông báo trạng thái người dùng trong bộ nhớ. Mỗi phút máy chủ gửi tất cả thư đến máy chủ từ xa và xóa bộ nhớ. Nếu người dùng cập nhật trạng thái của mình nhiều lần trong một phút, thông báo cuối cùng sẽ ghi đè trước đó. Điều quan trọng là khi đọc tất cả các tin nhắn và xóa chúng, không có quá trình nào khác sẽ có thể viết thông báo trạng thái.gen_server với bảng dict vs mnesia vs ets

Cách tốt nhất để triển khai nó là gì?

  1. gen_server với dict. Khóa sẽ là userid. dict: store/3 sẽ cập nhật hoặc tạo trạng thái. Gen_server giải quyết vấn đề 'giao dịch'.

  2. bảng mnesia có ram_copies. Xử lý giao dịch và tôi không cần triển khai gen_server. Có quá nhiều chi phí với giải pháp này không?

  3. Bảng ETS có trọng lượng nhẹ hơn và có bộ gen_server. Có thể thực hiện giao dịch trong ETS không? Để khóa bàn giữa đọc tất cả các tin nhắn và xóa chúng?

Cảm ơn

+1

này đã được thảo luận trên erlang-câu hỏi gửi thư-list. – rvirding

+5

Và đây là liên kết đến cuộc thảo luận, đối với những người như tôi đã tìm thấy stackoverflow trước tiên: http://erlang.2086793.n4.nabble.com/gen-server-with-a-dict-vs-mnesia-table-vs- ets-td2119064.html – JoelPM

Trả lời

18

Vì bạn sự đồng bộ bằng tay, mnesia là nhiều. Bạn rõ ràng không cần các công cụ mạng, đó là sự khác biệt chính giữa ets và mnesia.

Ets, theo như tôi cam kết, chỉ là quy trình tuân thủ otp xung quanh một dict/bag/... và vì bạn có nhiều quy trình truy cập dữ liệu của mình, bạn nên sử dụng ets.

tôi đến với logic sau đây cho bản thân mình:

Multiple processes on multiple VMs -> mnesia 
Multiple processes on one VM -> ets/dets 
One process -> bag/dict/... 
Các vấn đề liên quan