What is the correct client reaction to a HTTP 429 when the client is multi-threaded?












3















The HTTP status code 429 tells the client making the request to back off and retry the request after a period specified in the response's Retry-After header.



In a single-threaded client, it is obvious that the thread getting the 429 should wait as told and then retry. But the RFC explicitly states that




this specification does not define how the origin server identifies
the user, nor how it counts requests.




Consequently, in a multi-threaded client, the conservative approach would stop all threads from sending requests until the Retry-After point in time. But:




  • Many threads may already be past the point where they can note the information from the one rejected thread and will send at least one more request.

  • The global synchronization between the threads can be a pain to implement and get right

  • If the setup runs not only several threads but several clients, potentially on different machines, backing off all of them on one 429 becomes non-trivial.


Does anyone have specific data from the field how servers of cloud providers actually handle this? Will they get immediately aggravated if I don't globally hold back all threads. Microsoft's advice is





  1. Wait the number of seconds specified in the Retry-After field.

  2. Retry the request.

  3. If the request fails again with a 429 error code, you are still being throttled. Continue to use the recommended Retry-After delay and retry the request until it succeeds.




It twice says 'the request' not 'any requests' or 'all requests', but this is legal-type interpretation I am not confident about.



To be sure this is not an opinion question, let me phrase it as fact-based as possible:



Are there more detailed specifications for cloud APIs (Microsoft, Google, Facebook, Twitter) then the example above that allow me to make an informed decision whether global back-off is necessary or whether it suffices to back-off with the specific request that got the 429?










share|improve this question

























  • One hit: docs.microsoft.com/en-us/dynamics365/customer-engagement/… says: "All requests will return these error responses until the volume of API requests falls below the limit." Might be construed as to not needing global back-off, because each requests gets a back-off answer.

    – Harald
    Nov 26 '18 at 8:06
















3















The HTTP status code 429 tells the client making the request to back off and retry the request after a period specified in the response's Retry-After header.



In a single-threaded client, it is obvious that the thread getting the 429 should wait as told and then retry. But the RFC explicitly states that




this specification does not define how the origin server identifies
the user, nor how it counts requests.




Consequently, in a multi-threaded client, the conservative approach would stop all threads from sending requests until the Retry-After point in time. But:




  • Many threads may already be past the point where they can note the information from the one rejected thread and will send at least one more request.

  • The global synchronization between the threads can be a pain to implement and get right

  • If the setup runs not only several threads but several clients, potentially on different machines, backing off all of them on one 429 becomes non-trivial.


Does anyone have specific data from the field how servers of cloud providers actually handle this? Will they get immediately aggravated if I don't globally hold back all threads. Microsoft's advice is





  1. Wait the number of seconds specified in the Retry-After field.

  2. Retry the request.

  3. If the request fails again with a 429 error code, you are still being throttled. Continue to use the recommended Retry-After delay and retry the request until it succeeds.




It twice says 'the request' not 'any requests' or 'all requests', but this is legal-type interpretation I am not confident about.



To be sure this is not an opinion question, let me phrase it as fact-based as possible:



Are there more detailed specifications for cloud APIs (Microsoft, Google, Facebook, Twitter) then the example above that allow me to make an informed decision whether global back-off is necessary or whether it suffices to back-off with the specific request that got the 429?










share|improve this question

























  • One hit: docs.microsoft.com/en-us/dynamics365/customer-engagement/… says: "All requests will return these error responses until the volume of API requests falls below the limit." Might be construed as to not needing global back-off, because each requests gets a back-off answer.

    – Harald
    Nov 26 '18 at 8:06














3












3








3


1






The HTTP status code 429 tells the client making the request to back off and retry the request after a period specified in the response's Retry-After header.



In a single-threaded client, it is obvious that the thread getting the 429 should wait as told and then retry. But the RFC explicitly states that




this specification does not define how the origin server identifies
the user, nor how it counts requests.




Consequently, in a multi-threaded client, the conservative approach would stop all threads from sending requests until the Retry-After point in time. But:




  • Many threads may already be past the point where they can note the information from the one rejected thread and will send at least one more request.

  • The global synchronization between the threads can be a pain to implement and get right

  • If the setup runs not only several threads but several clients, potentially on different machines, backing off all of them on one 429 becomes non-trivial.


Does anyone have specific data from the field how servers of cloud providers actually handle this? Will they get immediately aggravated if I don't globally hold back all threads. Microsoft's advice is





  1. Wait the number of seconds specified in the Retry-After field.

  2. Retry the request.

  3. If the request fails again with a 429 error code, you are still being throttled. Continue to use the recommended Retry-After delay and retry the request until it succeeds.




It twice says 'the request' not 'any requests' or 'all requests', but this is legal-type interpretation I am not confident about.



To be sure this is not an opinion question, let me phrase it as fact-based as possible:



Are there more detailed specifications for cloud APIs (Microsoft, Google, Facebook, Twitter) then the example above that allow me to make an informed decision whether global back-off is necessary or whether it suffices to back-off with the specific request that got the 429?










share|improve this question
















The HTTP status code 429 tells the client making the request to back off and retry the request after a period specified in the response's Retry-After header.



In a single-threaded client, it is obvious that the thread getting the 429 should wait as told and then retry. But the RFC explicitly states that




this specification does not define how the origin server identifies
the user, nor how it counts requests.




Consequently, in a multi-threaded client, the conservative approach would stop all threads from sending requests until the Retry-After point in time. But:




  • Many threads may already be past the point where they can note the information from the one rejected thread and will send at least one more request.

  • The global synchronization between the threads can be a pain to implement and get right

  • If the setup runs not only several threads but several clients, potentially on different machines, backing off all of them on one 429 becomes non-trivial.


Does anyone have specific data from the field how servers of cloud providers actually handle this? Will they get immediately aggravated if I don't globally hold back all threads. Microsoft's advice is





  1. Wait the number of seconds specified in the Retry-After field.

  2. Retry the request.

  3. If the request fails again with a 429 error code, you are still being throttled. Continue to use the recommended Retry-After delay and retry the request until it succeeds.




It twice says 'the request' not 'any requests' or 'all requests', but this is legal-type interpretation I am not confident about.



To be sure this is not an opinion question, let me phrase it as fact-based as possible:



Are there more detailed specifications for cloud APIs (Microsoft, Google, Facebook, Twitter) then the example above that allow me to make an informed decision whether global back-off is necessary or whether it suffices to back-off with the specific request that got the 429?







multithreading http rate-limiting http-status-code-429






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited Nov 26 '18 at 8:00







Harald

















asked Nov 24 '18 at 10:59









HaraldHarald

2,2061739




2,2061739













  • One hit: docs.microsoft.com/en-us/dynamics365/customer-engagement/… says: "All requests will return these error responses until the volume of API requests falls below the limit." Might be construed as to not needing global back-off, because each requests gets a back-off answer.

    – Harald
    Nov 26 '18 at 8:06



















  • One hit: docs.microsoft.com/en-us/dynamics365/customer-engagement/… says: "All requests will return these error responses until the volume of API requests falls below the limit." Might be construed as to not needing global back-off, because each requests gets a back-off answer.

    – Harald
    Nov 26 '18 at 8:06

















One hit: docs.microsoft.com/en-us/dynamics365/customer-engagement/… says: "All requests will return these error responses until the volume of API requests falls below the limit." Might be construed as to not needing global back-off, because each requests gets a back-off answer.

– Harald
Nov 26 '18 at 8:06





One hit: docs.microsoft.com/en-us/dynamics365/customer-engagement/… says: "All requests will return these error responses until the volume of API requests falls below the limit." Might be construed as to not needing global back-off, because each requests gets a back-off answer.

– Harald
Nov 26 '18 at 8:06












0






active

oldest

votes











Your Answer






StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");

StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);

StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});

function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});


}
});














draft saved

draft discarded


















StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53457432%2fwhat-is-the-correct-client-reaction-to-a-http-429-when-the-client-is-multi-threa%23new-answer', 'question_page');
}
);

Post as a guest















Required, but never shown

























0






active

oldest

votes








0






active

oldest

votes









active

oldest

votes






active

oldest

votes
















draft saved

draft discarded




















































Thanks for contributing an answer to Stack Overflow!


  • Please be sure to answer the question. Provide details and share your research!

But avoid



  • Asking for help, clarification, or responding to other answers.

  • Making statements based on opinion; back them up with references or personal experience.


To learn more, see our tips on writing great answers.




draft saved


draft discarded














StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53457432%2fwhat-is-the-correct-client-reaction-to-a-http-429-when-the-client-is-multi-threa%23new-answer', 'question_page');
}
);

Post as a guest















Required, but never shown





















































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown

































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown







Popular posts from this blog

Costa Masnaga

Fotorealismo

Sidney Franklin