-
Notifications
You must be signed in to change notification settings - Fork 26
feat: Adding a batch updater to allow usage updates to be batched #1326
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
ad97e41 to
0596175
Compare
This will allows a client to update the usage asynchronously. The updater will only call the API when a configurable number of rows have been updated or a timeout is reached. In addition the updater will flush any remaining rows before closing.
4cf66fb to
d4b85a3
Compare
c26cb27 to
22de9a3
Compare
85c4412 to
4484abd
Compare
…o allow a minimum update interval to be set also
4484abd to
c2f5be4
Compare
hermanschaaf
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Looks great! Left a couple of comments, nothing major
premium/usage.go
Outdated
| defaultMaxRetries = 5 | ||
| defaultMaxWaitTime = 60 * time.Second | ||
| defaultMinimumUpdateDuration = 10 * time.Second | ||
| defaultFlushDuration = 30 * time.Second |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
| defaultFlushDuration = 30 * time.Second | |
| defaultMaxTimeBetweenFlushes = 30 * time.Second |
(nit)
premium/usage.go
Outdated
| defaultBatchLimit = 1000 | ||
| defaultMaxRetries = 5 | ||
| defaultMaxWaitTime = 60 * time.Second | ||
| defaultMinimumUpdateDuration = 10 * time.Second |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
| defaultMinimumUpdateDuration = 10 * time.Second | |
| defaultMinTimeBetweenFlushes = 10 * time.Second |
(nit)
And we'd update the With... functions accordingly
premium/usage.go
Outdated
|
|
||
| // calculateRetryDuration calculates the duration to sleep relative to the query start time before retrying an update | ||
| func (u *BatchUpdater) calculateRetryDuration(statusCode int, headers http.Header, queryStartTime time.Time, retry int) (time.Duration, error) { | ||
| if statusCode == http.StatusTooManyRequests { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
429 is typically for when the client has made too many requests. We can keep handling this, but the server will typically return 503 if it's getting overloaded, so we should handle that as well https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/503
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
We should add 503 as a possible return here
In this case we want to respect the wait time the server has suggested, so just wait.
🤖 I have created a release *beep* *boop* --- ## [4.17.0](v4.16.1...v4.17.0) (2023-10-30) ### Features * Add IsPaid flag to table definition ([#1327](#1327)) ([ffd14bf](ffd14bf)) * Add OnBeforeSend hook ([#1325](#1325)) ([023ebbc](023ebbc)) * Adding a batch updater to allow usage updates to be batched ([#1326](#1326)) ([0301ed7](0301ed7)) * Adding quota monitoring for premium plugins ([#1333](#1333)) ([b7a2ca5](b7a2ca5)) * Allow sync to be cancelled when in progress ([#1334](#1334)) ([6d7be0b](6d7be0b)) ### Bug Fixes * **deps:** Update github.com/cloudquery/arrow/go/v14 digest to 50d3871 ([#1337](#1337)) ([f15a89d](f15a89d)) * **deps:** Update github.com/cloudquery/arrow/go/v14 digest to f46436f ([#1329](#1329)) ([ee24384](ee24384)) * **deps:** Update module github.com/cloudquery/cloudquery-api-go to v1.4.2 ([#1335](#1335)) ([2ecd2a1](2ecd2a1)) * **deps:** Update module github.com/cloudquery/plugin-pb-go to v1.13.0 ([#1332](#1332)) ([5553f85](5553f85)) * **deps:** Update module github.com/cloudquery/plugin-pb-go to v1.13.1 ([#1336](#1336)) ([b782ee7](b782ee7)) * **deps:** Update module google.golang.org/grpc to v1.58.3 [SECURITY] ([#1331](#1331)) ([43f60c2](43f60c2)) --- This PR was generated with [Release Please](https://github.com/googleapis/release-please). See [documentation](https://github.com/googleapis/release-please#release-please).
This will allows a client to update the usage asynchronously. The updater will only call the API when a configurable number of rows have been updated or a timeout is reached. In addition the updater will flush any remaining rows before closing.
If an error is encountered then an exponential backoff up to a max number of retries or a maximum wait time (relative to the start time of the last query) will be followed.
In addition, if the server replies with a status of
429and includes aRetry-Afterheader, then the client will wait that number of seconds before retrying.It might be worth considering just using a retry library also e.g. https://github.com/avast/retry-go.