I like the following:
Have two buffers: buf_a, buf_b. Have pointers: accumulation = &buf_a, processing = &buf_b. Higher priority ISR writes into *accumulation. Once it detects the message is finished, it swaps the pointers, and uses NVIC->STIR to trigger a lower-priority interrupt, which then accesses *processing to do parsing / whatever. All you need to do is to make sure the processing function finishes before the next full dataset is collected. Of course use volatile bool processing_running which you set before triggering processing function, and reset at the end of processing function. Then before triggering the STIR, you can check if this has returned to zero as it should be, if not report error. In any case, this is not a substitute for actually proving to yourself the worst-case timing. When you have different types of messages, it obviously takes different time to process, and also different time to accumulate. The worst sequence is slow-to-process message immediately followed by the shortest possible message (might be even malformed; the key metric is: what is the shortest message the accumulation ISR will trigger processing for?). Make sure it works out, and everything else works out, too.
The same idea can be easily extended from buffer swapping into a FIFO, but the returns are diminishing. With double buffering, you decouple the processing timing and receiving timing so that the processing does not need to happen within one BYTE interval, but within one MESSAGE interval, which can be, by design, orders of magnitude longer. By introducing a FIFO, you still have to process each message within one message interval, just that if processing timing varies, it's now more about average than worst-case timing. But even if you have 16-element FIFO, it's entirely possible you have 16 worst-case messages in succession, in which case it's not any better than simpler double buffering; just more prone to false sense of security, and harder to prove.
FIFO is useful when you can easily prove, by design, that there are burst of messages but they are always followed by some silence. And because a FIFO is Just A Few Lines Of Code and offers a familiar and simple interface (one process pushes, other pops), it's not a bad idea, even if it's just a few elements long.