2008-09-09 19 views
8

Tôi có một ứng dụng kết hợp giữa Java và C++ trên Solaris. Các khía cạnh Java của mã chạy giao diện người dùng web và thiết lập trạng thái trên các thiết bị mà chúng ta đang nói đến và mã C++ thực hiện việc thu thập dữ liệu theo thời gian thực từ các thiết bị. Bộ nhớ chia sẻ được sử dụng để chuyển thông tin trạng thái thiết bị và ngữ cảnh từ mã Java tới mã C++. Mã Java sử dụng một cơ sở dữ liệu PostgreSQL để duy trì trạng thái của nó.Tính sẵn sàng cao và nền tảng có thể mở rộng cho Java/C++ trên Solaris

Chúng tôi đang gặp phải một số tắc nghẽn hiệu năng khá nghiêm trọng và hiện tại, cách duy nhất chúng tôi có thể mở rộng là tăng bộ nhớ và số lượng CPU. Chúng tôi đang mắc kẹt trên một hộp vật lý do thiết kế bộ nhớ chia sẻ.


Lần truy cập lớn ở đây đang được thực hiện bằng mã C++. Giao diện web được sử dụng khá nhẹ để cấu hình các thiết bị; nơi chúng tôi đang thực sự đấu tranh là xử lý khối lượng dữ liệu mà các thiết bị phân phối sau khi được định cấu hình.

Mọi phần dữ liệu mà chúng tôi lấy lại từ thiết bị đều có số nhận dạng trong đó trỏ ngược lại ngữ cảnh thiết bị và chúng tôi cần xem xét điều đó. Ngay bây giờ có một loạt các đối tượng bộ nhớ chia sẻ được duy trì bởi mã Java/UI và được tham chiếu bởi mã C++, và đó là nút cổ chai. Do kiến ​​trúc đó, chúng tôi không thể di chuyển dữ liệu C++ xử lý sang một máy khác. Chúng ta cần có thể mở rộng để các tập con khác nhau của các thiết bị có thể được xử lý bởi các máy khác nhau, nhưng sau đó chúng ta mất khả năng tra cứu ngữ cảnh đó, và đó là vấn đề tôi đang cố giải quyết: làm thế nào để giảm tải xử lý dữ liệu thời gian cho các hộp khác trong khi vẫn có thể tham khảo ngữ cảnh thiết bị.

Tôi nên lưu ý rằng chúng tôi không kiểm soát được giao thức mà chính các thiết bị sử dụng và không có khả năng tình huống sẽ thay đổi.


Chúng tôi biết chúng ta cần phải thoát khỏi điều này để có thể mở rộng bằng cách thêm nhiều máy hơn vào cụm và tôi đang ở giai đoạn đầu để tìm hiểu chính xác cách chúng tôi thực hiện điều này.

Ngay bây giờ tôi đang xem Terracotta như một cách để mở rộng quy mô mã Java, nhưng tôi vẫn chưa tìm hiểu cách mở rộng C++ cho phù hợp.

Cũng như mở rộng quy mô cho hiệu suất, chúng tôi cũng cần cân nhắc tính khả dụng cao. Các ứng dụng cần phải có sẵn khá nhiều trong suốt thời gian - không hoàn toàn 100%, mà không phải là chi phí hiệu quả, nhưng chúng ta cần phải làm một công việc hợp lý của sống sót một cúp máy.

Nếu bạn đã thực hiện nhiệm vụ tôi đã được cung cấp, bạn sẽ làm gì?

CHỈNH SỬA: Dựa trên dữ liệu được cung cấp bởi @john channing, tôi đang xem cả GigaSpaces và Gemstone. Oracle Coherence và IBM ObjectGrid dường như chỉ là java.

Trả lời

5

Điều đầu tiên tôi sẽ làm là xây dựng mô hình hệ thống để ánh xạ luồng dữ liệu và cố gắng hiểu chính xác nơi nút cổ chai nằm. Nếu bạn có thể mô hình hóa hệ thống của mình như một pipeline, thì bạn có thể sử dụng lý thuyết về ràng buộc (hầu hết các tài liệu là tối ưu hóa quy trình kinh doanh nhưng nó áp dụng như nhau cho phần mềm) liên tục cải thiện hiệu suất và loại bỏ nút cổ chai.

Tiếp theo, tôi sẽ thu thập một số dữ liệu thực nghiệm khó mô tả chính xác hiệu suất của hệ thống của bạn. Đó là điều gì đó của một cliche mà bạn không thể quản lý những gì bạn không thể đo lường, nhưng tôi đã thấy nhiều người cố gắng tối ưu hóa một hệ thống phần mềm dựa trên linh cảm và thất bại thảm hại.

Sau đó, tôi sẽ sử dụng số Pareto Principle (80/20 rule) để chọn số lượng nhỏ những thứ sẽ tạo ra mức tăng lớn nhất và chỉ tập trung vào những mục tiêu đó.

Để mở rộng ứng dụng Java theo chiều ngang, tôi đã sử dụng rộng rãi Oracle Coherence. Mặc dù một số loại bỏ nó là rất tốn kém distributed hashtable, chức năng này phong phú hơn nhiều và bạn có thể, ví dụ, trực tiếp truy cập dữ liệu trong bộ nhớ cache từ C++ code.

Các lựa chọn thay thế khác cho việc mở rộng quy mô mã Java của bạn sẽ là Giga Spaces, IBM Object Grid hoặc Gemstone Gemfire.

Nếu mã C++ của bạn là không quốc tịch và được sử dụng hoàn toàn cho việc crunching số, bạn có thể xem xét việc phân phối quy trình bằng cách sử dụng ICE Grid có các ràng buộc cho tất cả ngôn ngữ bạn đang sử dụng.

+0

Có một số liên kết tuyệt vời ở đây, John. Cảm ơn. Tôi có một số đọc để làm. – Andrew

1

Bạn cần chia tỷ lệ sang một bên và ra ngoài. Có lẽ một cái gì đó giống như một message queue có thể là phụ trợ giữa lối vào và crunching.

1

Andrew, (ngoài mô hình hóa làm đường ống, v.v.), việc đo đạc mọi thứ là quan trọng. Bạn đã chạy một profiler trên mã và có số liệu của nơi mà hầu hết thời gian được chi tiêu?

Đối với mã cơ sở dữ liệu, tần suất nó thay đổi? Bạn đang xem bộ nhớ đệm tại thời điểm này? Tôi giả sử bạn đã xem xét các chỉ số vv trên dữ liệu để tăng tốc độ Db?

Mức lưu lượng truy cập nào bạn có ở giao diện người dùng? Bạn đang lưu vào bộ nhớ đệm các trang web? (Không quá khó để nói sử dụng api kiểu JMS để giao tiếp giữa các thành phần. Sau đó bạn có thể đặt thành phần Trang Web trên một máy (hoặc nhiều hơn), và sau đó đặt mã tích hợp (C++) vào một khác và cho nhiều JMS các sản phẩm thường có nguồn gốc của C++ api. ActiveMQ đến với tâm trí), nhưng nó thực sự giúp bạn biết được bao nhiêu thời gian trong Web (JSP?), C++, cơ sở dữ liệu ops.

Cơ sở dữ liệu có lưu trữ dữ liệu nghiệp vụ hay nó cũng được sử dụng để chuyển dữ liệu giữa Java và C++? Bạn nói rằng bạn đang sử dụng mem được chia sẻ chứ không phải JNI? Mức độ đa luồng hiện tồn tại trong APP là gì? Bạn có mô tả mã như được đồng bộ trong tự nhiên hoặc không đồng bộ?

Có mối quan hệ vật lý giữa mã Solaris và thiết bị phải được duy trì (ví dụ: làm tất cả các thiết bị đăng ký bằng mã C++ hay có thể chỉ định). I E. nếu bạn đã đặt một cân bằng tải web trên giao diện người dùng, và chỉ cần đặt 2 máy lên ngày hôm nay là relationhip trong đó các thiết bị được quản lý bởi một hộp được khởi tạo trước hoặc trước?

Yêu cầu HA là gì? I E. chỉ thông tin trạng thái? HA có thể được thực hiện chỉ trong tầng web bằng cách phân cụm dữ liệu phiên?

DB có chạy trên máy khác không?

DB lớn bao nhiêu? Bạn đã tối ưu hóa truy vấn của bạn tức là. đã thử bằng cách sử dụng các kết nối bên trong/bên ngoài rõ ràng đôi khi giúp so sánh các truy vấn con lồng nhau (sometmes). (một lần nữa nhìn vào số liệu thống kê sql).