Back in the old days memory was expensive.
In the far 1992, I bought a quad uart module for a BBS server (before the internet, there was BBS). It was an ISA 16bit bit card with four advanced UART chip able to handle up to 128Kbyte of buffer each.
It has 4x128Kbyte for buffering, implemented with fast-static ram, it also has switches to manually assign the address and interrupt, so you don't have to fight with obscure firmware (like PCIbios-shit?) to dynamically "plug and pray" anything. I really loved it, but it cost something like 250 euro, converting "lira" into "euro".
Nowadays a small Linux system can easely buffer several megabytes per port and keep up with 8 UARTs.
Currently, I have fixed(1) a couple of Quad 16950 UART miniPCI modules made by Oxford Semiconductor. Two modules give me 8 UART ports, and I can allocate 4Mbyte of ram as a buffer. This works great even on an old MIPS32 router made in 2005 (which is, anyway, what my customer actually uses at the moment), but it's not the kind of stuff I would replace with modern "low cost" USB-quad-uart because everything I have tried has sucked great.
(1) they are "PCI_IO_legacy(2)", it means you cannot reprogram the PCI-BAR because the base_size always return 0x00, and this means the device only consumes fixed resources at fixed addresses.
It's not a problem when you install one quad-UART module, but when you install two quad-UART modules their address have a conflict. Anyway, I workaround-ed this problem in hardware by adding an offset to the address line. It's ugly to see, but it works.
(2) currently deprecated in modern Linux kernel >= v5.*