5

Giả sử, tôi có các tiến trình P chạy một số logic nghiệp vụ trên N máy vật lý. Các quá trình này gọi một số dịch vụ web S, nói. Tôi muốn đảm bảo rằng không quá X cuộc gọi được thực hiện cho dịch vụ S mỗi giây bởi tất cả các quy trình P được kết hợp.Làm cách nào để triển khai giới hạn tốc độ phân phối?

Giải pháp như vậy có thể được triển khai như thế nào?

Giới hạn tốc độ của Google Guava hoạt động tốt cho các quy trình chạy trên một hộp, nhưng không nằm trong thiết lập được phân phối.

Có bất kỳ giải pháp chuẩn, sẵn sàng để sử dụng nào có sẵn cho JAVA không? [có thể dựa trên sở thú]

Cảm ơn!

+1

Nhà quản lý (một ứng dụng Java ZooKeeper thường được sử dụng) không có công thức chính xác này. Tuy nhiên Curator có một công thức phân phối dài có thể được sử dụng làm cơ sở cho việc này: http://curator.apache.org/curator-recipes/distributed-atomic-long.html – Randgalt

+0

Hm, không được chia sẻ semaphore một công thức phù hợp cho trường hợp này? http://curator.apache.org/curator-recipes/shared-semaphore.html –

+0

Vấn đề với semaphore được chia sẻ là phải có ai đó giải phóng tất cả các khóa mỗi giây.Tôi nghĩ phân phối nguyên tử dài hoặc số nguyên sẽ phù hợp, nhưng Tôi đã không thực hiện giải pháp của tôi được nêu ra .. vì vậy không chắc chắn –

Trả lời

2

Tôi đã làm việc trên giải pháp nguồn mở cho các loại vấn đề này.

Giới hạn là "máy chủ" cho các giới hạn. Các giới hạn được triển khai bằng cách sử dụng .

Về cơ bản bạn xác định giới hạn trong cấu hình dịch vụ như thế này:

buckets: 
    "request to service a": 
    per_minute: 10 
    "request to service b": 
    per_minute: 5 

Dịch vụ này được chạy như một daemon lắng nghe trên một cổng TCP/IP.

Sau đó, ứng dụng của bạn làm điều gì đó dọc theo những dòng:

var limitd = new Limitd('limitd://my-limitd-address'); 

limitd.take('request to service a', 'app1' 1, function (err, result) { 
    if (result.conformant) { 
    console.log('everything is okay - this should be allowed'); 
    } else { 
    console.error('too many calls to this thing'); 
    } 
}); 

Chúng tôi hiện đang sử dụng này cho tốc độ giới hạn và debouncing một số sự kiện ứng dụng.

Máy chủ là trên:

https://github.com/auth0/limitd

Chúng tôi đang có kế hoạch để làm việc trên nhiều SDK nhưng bây giờ chúng tôi chỉ có Node.js và thực hiện một phần đi:

https://github.com/limitd

0

https://github.com/jdwyah/ratelimit-java cung cấp giới hạn tốc độ phân phối chỉ nên thực hiện điều này. Bạn có thể định cấu hình giới hạn của mình dưới dạng S/giây/phút v.v ... và chọn kích thước khối lượng/tỷ lệ lấp đầy của thùng bị rò rỉ nằm dưới nắp.

1

Bucket4j là việc triển khai java thuật toán hạn chế tốc độ "mã thông báo". Nó hoạt động cả hai địa phương và phân phối (trên đầu trang của JCache). Đối với trường hợp sử dụng phân tán, bạn được tự do chọn bất kỳ triển khai JCache nào như Hazelcast hoặc Apache Ignite. Xem this example của việc sử dụng Bucket4j trong cụm.

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