2009-06-29 71 views
48

Bạn sẽ sử dụng dịch vụ khóa phân phối nào?Dịch vụ khóa phân phối

Yêu cầu là:

  1. Một loại trừ lẫn nhau (khóa) có thể được nhìn thấy từ các quy trình/máy khác nhau
  2. ngữ nghĩa khóa ... phát hành
  3. phát hành khóa tự động sau một thời gian chờ nhất định - nếu khóa chủ sở hữu chết, nó sẽ tự động được giải phóng sau X giây
  4. Triển khai Java
  5. Rất tốt để có: .Net implementation
  6. Nếu hoàn toàn miễn phí: Phát hiện/giảm thiểu khóa chết
  7. Triển khai dễ dàng, hãy xem lưu ý bên dưới.

Tôi không quan tâm đến câu trả lời như "nó có thể được thực hiện trên cơ sở dữ liệu" hoặc "nó có thể được thực hiện trên JavaSpaces" - tôi biết. Tôi quan tâm đến việc triển khai sẵn sàng, ngoài hộp, đã được chứng minh.

+3

Thêm thương lượng khóa chết vào danh sách của bạn: P –

+2

Vì mục đích của tôi, không cần thiết. Tôi sẽ thêm như là một tốt đẹp có. – ripper234

+0

Bạn có thể quan tâm đến [gói NuGet này] (https://github.com/madelson/DistributedLock), giúp dễ dàng sử dụng chức năng khóa ứng dụng tích hợp của SqlServer như một máy chủ khóa phân tán. – ChaseMedallion

Trả lời

13

Teracotta, bao gồm ấn bản Nguồn mở, đã phân phối ngữ nghĩa khóa bằng cách sử dụng synchronized hoặc java.util.concurrent.ReentrantReadWriteLock - sau này dường như phù hợp với yêu cầu của bạn.


Cập nhật

Kể từ khi câu hỏi bây giờ thêm các yêu cầu của 'trộn' với GigaSpaces, tôi sẽ nói không trộn chúng. Điều đó sẽ làm tăng thêm sự phức tạp cho ngăn xếp công nghệ của bạn và nỗ lực của:

  • tích hợp cả về mã và cơ sở hạ tầng;
  • quản lý đồng bộ hóa giữa chúng;
  • học/điều chỉnh/gỡ lỗi Teracotta.

sẽ chi tiêu tốt hơn để tạo hoặc triển khai giải pháp khóa dựa trên GigaSpaces.

+0

Giả sử chúng tôi đã sử dụng GigaSpaces, bạn có thêm Đất nung vào hỗn hợp không? Hai người có chơi cùng nhau không? – ripper234

+0

Đó là hướng tôi sẽ đến vào lúc này. Sẽ xuất bản nó khi nó đã sẵn sàng. – ripper234

22

Một đứa trẻ mới hơn trên khối là hazelcast. Tôi đã chơi với nó và nó là đáng ngạc nhiên đơn giản để sử dụng và cấu hình.

Theo như tôi có thể thấy không nên có bất kỳ mâu thuẫn giữa Gigaspaces và Hazelcast như Hazelcast không có bất kỳ phụ thuộc tức là không jgroups.jar vv

Hazelcast:

  1. Một loại trừ lẫn nhau (khóa), yep triển khai java.util.concurrency.locks.Lock
  2. Tự động khóa sau khi hết thời gian chờ nhất định, tất cả các khóa được giải phóng nếu thành viên rời khỏi cụm
  3. Triển khai Java, yep
  4. Rất có:.Net thực hiện, nope là một giải pháp java tinh khiết, có thể có thể chuyển đến j #
  5. Nếu hoàn toàn miễn phí: Phát hiện/giảm thiểu khóa chết, không cần thiết phải thực hiện Hazelcast của tôi để xử lý việc này
  6. Dễ dàng triển khai. một tệp cấu hình duy nhất, được triển khai như là một phần của ứng dụng của bạn, không yêu cầu quy trình bổ sung
+0

Mọi nỗ lực triển khai? Tôi sẽ tinh chỉnh câu hỏi của mình - các giải pháp không cần triển khai thêm và có thể sử dụng MySql, JavaSpaces/GigaSpaces hoặc NetApp được (cao) thích hợp hơn. – ripper234

+1

Tôi chưa thực sự triển khai Hazelcast, nhưng tôi đang tích cực xem xét việc sử dụng nó cho khóa phân phối. Triển khai dường như là gần như trival vì không có quá trình bên ngoài, tất cả các JVM trong cluster chỉ cần làm việc ra những gì cần làm –

+0

Có vẻ đáng ngờ. Họ ít nhất cần phải biết về sự tồn tại của nhau bằng cách nào đó ... Dù sao, tôi thích (và nhấn mạnh) một giải pháp dựa trên các công nghệ hiện có mà chúng tôi đang sử dụng - Tôi không nghĩ nó giới thiệu một khung công tác khác khi chúng tôi đã làm việc với GigaSpaces. Có thể không có giải pháp dựa trên MySql nào tồn tại không ??? – ripper234

12

Kiểm tra Apache's Zookeeper (Một dự án Hadoop) - nó cung cấp đồng bộ hóa phân phối. Các tài liệu không phải là tuyệt vời, nhưng những gì có làm cho nó trông một sản phẩm thú vị - kiểm tra các công thức nấu ăn cho những ý tưởng về cách sử dụng Zookeeper.

Đây là cấp thấp hơn bạn có thể muốn và nó yêu cầu triển khai bổ sung vì nó đề xuất máy chủ chuyên dụng.

Bạn có thể lập mô hình các chiến lược khóa khác nhau và nó cung cấp giải pháp cho người giữ khóa chết (các nút tạm thời).

+4

AFAIU, ZooKeeper ghi vào đĩa cho mỗi khóa có được. Nó quá đắt. – stepancheg

+2

Tính năng ghi vào nhật ký ghi trước là dành cho khả năng phục hồi. Và kể từ khi dịch vụ khóa được phân phối, khóa mua lại sẽ phát sinh mạng du lịch nếu khóa không được lưu trữ. So với mạng du lịch, một phụ thêm vào đĩa không phải là rất tốn kém. Zookeepr được sử dụng trong nhiều hệ thống phân tán như HBase. Hiệu suất của nó là tốt. –

4

Tôi khuyên bạn nên sử dụng RedissonRedis dựa trên Lưới dữ liệu trong bộ nhớ. Nó triển khai các cấu trúc dữ liệu Java quen thuộc bao gồm các đối tượng được phân phối java.util.Lockjava.util.concurrent.ReentrantReadWriteLock. Bao gồm khả năng thiết lập thời gian thuê. Lock ví dụ sử dụng:

Redisson redisson = Redisson.create(config); 

Lock lock = redisson.getLock("anyLock"); 
try { 
    // unlock automatically after 10 seconds of hold 
    lock.lock(10, TimeUnit.SECONDS); 

} finally { 
    lock.unlock(); 
} 

... 

redisson.shutdown(); 

Hỗ trợ các nhà cung cấp đám mây như Azure và AWS.

+0

Điều này có bao gồm tất cả các trường hợp sử dụng mà câu hỏi có không? Tôi đã xem qua và không thấy tính năng hết thời gian hết hạn tự động trên khóa. – Scott

+2

@Scott tôi đã sửa câu trả lời của tôi, khả năng mới để thiết lập thời gian chờ khóa phát hành đã được thêm vào trong phiên bản Redisson 1.1.4 –

0

Oracle Coherence, mà là rất ổn định và trưởng thành, bao gồm hỗ trợ loại trừ lẫn nhau:

cache.lock(key, -1); 
try { 
    // .. 
} finally { 
    cache.unlock(key); 
} 

Khóa tồn thất bại máy chủ, cán tái khởi động vv

Vì lợi ích của tiết lộ đầy đủ, Tôi làm việc tại Oracle. Ý kiến ​​và quan điểm thể hiện trong bài viết này là của riêng tôi và không nhất thiết phản ánh quan điểm hoặc quan điểm của chủ nhân của tôi.

3

ZooKeeper trở thành tiêu chuẩn thực tế trong khóa phân phối với sự trợ giúp của khung Apache Curator. Kiểm tra các khóa trong recipes để biết thêm thông tin.

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