-
Notifications
You must be signed in to change notification settings - Fork 3
Data store/cache service improvements needed #21
Comments
I'm currently working on implementing Postgres as an option for the data store, using docker postgres for dev and intending to use the free hobby plan of Postgres on Heroku for prod (allows up to 10k rows). Redis is another potential option but is only free on Heroku without data persistence, so that's on the backburner for now. 10k row limit for free Heroku prod should be fine providing we can handle large JSON strings - in the current structure, that's 1 per player, and 1 each per spawn instance and battle instance both of which can be pruned. |
Hey, @tdmalone, I see the project is expanding 😄 Maybe it's time to create a
|
@Naramsim I'm glad you've suggested that! I had a bit of a read into Compose today but it looked too complicated for me to understand at first, so to start development on this I just installed PG and manually linked the containers together. It was a challenge to get the PHP PG extension installed but I got there in the end! If you could help with the |
(We could even look at Alpine Linux maybe to try to reduce the size later, but I'm not sure if that would just increase complexity with getting things working) |
I would not stick with alpine-linux, and installing php/apache/postgre on it. So, in the end, we would have a system composed by three small (and secure) containers, which are started automatically with the command What do you think? |
I think that sounds perfect! |
Postgres should now be working in https://github.com/tdmalone/slackemon/tree/data-store as an option for This partially implements point 2 (Postgres data store ability) mentioned above at #21 (comment) The rest of point 2 (using Postgres on Docker) will be covered by using Docker Compose. Point 3 (file locking) is probably the next priority, then point 1 (augment AWS cache with local cache). Of course, Postgres isn't implemented properly at this stage - we're basically treating it like a filesystem with each row being a 'file' and containing a big JSON string. In future we should completely rewrite this, drop support for a local data store, and use the database properly. |
|
* database-improvements-#21: Minor image cache debug tweaks Minor: attempt to fix time discrepencies with sleeping Docker containers Add SLACKEMON_CACHE_DEBUG constant and update cache debugging to work like the others Complete database creation if database does not exist Make start/stop/reset shell scripts a bit smarter Add basic shell scripts to quickly start/stop/reset docker containers Debug reporting tweaks WIP: Creating database if not exists
* database-improvements-#21: Minor: additional error log debugging for PokeAPI retrieval failures Minor: fix version compare logic for player data migrations Minor: fix file locking config WIP: Simplify dealing with player XP for file locking Hotfix: rename send2slack in newly merged in function call WIP: More efficient file locking for some player data operations WIP: Locking/unlocking just as required Minor tweaks Send waiting message to user during pending file locks Minor: rename send2slack to slackemon_send2slack Adjust file lock debugging + make file locking optional for now Hotfix: ensure when renaming that a new folder is created Minor cleanups & battle invite filename fixes Implement basic file locking for player & battle data Minor: remove commit hash from image URL base to avoid changing/re-caching Extend S3 local augmenting to exists & mtime calls; + ensure it only happens on cache not data calls Minor: publish postgres port for development Docker container Augment S3 cache with temporary local cache Minor database debug tweaks + ensure correct order when 'globbing'
…or all player operations; battle file locking still to come) * database-improvements-#21: Ensure all remaining uses of player data respect file locking Minor: avoid locking errors when a player file is first created Minor: file locking support for transferring Pokemon Further file locking fixes to battle and happiness updates Minor: cleanup leftover code left in evolutions.php Implement file locking for further battle, evolution and organising functions Deprecate slackemon_add_xp as of next version Deprecated function & debug backtrace tools WIP: Further file locking for battle ops WIP: Implement file locking for some battle operations Implement file locking for some organising & player operations Implement file locking for item operations
* database-improvements-#21: Minor tweaks to lock debugging Minor: add TODO for later Implement file locking for battle data
* database-improvements-#21: Revert "Minor: speed up battle move & catching waits slightly" - no longer needed now that AWS local cache augmentation is shipping Minor improvements to file lock debugging Update spawn and file locking default behaviour now that file locking is ready Resolve a couple of extra bugs that file locking introduced
* database-improvements-#21: Minor tweaks to lock debug reporting
* database-improvements-#21: Further tweaks to file lock debug functions
* database-improvements-#21: Hotfix: woops, no longer an array - need to remove the join!
* database-improvements-#21: Hotfix: only get player data for writing if they haven't seen a Pokemon before
* database-improvements-#21: Fix pokemon held items & evolution after file locking
Most of the work this ticket asks for is now in master! A few more things to look into to make file locking more robust:
|
In addition to the above, there probably needs to be a regular cronned check to expire locks that did not get removed properly - probably after 2 minutes? Or even 1 minute. |
v0.0.38 added support for AWS being used for the data store/data cache. This means that Slackémon can now finally be used on a ephemeral filesystem service like Heroku.
However, there are issues inherent in this:
Slackémon currently has separate settings for an image cache and a data cache, they can both be set to either 'local' or 'aws' independently. However, we're utilising the data cache as both a data cache and a data store.
We likely could solve the above issues by:
In addition, while in-memory caching is already in use for most data cache reads (eg. Pokémon & species data, move data, item data) and data store reads (player data and battle data), we could also probably reduce writes by ensuring that there's one save to a player file per request (at the moment there are sometimes two especially due to the slackemon_add_xp() function being called while something else requiring a save is also happening, such as catching a Pokémon).
The text was updated successfully, but these errors were encountered: