You can 100% write services with P999 < 20ms in go.
Not even trying that hard.
Go is entirely suitable for this kind of constraints, I dare say that's go's main target.
P99 < 1ms, that's when you're going to want to switch it up.
P99 < 1ms, that's when you're going to want to switch it up.
You could start with twiddling some of the GC knobs Go gives you, but you're still working against an SLO. If you need stronger guarantees you'll look at languages that completely eschew GC, because Go's GC still has STW bits. Climb the ladder further and you're reducing allocations, eventually avoiding any malloc() beyond what it takes to get an arena and doing your own bookkeeping. I've never been near the top of the ladder when you have hard real-time constraints, but I've heard it involves paying Wind River for VxWorks licenses ;)