Correct Answer: B and D
Numerous components on a network, such as DNS servers, switches, load balancers, and others, can generate errors anywhere in the life of a given request. The usual technique for dealing with these error responses in a networked environment is to implement retries in the client application.
Each AWS SDK implements retry logic automatically. You can modify the retry parameters to your needs. In addition to simple retries, each AWS SDK implements an exponential backoff algorithm for better flow control. The concept behind exponential backoff is to use progressively longer waits between retries for consecutive error responses.
For example, up to 50 milliseconds before the first retry, up to 100 milliseconds before the second, up to 200 milliseconds before the third, and so on. However, after a minute, if the request has not succeeded, the problem might be the request size exceeding your provisioned throughput, and not the request rate. Set the maximum number of retries to stop around one minute. If the request is not successful, investigate your provisioned throughput options.
Option A is incorrect: This is not practically feasible and involves overhead in implementation. Hence, this is not the best practice.
Option C is incorrect: Mere increasing RCUs and WCUs every time you receive this error is not an optimal solution.
Reference: https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Programming.Errors.html#Programming.Errors.RetryAndBackoff