2012-10-01 23 views
5

Tôi đang thiết kế một ứng dụng sẽ chạy trong một thùng chứa OSGi (hiện tại là Equinox). Nó sẽ nhận tin nhắn trên RabbitMQ và xử lý chúng trong nội bộ. Ứng dụng sẽ chạy liên tục dưới dạng một máy chủ. Kế hoạch hiện tại của tôi là có gói trình lắng nghe RabbitMQ định cấu hình các hàng đợi của nó và đặt trình nghe trên chúng, sử dụng QueueingConsumer và chạy trong các chuỗi riêng của chúng. Người nghe sẽ gọi một hoặc nhiều dịch vụ xử lý để xử lý các tin nhắn. Các bộ vi xử lý cần phải thực hiện các cuộc gọi JDBC để truy cập cơ sở dữ liệu. Tôi muốn có thể kiểm soát thứ tự mà bộ vi xử lý được gọi. Sẽ thật tuyệt khi có thể linh hoạt thêm nhiều dịch vụ hơn vào một thời gian sau mà không cần phải mã hóa lại trình nghe của RabbitMQ.Thiết kế ứng dụng Java OSGi bằng RabbitMQ khi đang sử dụng PreparedStatement

Vấn đề tôi phải đối mặt là thư có thể đến từ các cụm từ hoặc từ từ. Tôi muốn có thể sử dụng PreparedStatement để tăng tốc độ truy cập cơ sở dữ liệu, nhưng tôi cũng không muốn giữ các kết nối mở dài hạn trong khi không có gì đang xảy ra. Tôi đã suy nghĩ về subclassing DefaultConsumer trực tiếp và để cho nó chạy trên các chủ đề trong RabbitMQ Connection, nhưng sau đó tôi mất khả năng để biết khi nào không có gì đang xảy ra. Ý tưởng ban đầu của tôi là giữ các bộ xử lý tin nhắn hoàn toàn tách biệt như các dịch vụ OSGi, và mỗi người lấy một kết nối cơ sở dữ liệu từ một hồ bơi mỗi khi nó được gọi, nhưng mất lợi thế của các câu lệnh chuẩn bị. Tôi đang sử dụng hồ bơi JDBC Tomcat, và nó dường như không có bộ nhớ đệm báo cáo chuẩn bị. Ngoài ra, tôi không chắc làm thế nào đắt tiền tạo ra một tuyên bố chuẩn bị cho mọi cuộc gọi sẽ được, nhưng có vẻ như lãng phí.

Ý tưởng tốt nhất mà tôi đã đưa ra cho đến nay là có quá trình lắng nghe của tôi trong một vòng lặp đôi. Vòng lặp bên ngoài đợi một thông báo, sau đó gọi một vòng lặp bên trong thiết lập các kết nối cơ sở dữ liệu và các câu lệnh đã chuẩn bị và chạy cho đến khi không có thêm thông báo nào hết thời gian chờ, sau đó đóng các kết nối và trả về vòng ngoài. Tôi đã nhận được điều này để làm việc cho một chút xử lý, nhưng tôi gặp khó khăn khi hình dung cách quản lý điều này nếu tôi có nhiều bộ xử lý có thể có các câu lệnh chuẩn bị khác nhau.

Có lẽ tôi phải từ bỏ ý tưởng về nhiều dịch vụ và mã hóa khó xử lý vào người nghe của mình.

Mọi đề xuất? Cảm ơn!

Trả lời

1

Tại sao không sử dụng dịch vụ làm người nghe và chuyển cho họ kết nối JDBC mà họ nên sử dụng? Một đoạn mã duy nhất sau đó gửi hàng đợi đến các dịch vụ của bạn. Điều phối viên trung tâm này có thể duy trì một nhóm các kết nối JDBC chuẩn bị một cách trivially. Nếu bạn không muốn xem kết nối JDBC trong API, hãy sử dụng dịch vụ Điều phối viên để giữ kết nối. Các dịch vụ "Aware" sau đó có thể nhận được kết nối JDBC được tối ưu hóa.

Hoặc, đăng ký DataSource làm dịch vụ cho dịch vụ người nghe của bạn và thực hiện chính sách nhóm của riêng bạn. Vì bạn biết người gọi trong cuộc gọi dịch vụ OSGi, bạn có thể thực hiện tất cả các loại tối ưu hóa, ví dụ: đọc các câu lệnh đã chuẩn bị từ jar của nhóm và lưu chúng theo đó.

Tôi sẽ không từ bỏ các dịch vụ ở đây, việc tách bạn nhận được thật tuyệt vời, tôi biết từ kinh nghiệm. Vì trong mô hình này, người nghe dịch vụ không phụ thuộc vào RabbitMQ, bạn có thể dễ dàng kiểm tra chúng và/hoặc chuyển sang công nghệ xếp hàng khác.

Sau đó, một lần nữa, trong những trường hợp này, điều tốt nhất là làm giải pháp đơn giản nhất mà bạn có thể đưa ra. Nếu bạn có vấn đề về hiệu suất, đo lường và sửa các nút cổ chai. Một nỗ lực điên rồ bị lãng phí vào các giải pháp sớm ... Tôi có thể cho bạn biết một vài tối ưu hóa sớm câm tôi đã lãng phí thời gian của mình.

+0

Cảm ơn. Tôi là một người mới của OSGi, học ở trường gõ cứng. Tôi không quen với dịch vụ Điều phối viên, nhưng tôi sẽ kiểm tra nó.Vì tôi đã đăng bài này, tôi đã có ý tưởng đăng ký người tạo dịch vụ thay vì dịch vụ. Người gọi có thể sử dụng chúng để tạo ra các dịch vụ thực sự, cho phép họ tạo các câu lệnh chuẩn bị của họ "chỉ trong thời gian", sử dụng chúng trong các hoạt động, và đóng chúng khi xảy ra sự cố. –

+0

Tôi đã kiểm tra phiên bản Equinox mà tôi đang chạy và tôi không thấy dịch vụ Điều phối viên. Có điều gì đặc biệt mà tôi phải làm để làm cho nó chạy? Tôi nghĩ rằng tôi đang sử dụng Phiên bản 4.3 Phiên bản 4.3. –

+0

Tôi tin rằng * Dịch vụ Điều phối * đề cập đến * "đoạn mã duy nhất [mà] gửi hàng đợi đến các dịch vụ của bạn" *. Tôi chưa bao giờ nghe về bất kỳ dịch vụ OSGi tiêu chuẩn nào gọi là * Điều phối viên *. –

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