2009-07-28 42 views
42

Chiến lược tốt nhất để cấu trúc lại đối tượng Singleton thành môi trường cụm là gì?Singleton trong môi trường Cluster

Chúng tôi sử dụng Singleton để lưu trữ một số thông tin tùy chỉnh từ Cơ sở dữ liệu. chủ yếu là chỉ đọc nhưng được làm mới khi một số sự kiện cụ thể xảy ra.

Bây giờ, ứng dụng của chúng tôi cần được triển khai trong môi trường Clustered. Theo định nghĩa, mỗi JVM sẽ có một cá thể Singleton của riêng nó. Vì vậy, bộ đệm ẩn có thể không đồng bộ giữa JVM khi sự kiện làm mới xảy ra trên một nút và bộ nhớ cache của nó được làm mới.

Cách tốt nhất để giữ bộ nhớ cache được đồng bộ hóa là gì?

Cảm ơn.

Chỉnh sửa: Bộ nhớ cache được sử dụng chủ yếu để cung cấp danh sách tự động hoàn thành (lý do hiệu suất) cho giao diện người dùng và chúng tôi sử dụng Websphere. Vì vậy, bất kỳ lời khuyên liên quan đến Websphere chào đón.

Trả lời

9

Các phương pháp đơn giản nhất là:

  1. Thêm một bộ đếm thời gian hết hạn để bộ nhớ cache singleton của bạn để tất cả vì vậy thường bộ nhớ cache được thanh lọc và subsquent cuộc gọi tìm nạp dữ liệu được cập nhật từ nguồn (ví dụcơ sở dữ liệu)

  2. Triển khai cơ chế thông báo cho bộ nhớ cache bằng cách sử dụng thứ gì đó như chủ đề JMS/tibRV. Nhận từng cá thể bộ nhớ cache để đăng ký và phản ứng với bất kỳ thông báo thay đổi nào được phát sóng về chủ đề này.

+0

Bạn có thể xây dựng trên 2 không? Bạn có nghĩa là JMS pub/đăng ký mô hình? – lud0h

+0

Có giải pháp 2 về cơ bản là cách sử dụng cơ chế pub/sub để phát sóng các thay đổi đối với các cá thể bộ nhớ cache riêng lẻ. Bạn sẽ cần phải tạo một chủ đề JMS chạy trên máy chủ ứng dụng được đăng ký bởi từng bộ đệm. Khi dữ liệu đó thay đổi một thông báo sẽ cần phải được công bố cho chủ đề. Mỗi người đăng ký sẽ nhận được thông báo này và cập nhật bộ nhớ cache cục bộ cho phù hợp. – pjp

+0

Nếu dữ liệu của bạn không thay đổi thường xuyên thì tôi sẽ đi cho tùy chọn 1. Tôi đã làm việc trên một số hệ thống bằng cách sử dụng phương pháp này để làm mới dữ liệu tham khảo. Tôi tin rằng chúng tôi đã từng làm mới bộ nhớ cache khoảng 30 phút một lần. Thời gian làm mới bạn chọn sẽ rõ ràng dựa trên cách dữ liệu tham chiếu của bạn đang được sử dụng. – pjp

16

Thay thế bộ nhớ cache đơn với bộ nhớ cache được phân phối.

Một bộ nhớ cache như vậy có thể là JBoss Infinispan nhưng tôi chắc chắn rằng các công nghệ mạng và bộ nhớ cache được phân phối khác tồn tại, bao gồm cả các công cụ thương mại có thể trưởng thành hơn vào thời điểm này.

Đối với các đối tượng đơn lẻ nói chung, tôi không chắc chắn. Tôi nghĩ tôi sẽ không có những người độc thân ngay từ đầu.

+0

Tôi nhận thấy rằng đơn giản nhất (chủ quan) để triển khai có vẻ là 'ehcache'. –

1

Nếu có thể, hãy sử dụng hỗ trợ của máy chủ ứng dụng của bạn cho điều này, nếu có thể (một số có, một số thì không). Ví dụ, chúng tôi sử dụng hỗ trợ của JBoss cho một "HA Singleton" là một dịch vụ chỉ chạy trên nút chính của cụm. Nó không hoàn hảo (bạn phải xử lý các trường hợp đôi khi nó não rắm), nhưng nó là đủ tốt.

Nếu không, bạn có thể thiết kế một cái gì đó bằng cách sử dụng JGroups, cung cấp tính năng tự động phát hiện và đàm phán nút cụm, nhưng nó không tầm thường.

Như một phương sách cuối cùng, bạn có thể sử dụng khóa cơ sở dữ liệu để quản lý cụm đơn, nhưng đó là nghiêm trọng mong manh. Không được khuyến khích.

Để thay thế cho một cụm đơn, bạn có thể sử dụng bộ nhớ cache được phân phối thay thế. Tôi khuyên bạn nên JBossCache (mà không cần máy chủ ứng dụng JBoss để chạy) hoặc EhCache (mà bây giờ cung cấp một cơ chế phân phối). Bạn sẽ phải tập hợp lại bộ nhớ đệm của bạn để làm việc theo cách phân tán (nó sẽ không thực sự kỳ diệu), nhưng nó có thể sẽ là một giải pháp tốt hơn so với một singleton cluster.

1

Tôi cùng với ông Vest Hansen trong nhóm này, di chuyển xa những người độc thân như bạn có thể làm được. Sau khi bị quấy rầy với cơn ác mộng đó là SAAJ và JAXP và nhận được các phiên bản tương thích làm việc trên JBoss, tôi đã làm xong với những người độc thân và nhà máy. Một thông điệp SOAP không cần một nhà máy để khởi tạo nó.

Được rồi, đọc lại, về memcache hoặc nội dung tương tự? Bạn cần loại sở thích nào cho bộ nhớ cache của mình? Có tệ không nếu nó EVER hết hạn, hoặc có một số linh hoạt trong cách dữ liệu có thể nhận được không?

+0

Chúng tôi sử dụng nó cho danh sách tự động hoàn thành, vì vậy người dùng sẽ không thấy các thay đổi. Thx cho phản hồi của bạn. – lud0h

4

Hoặc một cái gì đó giống như memcached

http://www.danga.com/memcached/

gì được memcached? memcached là hiệu suất cao, bộ nhớ phân phối hệ thống bộ nhớ đệm đối tượng, chung trong tự nhiên , nhưng được thiết kế để sử dụng trong tăng tốc các ứng dụng web động bằng cách giảm tải cơ sở dữ liệu.

Danga Interactive được phát triển memcached để nâng cao tốc độ của LiveJournal.com, một trang web mà là đã làm 20 triệu + động trang lượt xem mỗi ngày cho 1 triệu người dùng với một loạt các máy chủ web và một loạt các cơ sở dữ liệu máy chủ. memcached giảm tải cơ sở dữ liệu về hầu như không có gì, cho thời gian tải trang nhanh hơn đối với người dùng , sử dụng tài nguyên tốt hơn, và truy cập nhanh hơn vào cơ sở dữ liệu trên bỏ lỡ memcache.

1

Có một số cách để xử lý điều này, tùy thuộc vào 1) cách dữ liệu được tính và 2) mọi trường hợp cần phải có cùng giá trị không.

Nếu bạn chỉ cần dữ liệu hợp lý cho dữ liệu, nhưng mọi JVM không cần phải có dữ liệu phù hợp, bạn chỉ có thể làm mới mọi dữ liệu trên cùng một lịch biểu (ví dụ: cứ sau 30 giây).

Nếu refresh cần phải xảy ra vào khoảng thời gian tương tự, bạn có thể có một JVM gửi đi một thông điệp tới phần còn lại của họ nói rằng "thời gian của mình để làm mới bây giờ"

Nếu mỗi JVM luôn cần những thông tin tương tự , bạn cần phải thực hiện đồng bộ hóa, nơi tổng thể nói "làm mới ngay bây giờ", tất cả bộ đệm sẽ chặn mọi truy vấn mới, làm mới và thông báo cho chủ nhân biết rằng chúng đã hoàn tất. Khi master nhận được câu trả lời từ mọi thành viên của cluster, nó sẽ gửi một thông báo khác để tiến hành.

+0

Mỗi trường hợp cần một số dữ liệu, nếu không người dùng sẽ không thấy thay đổi mới. Bạn có thể xây dựng thêm một chút về việc giữ cho JVM được đồng bộ hóa hay không. Loại phụ/thông báo nào có sẵn? Cám ơn. – lud0h

+1

^Mỗi trường hợp cần một số dữ liệu^-> Mỗi trường hợp cần * cùng * dữ liệu – lud0h

+0

1, Bạn có thể giải thích cách bạn đang nói với các JVM khác để làm mới. Bạn đang sử dụng phương pháp tiếp cận pub/sub? 2, Điều gì sẽ xảy ra nếu cần cập nhật dữ liệu mà không bị chậm trễ. tức là nếu một luồng trong JVM1 đang cập nhật dữ liệu và JVM2 phút tiếp theo cần dữ liệu đó. cách xử lý tình huống này. –

0

Có các sản phẩm để phân phối trong bộ nhớ cache (chẳng hạn như memcache) có thể trợ giúp trong trường hợp này. Một giải pháp tốt hơn, nếu có thể, có thể có những người độc thân không thực sự là duy nhất, nhưng có ứng dụng chịu đựng các trường hợp riêng biệt (nói rằng tất cả nhận ra khi chúng cần được làm mới) nhưng không phải là chúng phải ở trong đồng bộ hóa trên các JVM, có thể biến bộ nhớ cache của bạn thành một nút cổ chai.

+0

Vâng phần lừa là "mà tất cả nhận ra khi họ cần phải được làm mới" ... JMS cần một nhà cung cấp tin nhắn, trông RMI có thể là lựa chọn duy nhất. Bất kỳ ý tưởng nào khác? (ngoài jGroups/Terracota) và cứ thế ... nghĩa là ... withtout phụ thuộc bên ngoài? – lud0h

8

Bạn có thể sử dụng số DistributedMap được tích hợp vào WAS.

-Rick

+0

Cảm ơn bạn đã liên kết. Có vẻ như nó có thể đơn giản hơn nhiều để thiết lập và sử dụng hơn JMS. – lud0h

+0

liên kết dường như đã chết hiện nay ... –

1

Tôi đang phải đối mặt với một tình huống tương tự, nhưng tôi đang sử dụng Oracle WebLogic Coherence.

Tôi đang làm việc trên một ứng dụng web có sử dụng một hashmap với dữ liệu lưu trữ đọc từ cơ sở dữ liệu (văn bản hiển thị trên Webform 's nhãn). Để thực hiện điều này, các nhà phát triển đã sử dụng một cá thể đơn lẻ nơi họ lưu trữ tất cả thông tin này. Điều này làm việc tốt trên một môi trường máy chủ duy nhất, nhưng bây giờ chúng tôi muốn đi vào giải pháp cụm và tôi đang phải đối mặt với vấn đề này với trường hợp singleton này.

Từ những gì tôi đã đọc bây giờ, this is the best solution to accomplish what I want. Tôi hy vọng điều này sẽ giúp bạn với vấn đề của bạn, quá.

+0

Liên kết trên không hoạt động. bạn có thể chia sẻ khái niệm này không –

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