Tôi đang phát triển một API REST đơn giản sử dụng Spring 3 + Spring MVC. Việc xác thực sẽ được thực hiện thông qua OAuth 2.0 hoặc auth cơ bản với mã thông báo ứng dụng khách sử dụng Spring Security. Đây vẫn là cuộc tranh luận. Tất cả các kết nối sẽ bị buộc thông qua kết nối SSL.Làm cách nào để triển khai giới hạn tốc độ dựa trên mã thông báo của khách hàng trong Spring?
Tôi đã tìm kiếm thông tin về cách triển khai giới hạn tốc độ, nhưng dường như không có nhiều thông tin ngoài đó. Việc triển khai cần phải được phân phối, trong đó nó hoạt động trên nhiều máy chủ web. Ví dụ: nếu có ba máy chủ api A, B, C và khách hàng được giới hạn trong 5 yêu cầu trong một giây, thì khách hàng yêu cầu 6 yêu cầu như vậy sẽ tìm thấy yêu cầu đối với C bị từ chối do lỗi.
A recieves 3 requests \
B receives 2 requests | Executed in order, all requests from one client.
C receives 1 request /
Nó cần phải làm việc dựa trên một mã thông báo có trong yêu cầu, là một khách hàng có thể đưa ra yêu cầu thay mặt cho nhiều người dùng, và mỗi người dùng nên được giới hạn tốc độ chứ không phải là địa chỉ IP của máy chủ.
Thiết lập sẽ là nhiều (2-5) máy chủ web phía sau bộ cân bằng tải HAProxy. Có một Cassandra được hỗ trợ, và memcached được sử dụng. Các máy chủ web sẽ chạy trên Jetty.
Một giải pháp tiềm năng có thể là viết bộ lọc Spring Security tùy chỉnh để trích xuất mã thông báo và kiểm tra số lượng yêu cầu đã được thực hiện với nó trong X giây qua. Điều này sẽ cho phép chúng tôi thực hiện một số điều như giới hạn tốc độ khác nhau cho các khách hàng khác nhau.
Bất kỳ đề xuất nào về cách thực hiện? Có giải pháp hiện tại hay tôi sẽ phải viết giải pháp của riêng mình? Tôi đã không thực hiện rất nhiều cơ sở hạ tầng trang web trước đây.
Bạn đang đi đúng hướng với ý tưởng bộ lọc. Vì bạn đã sử dụng memcached nên nó đơn giản. – sourcedelica
Nó trông giống như một bộ lọc có thể là con đường để đi. Đã tìm thấy bài viết hữu ích về việc triển khai hệ thống thùng trong khoảng thời gian để bạn có thể kiểm tra việc sử dụng api trong X phút/giây cuối cùng -> http://chris6f.com/rate-limiting-with-redis. Nó sử dụng redis nhưng các nguyên tắc nên tương tự như memcache hoặc cassandra. –