add caching headers for posts
#786
Open
opened 4 years ago by igalic
·
13 comments
No Branch/Tag Specified
paginate-search-init
main
s3
fix-delete-user
timeline-cli
blog-title
signature
remove-dup-images
ldap-non-anon
drone-ci
DearRude/force-lang
igalic/go/async-all-mut
go/async
floreal/translations-update
missing-docs
RAOF/fix-arm64-build
epsilon-phase/authorized-fetch
upgrade
improve-the-editor-once-again
igalic/feat/custom-fairing-domains
feature/ldap
test/dotenv_error
fix-mobile-margin
0.7.2
0.7.0
0.2.0-alpha-1
0.3.0-alpha-2
0.4.0-alpha-4
0.5.0
0.6.0
0.7.1
Labels
Clear labels
Related to the REST API
Code running on the server
Stuff related to Federation
Related to the front-end
Translations, and related code
More about project management or code than the project itself
The building, or installation process of Plume
Something isn't working
We need to talk
New feature or request
This is a new feature
Compatibility with different browsers, readers and OS
Related to an external package that Plume uses
UI/UX related issues and PRs
Good for newcomers
Extra attention is needed
Issues affecting only mobile UX
How elements're rendered out for the end user
Something else needs to be fixed first
This issue or pull request already exists
This PR is not complete yet
Issues concern a limited number of instances
This doesn't seem right
Need to be discussed by the community (on Loomio)
This PR is ready to be reviewed
Proposed ideas worth considering
This is issue has been created after a vote on Loomio
This will not be worked on
Apply labels
A: API
Related to the REST API
A: Backend
Code running on the server
A: Federation
Stuff related to Federation
A: Front-End
Related to the front-end
A: I18N
Translations, and related code
A: Meta
More about project management or code than the project itself
A: Security
Build
The building, or installation process of Plume
C: Bug
Something isn't working
C: Discussion
We need to talk
C: Enhancement
New feature or request
C: Feature
This is a new feature
Compatibility
Compatibility with different browsers, readers and OS
Dependency
Related to an external package that Plume uses
Design
UI/UX related issues and PRs
Documentation
Good first issue
Good for newcomers
Help welcome
Extra attention is needed
Mobile
Issues affecting only mobile UX
Rendering
How elements're rendered out for the end user
S: Blocked
Something else needs to be fixed first
S: Duplicate
This issue or pull request already exists
S: Incomplete
This PR is not complete yet
S: Instance specific
Issues concern a limited number of instances
S: Invalid
This doesn't seem right
S: Needs Voting/Discussion
Need to be discussed by the community (on Loomio)
S: Ready for review
This PR is ready to be reviewed
Suggestion
Proposed ideas worth considering
S: Voted on Loomio
This is issue has been created after a vote on Loomio
S: Wontfix
This will not be worked on
No Label
A: API
A: Backend
A: Federation
A: Front-End
A: I18N
A: Meta
A: Security
Build
C: Bug
C: Discussion
C: Enhancement
C: Feature
Compatibility
Dependency
Design
Documentation
Good first issue
Help welcome
Mobile
Rendering
S: Blocked
S: Duplicate
S: Incomplete
S: Instance specific
S: Invalid
S: Needs Voting/Discussion
S: Ready for review
Suggestion
S: Voted on Loomio
S: Wontfix
Milestone
Set milestone
Clear milestone
No items
No Milestone
Assignees
Assign users
Clear assignees
No Assignees
2 Participants
Notifications
Due Date
The due date is invalid or out of range. Please use the format 'yyyy-mm-dd'.
No due date set.
Dependencies
No dependencies set.
Reference: Plume/Plume#786
Reference in New Issue
There is no content yet.
Delete Branch '%!s(<nil>)'
Deleting a branch is permanent. It CANNOT be undone. Continue?
No
Yes
until we've switched to using the async version of Rocket, we'll have serious performance issues.
Most installations of Plume are already behind a (caching) proxy server. we can use this to fix the current performance issues by sending caching headers for posts pages:
How?
the posts page should send an
ETag
with each response.The advantage here is that we can have updates, and comments, since this means that we send new
ETag
header.to spare a lookup in the database, we could store data about whether the post's cache is invalidated within rocket (that would be a
304
response to aHEAD
request)n.b.: The (caching) proxy server admin could adjust the time themselves, we wouldn't be sending any ourselves.
Alternatives
are currently a lot more effort:
and there's also: https://github.com/SergioBenitez/Rocket/pull/1343
which is similar to #777, but on rocket level
those aren't really alternatives, since this suggestion is operating at HTTP level, it's more orthogonal.
We already have some kind of caching for static assets : https://github.com/Plume-org/Plume/blob/master/src/routes/mod.rs#L207-L270
But adding it to templates and/or federation pages could improve performances too.
does rocket derive
#[head()]
for these routes itself?Yes
if we need a DB lookup to construct a body which might still be in a downstream cache, then we should define
HEAD
ourselvesMaybe we can have a
Vec<String>
storing the slugs of the posts that need an update in Rocket's state, and only show an updated version when needed.Another solution would be to render each post to a given HTML or AP file when the post or comments change, and serve this files statically, using the modification date to generate the cache headers.
There is already caching for any templated page, with the following limitations :
This should be removed when more intelligent caching get implemented
Implementation is in src/template_utils.rs
can you propose a patch out of this situation?
and do you believe it would help us with our current performance issues, before we switch to async rocket?
I'll look into it if I got some time.
Honestly I have no idea, I'm not operating any instances so I don't have neither logs nor a flamegraph of an instance under non-synthetic load, both of which would help with a diagnosis. If someone have a day or a week worth of logs from fediverse.blog that would be interesting
I just noticed the Subscribe button on any post is actually a form, so it is never cached by clients 😐
I also noticed that for some reason, caching, for static or templated resources, seems broken, so it might be a good first step to find why and how much it helpsSo it's broken on most public servers I found, but not when running a local instance, without reverse proxy or with Caddy. It might be related to this discussion
https://mailman.nginx.org/pipermail/nginx/2013-September/040425.html
so… instead of adding it's own ETag for such filters, nginx just drops them?
n.b.: Apache HTTPd does not do that.
this is bad, probably. let's open a bug for that.
Apparently it does not really remove etags, but change them from strong to weak (see rfc for the exact meaning), which means it matching for "tag" or W/"tag" should maybe work.
See patch if someone want to test
patch
I only have the last six hours of the access logs of fediverse.blog, but it case it helps, I can send them to you (and I can configure nginx to keep them longer).
Also, do you want me to deploy the above patch on fediverse.blog to see if it helps?
if it's only 6 hours, could you take them around 8-10pm cest, so that there is afternoon and evening? That's when I guess there is the most load.
You can deploy it, it won't break anything for sure, but I don't know if it'll help, it should only reduce bandwidth usage
I'll give you the logs this evening then. I'll deploy the patch after that, to see if there is a difference. Thank you for your help!