-
Notifications
You must be signed in to change notification settings - Fork 16
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
fix: cache queue inventory for lower CPU usage while running queue #368
Conversation
Sample app builds 📱Below you will find the list of the latest versions of the sample apps. It's recommended to always download the latest builds of the sample apps to accurately test the pull request.
|
Pull request title looks good 👍! If this pull request gets merged, it will cause a new release of the software. Example: If this project's latest release version is All merged pull requests will eventually get deployed. But some types of pull requests will trigger a deployment (such as features and bug fixes) while some pull requests will wait to get deployed until a later time. This project uses a special format for pull requests titles. Expand this section to learn more (expand by clicking the ᐅ symbol on the left side of this sentence)...This project uses a special format for pull requests titles. Don't worry, it's easy! This pull request title should be in this format:
If your pull request introduces breaking changes to the code, use this format:
where
Examples:
Need more examples? Want to learn more about this format? Check out the official docs. Note: If your pull request does multiple things such as adding a feature and makes changes to the CI server and fixes some bugs then you might want to consider splitting this pull request up into multiple smaller pull requests. |
1891693
to
480e756
Compare
// sourcery: InjectRegister = "QueueInventoryMemoryStore" | ||
// sourcery: InjectSingleton | ||
class QueueInventoryMemoryStoreImpl: QueueInventoryMemoryStore { | ||
@Atomic var inventory: [QueueTaskMetadata]? |
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.
In the ideal case, it should be fine, but this can very much become a memory concern if we are hosting a large number of tasks in memory. This could easily happen if the user has a configuration configured like that or is in offline mode.
Should we add the maximum limit? but then it won't reflect the real state of the queue
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.
In early versions of the BQ, we had a cache of the inventory in-memory. The BQ was designed so that the inventory would be light-weight enough that it could be stored in memory, even if it's big. That's why the BQ uses separate files for inventory and task data, to keep the inventory light.
From my own testing, I have not noticed the inventory being too large in memory to cause concern.
I do see value in refactoring the BQ to save chunks of the BQ in the file system (chunks of the inventory and chunks of tasks). This would allow us to read and write with the file system less then we do today, even more reducing the CPU usage load. Strategies such as chunking could be considered in the future to make the SDK more performant for this scenario we are talking about here. I plan on writing a ticket to think about this performance increase.
4cd8dcb
to
2b51936
Compare
## [2.7.8](2.7.7...2.7.8) (2023-08-14) ### Bug Fixes * cache queue inventory for lower CPU usage while running queue ([#368](#368)) ([fdcb24c](fdcb24c))
Part of https://github.com/customerio/issues/issues/10950
This PR introduces a cache for the BQ inventory. This cache reduces the number of times the SDK needs to read the BQ inventory from the file system. This reduction in file system writes reduces the CPU usage of the SDK while the BQ runs.
todo