2012-11-19 23 views
9

Là một nhà phát triển Java EE thời gian dài, tôi đã sử dụng phương pháp MDC (Ngữ pháp chẩn đoán ánh xạ) để xử lý việc truyền dữ liệu theo ngữ cảnh liên quan đến yêu cầu, ví dụ: mã thông báo yêu cầu duy nhất để theo dõi yêu cầu trên nhiều sự kiện nhật ký tiềm năng xảy ra trong suốt thời gian tồn tại của yêu cầu đó.Cách bảo vệ dữ liệu theo ngữ cảnh yêu cầu trong Akka

Do sự phụ thuộc vào ThreadLocal, điều này khá rõ ràng khi phương pháp này diễn ra khi sử dụng các kỹ thuật không đồng bộ.

Tôi vẫn còn trong những ngày đầu học Scala và, phù hợp hơn với câu hỏi này, Akka. Tôi đã đọc rất nhiều bài đăng trên diễn đàn xác nhận sự không tương thích của Akka và MDC nhưng vẫn chưa phát hiện ra một chiến lược nhất quán để bắt chước cách tiếp cận MDC theo một cách nào đó.

Chỉ đơn giản là tốt nhất là chỉ truyền rõ ràng loại dữ liệu này xung quanh như một phần của thư được gửi giữa các diễn viên? Nó cảm thấy bẩn thỉu nhưng, đồng thời, tương thích với khả năng quy mô dễ dàng.

Có cách nào khác để chuyển ngữ cảnh cho diễn viên khác ngoài trực tiếp qua tin nhắn không? Ngoài ra, có ai phải đối mặt với cùng thách thức này khi sử dụng khối Play Async không?

+4

Cách duy nhất để giao tiếp (truyền thông tin) giữa các tác nhân là gửi tin nhắn và thông tin duy nhất có sẵn là loại và nội dung của tin nhắn. Bạn không thể chuyển thông tin ngầm sử dụng một số kênh khác. –

+0

@drewzilla, bạn đã từng thực hiện bất kỳ tiến bộ nào về vấn đề này chưa? Tôi cũng tò mò về việc theo dõi bối cảnh yêu cầu trong suốt vòng đời trong trò chơi với scala – devshorts

+0

Liên quan: https://stackoverflow.com/questions/30091356/mdc-mapped-diagnostic-context-logging-in-akka – dskrvk

Trả lời

1

Tôi nghĩ rằng bạn có thể sử dụng ThreadLocal -s tuyên bố trong một bối cảnh tĩnh, giống như chấp hành viên tham số ẩn trong mã này:

implicit val executor = context.dispatcher 
val f = Future[Boolean] { 
    someTask() 
} andThen { 
    case err if err.isLeft => log.error("Some error: " + err.left.get); false 
    case ok if ok.isRight => log.info("Good work: " + ok.right.get); true 
} 

Mỗi lần tương lai nộp nhiệm vụ cho một điều phối, sao chép một đối tượng thread bối cảnh an toàn từ một sợi khác. Vì vậy, bạn cần một điều phối viên tùy chỉnh - bằng bất kỳ phương tiện nào đọc ThreadLocal, lưu trữ nội bộ ở đâu đó bên trong người điều hành (điều phối), sau đó gửi tác vụ trước tiên sẽ ghi vào ThreadLocal

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