mirror of
https://github.com/zulip/zulip.git
synced 2025-10-23 04:52:12 +00:00
This prevents a thundering herd for videos -- if a very large video is posted to a channel with many active clients, all of them simultaneously request it, to provide the in-feed preview image. While these requests come with a `Range` header which is intended to limit the request to just the first couple MB, nginx ignores this header when making its request to the upstream -- so it can obtain and cache the whole file locally. This results in multiple competing requests for the whole content from S3, all racing to store the content in the cache. Use cache slicing to split the content cache into chunks of 5MB; the cache is filled one slice at a time, as needed based on the byte ranges that clients request. Clients making requests without a `Range` header are provided with the content transparently stitched together from the individual slices. The slice size of 5MB is chosen to encompass more 95% of file uploads (saving an extra trip to the origin) while also being large enough to be able to provide video thumbnails in a single slice, as well as not take too much time to obtain from the upstream.