2010-01-30 35 views
13

Tôi đã được yêu cầu thiết kế và triển khai hệ thống để nhận khối lượng lớn dữ liệu cảm biến tự động từ một số lượng lớn thiết bị. Dữ liệu này sẽ được tạo ra đều đặn và được gửi đến máy chủ dưới dạng xml trong bài đăng http. Các thiết bị sẽ tiếp tục gửi lại cùng một dữ liệu nếu chúng không nhận được một xác nhận cụ thể từ máy chủ. Một số xử lý có khả năng nặng nề của dữ liệu này sẽ cần phải xảy ra trước khi nó được chèn vào một số bảng trong cơ sở dữ liệu chính thông qua một giao dịch, và thêm một số điểm dữ liệu sẽ cần phải được enqueued để được chuyển hướng đến các url bên ngoài khác.Những cạm bẫy tiềm năng trong việc sử dụng hàng đợi JMS?

Tôi đang lập kế hoạch sử dụng máy chủ ứng dụng Java (nghiêng về phía GlassFish) với một servlet để nhận dữ liệu đến. Tôi muốn thực hiện một số loại cơ chế xếp hàng để lưu trữ dữ liệu tạm thời để phản hồi trở lại cảm biến không phụ thuộc vào tất cả xử lý trung gian. Các hàng đợi độc lập riêng biệt cũng là một yêu cầu đối với phần dữ liệu hướng lại. Sau khi thực hiện một số nghiên cứu, hai tùy chọn chính có vẻ là:

1) Cài đặt cơ sở dữ liệu trên máy chủ ứng dụng và sử dụng bảng cho các hàng đợi khác nhau. Các hàng đợi sẽ được xử lý bởi một ứng dụng Java, hoặc đang chạy trong máy chủ ứng dụng hoặc độc lập như là dịch vụ riêng của nó.

2) Sử dụng giải pháp JMS được cơ sở dữ liệu hỗ trợ để triển khai hàng đợi.

Tôi không quen thuộc với JMS nhưng từ những gì tôi đã đọc nó có vẻ là giải pháp tốt hơn trong trường hợp này. Yêu cầu chính là không có dữ liệu cảm biến nào bị mất hoặc bị mất khỏi hàng đợi trước khi được xử lý và nó được xử lý nhiều hay ít tuần tự. Chúng tôi cũng muốn làm cho nó dễ dàng để ngăn chặn việc xử lý một số hàng đợi vào những thời điểm nhất định nhưng vẫn có họ tích lũy dữ liệu và cho những tin nhắn này không bao giờ tự động hết hạn.

Với chiến lược 1 rõ ràng với tôi cách đáp ứng các yêu cầu này nhưng nó có thể kém mạnh mẽ và có thể mở rộng và phức tạp hơn để phát triển so với chiến lược 2, vì tôi cần phải viết mã đa luồng của riêng mình để xử lý hàng đợi độc lập khác nhau. Tôi tự hỏi những gì tiềm năng cạm bẫy có thể được trong việc sử dụng hàng đợi JMS cho mục đích này kể từ khi tôi đã không bao giờ làm việc với họ trước.

Tính toàn vẹn dữ liệu là một vấn đề lớn vì vậy tôi cần đảm bảo rằng JMS có thể đảm bảo không mất dữ liệu trong trường hợp khởi động lại máy chủ, mất điện hoặc nếu hàng đợi rất lớn vì lý do nào đó. Ví dụ, một vấn đề có thể hoàn thành giao dịch với cơ sở dữ liệu chính trong một khoảng thời gian có khả năng gây ra JVM hết bộ nhớ, sự cố và mất tất cả dữ liệu tích lũy? (Đây sẽ là kịch bản ác mộng).

Ngoài ra, tôi đã tự hỏi liệu có cách nào để tạm dừng xử lý hàng đợi JMS thông qua công cụ quản trị máy chủ ứng dụng hay không dễ dàng xem nội dung trong hàng đợi (tôi sẽ đặt một đối tượng sẽ là thông điệp xml cộng với một số dữ liệu khác, bao gồm cả dấu thời gian nhận được, vv) Tôi đã đọc một vài bài viết ở đây mà đối phó với các vấn đề liên quan nhưng muốn nhận được một số thông tin phản hồi trực tiếp. Về cơ bản tôi muốn biết các trường hợp (nếu có), nơi JMS không phải là một giải pháp xếp hàng thích hợp và nếu đây là một trong những trường hợp đó. Bất cứ lời khuyên nào cũng đươc đánh giá cao.

+0

Không phải là một anh chàng Java chút nào, nhưng điều này không hàm ý chờ đợi một hàng đợi trả lời cho kết quả phản hồi? Điều này có vẻ như là một thỏa thuận-breaker nếu giao thức khách hàng của bạn là HTTP. Điều này sẽ không phải buộc một sợi? – Bob77

+0

Có hai kịch bản xếp hàng riêng biệt mà tôi phải giải quyết. Một là một hàng đợi đến cơ sở dữ liệu chính, đó sẽ là một kết nối thông qua một hồ bơi kết nối jdbc. Đây là những gì servlet sẽ ghi vào. Cái còn lại sẽ chứa một tập hợp con của dữ liệu này, sẽ được đưa vào hàng đợi riêng biệt này sau khi được xử lý thành công trong hàng đợi chính. Người tiêu dùng của hàng đợi này sẽ gửi tin nhắn qua http đến một trang web khác. Điều này có nghĩa là đáp ứng servlet ban đầu sẽ được phân cách bởi hai hàng đợi từ kết quả của bài đăng http đến trang web của bên thứ ba. – user256447

Trả lời

7

Câu trả lời của Kaleb nói về những lợi ích của JMS khá hùng hồn, nhưng vì bạn đang hỏi về những cạm bẫy, đây là những gì tôi có thể nghĩ đến.

  • Không phải tất cả triển khai JMS đều bằng nhau. Về lý thuyết, bạn có thể sử dụng bất kỳ việc thực hiện nào phù hợp với nhu cầu của bạn, nhưng trừ khi bạn chuẩn bị thực hiện một số thử nghiệm tải trọng nghiêm trọng và kiểm tra tình trạng lỗi, bạn không thể biết rằng một triển khai cụ thể sẽ không thất bại trong trường hợp sử dụng cụ thể của bạn.
  • Hầu hết JMS sử dụng kho dữ liệu giao dịch như một cơ sở dữ liệu quan hệ làm đầu cuối của chúng. Điều đó có nghĩa là thay vì viết trực tiếp vào bất kỳ kho dữ liệu nào bạn quen thuộc, bạn phải dựa vào lớp bổ sung của JMS thực hiện giữa bạn và các thư đã lưu trữ đó.
  • Trong khi hoán đổi cài đặt JMS để tìm ứng dụng phù hợp hoàn hảo với nhu cầu của bạn có vẻ như là một nỗ lực đơn giản vì API JMS đồng nhất, các tính năng quan trọng để xử lý lỗi, giám sát máy chủ JMS và tất cả các nội dung thú vị khác tồn tại ở trên và ngoài việc nhắn tin sẽ là một rắc rối để giải quyết nếu bạn thay đổi việc triển khai của mình.

Điều đó nói rằng, tôi nghĩ bạn sẽ điên khi tự viết cho DB thay vì đi với JMS. Vào điểm đầu tiên, ActiveMQ là một máy chủ JMS đáng kính được sử dụng trong nhiều môi trường doanh nghiệp. Về điểm thứ hai, thực tế là bạn chỉ cần viết thêm lớp đó để thực hiện nhắn tin và mã của bạn sẽ không có lợi ích của hàng nghìn mắt (hoặc một nhóm nhà phát triển trả tiền là công việc duy nhất của nó) để trả lời khách hàng và đảm bảo việc triển khai JMS thật chắc chắn). Trên điểm thứ ba, cũng như vậy kết thúc lên là đúng của kho dữ liệu phụ trợ của bạn. Sử dụng JMS, bạn sẽ tiết kiệm cho mình sự cố trong thời gian dài.

+0

Cảm ơn Jherico. Vâng tôi đã nghĩ rằng nó có thể sẽ là ngu ngốc để cố gắng đưa ra giải pháp của riêng tôi cho một vấn đề đã được giải quyết nhiều lần trước đây. Tôi chỉ muốn làm một kiểm tra sanity của toàn bộ kịch bản trước khi đặt rất nhiều nỗ lực một giải pháp dựa trên JMS mà kết thúc là cách tiếp cận sai.Tôi có một số kinh nghiệm viết bài kiểm tra JMeter khối lượng cao tùy chỉnh mà nên có ích ở đây. – user256447

3

Nếu bạn muốn đi tuyến đường JMS, một nhà môi giới tin nhắn tương thích JMS độc lập (tách biệt với máy chủ ứng dụng của bạn) sẽ là một lựa chọn tốt. Các công ty môi giới thư từ nguồn mở miễn phí (như ActiveMQ tại http://activemq.apache.org/ hoặc OpenMQ tại https://mq.dev.java.net/), đến các giải pháp thương mại quy mô lớn (WebSphere MQ của IBM tại http://www-01.ibm.com/software/integration/wmq/ là một trong những lớn nhất).

Nhà môi giới thư cung cấp giao hàng được đảm bảo (cung cấp máy chủ và nghe), và bạn có thể thực hiện một chút để đảm bảo hệ thống không an toàn bao gồm máy chủ sao lưu tích hợp và sao lưu điện tức thì.Hàng đợi môi giới cuối cùng có thể hết phòng nếu máy chủ ứng dụng của bạn không nhận được tin nhắn nhưng bạn có thể chỉ định độ sâu hàng đợi lớn (100 GB) và máy chủ gửi thông báo nếu các tin nhắn không được xử lý và hàng đợi đến một tỷ lệ nhất định.

Ứng dụng Java của bạn sau đó sẽ chạy trên một máy chủ hoàn toàn khác và sẽ kết nối với nhà môi giới và kéo thư ra khỏi hàng đợi nhanh nhất có thể. Nếu máy chủ ứng dụng gặp sự cố hoặc ngừng nhận tin nhắn vì bất kỳ lý do nào khác, nhà môi giới sẽ chỉ giữ tất cả thư trong hàng đợi đó cho đến khi máy chủ ứng dụng bắt đầu chọn chúng lên lần nữa.

+0

Không thể phân biệt (tôi là một fan lớn của JMS), nhưng không ai trong số đó thực sự là 'cạm bẫy'. – Jherico

+0

Cảm ơn lời khuyên của Kaleb. Tôi sẽ bắt đầu thử nghiệm với JMS. Tôi có thể sẽ sử dụng những gì được xây dựng trong GlassFish ban đầu và sau đó khi thoải mái với điều đó sẽ xem xét việc thiết lập các nhà môi giới tin nhắn riêng biệt. Chỉ để yên tâm, tôi cũng có thể có vài ngày trước đó giá trị của các thông điệp đăng nhập vào một cơ sở dữ liệu trên máy chủ ứng dụng chỉ trong trường hợp. Bạn có bất kỳ liên kết hay sách tốt nào để đề xuất mô tả chi tiết hơn về công cụ này không? – user256447

+0

@Kaleb không JMS cung cấp bảo đảm đặt hàng của các tin nhắn như FIFO? – Geek

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