2013-05-20 73 views
7

Tôi đã thiết lập ứng dụng để thực hiện cuộc gọi theo lịch tới một số API mỗi ngày một lần. Điều này làm việc rất độc đáo nhưng tôi biết rằng một số các API tôi đang gọi (Twitter ví dụ) có một giới hạn tốc độ. Khi số lượng cuộc gọi tôi đang thực hiện được thiết lập để liên tục phát triển, bất cứ ai có thể giới thiệu một cách để tăng tốc các cuộc gọi của tôi để tôi có thể gửi trong bursts của x mỗi giờ/phút vv?Xử lý các giới hạn tốc độ API?

Tôi đã tìm thấy viên đá quý Glutton Ratelimit, có ai đang sử dụng nó và nó có tốt không? Có những người khác tôi nên xem xét không?

+1

Tôi không có một câu trả lời cho bạn, nhưng nếu bạn biết bạn sẽ liên tục phát triển số lượng yêu cầu bạn thực hiện sau đó throttling sẽ chỉ gây ra một hàng đợi tăng trưởng ở mức tương tự, bạn cần phải xem xét làm thế nào để đối phó với một hàng đợi mà sẽ không bao giờ trống rỗng là tốt. – Matt

+0

Hãy nghe những gì bạn đang nói. Tôi đã sử dụng delay_job và hy vọng sẽ kết hợp nó theo một cách nào đó. Các yêu cầu sẽ phát triển, nhưng tôi không thể nhìn thấy chúng ngày càng phát triển vượt quá 10-15k mỗi ngày. – Raoot

+1

Lạ cách câu hỏi này được sửa đổi lên đến +4 và [một câu hỏi giống hệt] (http://stackoverflow.com/questions/15309544/how-to-make-concurrent-http-request-in-ruby-at-the- tốc độ nhanh nhất có thể-to-không) đã được modded xuống -3 và đóng cửa. Tôi đoán thời gian là mọi thứ – pguardiario

Trả lời

4

Nếu bạn đang sử dụng một số loại nhân viên nền để thực hiện cuộc gọi API, bạn có thể lên lịch lại nhiệm vụ để được sửa lại trong khe thời gian tiếp theo, khi giới hạn tốc độ được đặt lại.

class TwitterWorker 
    include Sidekiq::Worker 

    def perform(status_id) 
    status = Twitter.status(status_id) 
    # ... 

    rescue Twitter::Error::TooManyRequests 
    # Reschedule the query to be performed in the next time slot 
    TwitterWorker.perform_in(15.minutes, status_id) 
    end 
end 

Không có giải pháp khoa học nào, ví dụ: rủi ro là một truy vấn có thể được lên lịch lại mỗi lần nếu bạn cố gắng thực hiện nhiều cuộc gọi API trong một ngày hơn giới hạn tốc độ cho phép. Nhưng cho đến lúc đó, điều gì đó dễ dàng có thể làm được điều đó!

+0

Cảm ơn, điều này có ý nghĩa. Tôi đang sử dụng delay_job để thực hiện các công việc nền. Tôi sẽ xem xét thêm về điều này, cảm ơn lời khuyên của bạn. – Raoot

+1

Đây thực sự là một ý tưởng rất đơn giản.Tôi thực sự đặt tên cho trường hợp ngoại lệ được giải cứu 'e' và thực hiện' perform_id (e.rate_limit.reset_in, ...) 'để nó thử lại ngay khi có hạn ngạch –

0

giải pháp khác là mua proxy cho phép bạn gửi yêu cầu với các địa chỉ IP khác nhau

Sử dụng lib http chuẩn http://ruby-doc.org/stdlib-2.0/libdoc/net/http/rdoc/Net/HTTP.html#method-c-Proxy

Tôi không chắc chắn rằng bạn sẽ không bị chặn nhưng có lẽ nó là đáng để thử . IP được chọn ngẫu nhiên sẽ tăng giới hạn của bạn

+3

Kỹ thuật này có thể hoạt động đối với các API chưa được xác thực. Tuy nhiên, khi bạn làm việc với API REST của Twitter 1.1, tất cả các yêu cầu của bạn cần phải được xác thực và do đó được liên kết trực tiếp với bạn, bất kể yêu cầu IP đến từ đâu. Suy nghĩ tốt, mặc dù! –

+0

Có chính xác. Proxy sẽ giúp cho giới hạn tỷ lệ cho mỗi ip như bản đồ google, nhưng không cho giới hạn cho mỗi tài khoản như tôi tưởng tượng twitter. – pguardiario

+0

Cách tiếp cận thú vị và có thể hữu ích ở nơi khác. – Raoot

0

Trừ khi bạn thực hiện yêu cầu đồng thời, không có nhiều yêu cầu.

  • Hình ra bao nhiêu chậm trễ bạn cần theo yêu cầu
  • Kiểm tra thời gian trước khi yêu cầu, trừ từ thời điểm sau khi yêu cầu và sleep phần còn lại.

Với yêu cầu đồng thời bạn có thể chính xác hơn, I once blogged about that here

+0

Cảm ơn bạn, hãy xem blog của bạn. – Raoot

0

Tôi biết đây là một câu hỏi cũ, nhưng muốn đề cập đến một cái gì đó trong trường hợp nó giúp những người khác với cùng một câu hỏi.

Nếu tác phẩm có thể được xếp hàng đợi bằng cách sử dụng lại, bạn có thể sử dụng đá quý mà tôi vừa mới phát hành, tạm dừng hàng đợi khi bạn đạt đến mức ưu tiên - và bỏ tạm thời sau một thời gian.

https://github.com/pavoni/resque-rate_limited_queue

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