2013-06-10 42 views
10

Ngay bây giờ trong ứng dụng của tôi, tại một số điểm nhất định, chúng tôi đang đăng nhập một số nội dung nặng vào tệp nhật ký.Đăng nhập không đồng bộ

Về cơ bản chỉ để ghi nhật ký, chúng tôi đang tạo JSON dữ liệu có sẵn và sau đó đăng nhập vào tệp nhật ký. Đây là yêu cầu nghiệp vụ để ghi dữ liệu ở định dạng JSON.

Bây giờ tạo JSON từ dữ liệu có sẵn và sau đó đăng nhập vào FILE mất rất nhiều thời gian và ảnh hưởng đến thời gian yêu cầu trả lại ban đầu. Bây giờ ý tưởng là cải thiện kích cỡ.

Một trong những điều mà chúng ta đã thảo luận là để tạo ra một hồ bơi thread sử dụng

Executors.newSingleThreadExecutor() 

trong mã của chúng tôi và sau đó gửi các nhiệm vụ để nó mà làm việc chuyển đổi dữ liệu vào JSON và khai thác gỗ sau này.

Đây có phải là cách tiếp cận tốt để thực hiện điều này không? Vì chúng tôi đang tự quản lý nhóm luồng, liệu có tạo ra một số vấn đề không?

Tôi sẽ đánh giá cao nếu ai đó có thể chia sẻ các giải pháp tốt hơn. Một thời gian ngắn để sử dụng Log4j cho việc này. Tôi đã cố gắng sử dụng AsyncAppender nhưng không đạt được bất kỳ kết quả mong muốn nào. Chúng tôi đang sử dụng EJB 3, Jboss 5.0, Log4j, java6.

Trả lời

6

Tôi tin rằng bạn đang đi đúng hướng về cách sử dụng hồ bơi chủ đề riêng để đăng nhập. Trong nhiều sản phẩm, bạn sẽ thấy tính năng ghi nhật ký không đồng bộ. Nhật ký được tích lũy và được đẩy để ghi nhật ký các tệp bằng cách sử dụng một chuỗi riêng biệt hơn luồng yêu cầu. Đặc biệt trong môi trường prodcution, nơi có hàng triệu yêu cầu đến và thời gian phản hồi của bạn cần ít hơn vài giây. Bạn không thể đủ khả năng bất cứ điều gì như đăng nhập để làm chậm hệ thống.Vì vậy, cách tiếp cận được sử dụng là thêm các bản ghi vào bộ nhớ đệm và đẩy chúng không đồng bộ trong các khối có kích thước hợp lý.

Thận trọng khi sử dụng nhóm chủ đề để ghi nhật ký Vì nhiều chủ đề sẽ làm việc trên tệp nhật ký và trên bộ đệm nhật ký bộ nhớ, bạn cần phải cẩn thận về ghi nhật ký. Bạn cần phải thêm các bản ghi trong một loại FIFO của một bộ đệm để đảm bảo rằng các bản ghi được in trong các tệp nhật ký được sắp xếp theo dấu thời gian. Ngoài ra hãy đảm bảo rằng quyền truy cập tệp được đồng bộ hóa và bạn không gặp phải tình huống mà tệp nhật ký bị lộn ngược hoặc lộn xộn.

+0

Cảm ơn đã cho tôi sự tự tin để đi trước đúng hướng.Nhưng lo lắng duy nhất của tôi là tôi đang sử dụng ứng dụng tạo ra threadpool ... sẽ tạo ra bất kỳ vấn đề hoặc có cách nào tôi có thể tận dụng hồ bơi thread jboss cho việc này. – Rips

3

Đang sử dụng MongoDB for logging được xem xét?

  1. Chèn MongoDB có thể được thực hiện không đồng bộ. Người ta sẽ không muốn trải nghiệm của người dùng để dừng lại nếu việc ghi nhật ký bị chậm, bị trì hoãn hoặc xuống. MongoDB cung cấp khả năng để kích hoạt chèn vào bộ sưu tập nhật ký và không chờ mã phản hồi. (Nếu một trong số muốn một câu trả lời, một cuộc gọi getLastError() - chúng tôi sẽ bỏ qua điều đó tại đây.)
  2. Dữ liệu nhật ký cũ tự động LRU. Bằng cách sử dụng các bộ sưu tập có giới hạn, chúng tôi preallocate không gian cho các bản ghi, và một khi nó đã đầy, nhật ký kết thúc tốt đẹp và tái sử dụng không gian được chỉ định. Không có nguy cơ làm đầy đĩa với thông tin nhật ký quá mức và không cần phải ghi lưu trữ nhật ký/ tập lệnh xóa.
  3. Đủ nhanh cho vấn đề. Đầu tiên, MongoDB rất nhanh trong chung, đủ nhanh cho các vấn đề như thế này. Thứ hai, khi sử dụng bộ sưu tập được giới hạn , thứ tự chèn được tự động lưu giữ: chúng tôi không cần tạo chỉ mục trên dấu thời gian. Điều này làm cho mọi việc thậm chí nhanh hơn và điều quan trọng là trường hợp sử dụng ghi nhật ký có số lượng ghi rất cao so với số lần đọc (đối diện với hầu hết các sự cố cơ sở dữ liệu ).
  4. Hướng tài liệu/JSON là định dạng tuyệt vời cho thông tin nhật ký. Rất linh hoạt và “schemaless” theo nghĩa chúng ta có thể ném thêm một trường vào bất kỳ lúc nào chúng ta muốn.
+1

Vâng cảm ơn vì chia sẻ này nhưng tôi không nghĩ rằng chúng ta đang đi đường mà bây giờ. – Rips

5

Hãy xem Logback, AsyncAppender nó đã cung cấp threadpool riêng biệt, hàng đợi vv và dễ cấu hình, nó gần giống như bạn đang làm, nhưng giúp bạn không bị phát minh lại bánh xe.

+0

Có sự khác biệt nào giữa điều này và log4j.AsyncAppender? Cũng như một phần của điều này, tôi không chỉ muốn đăng nhập asychronosuly mà còn chuyển đổi dữ liệu thành JSON. – Rips

+0

@Rips Nếu bạn có nhiệm vụ khác cũng (như chuyển đổi dữ liệu), thì giải pháp của bạn cũng ok. Về log4j vs logback, việc phát triển log4j bị dừng và logback đang hoạt động. Để biết thêm chi tiết về log4j vs logback, hãy xem [link] này (http://stackoverflow.com/questions/178215/log4j-vs-logback) –

0

Bạn cũng có thể thử CoralLog để đồng bộ dữ liệu đăng nhập bằng cách sử dụng mô hình gây rối loạn. Bằng cách đó bạn dành thời gian tối thiểu trong thread logger và tất cả các công việc khó khăn được truyền cho thread làm I/O file thực sự. Nó cũng cung cấp các tập tin bộ nhớ ánh xạ để tăng tốc độ thread tiêu dùng và giảm tranh chấp hàng đợi.

Disclaimer: Tôi là một trong các nhà phát triển của CoralLog

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