I know SDF provides a public Horizon server too. My question from those who are using for their production apps, is it reliable enough or would you suggest running your own Horizon server?
The public Horizon instance that SDF runs isn't meant to be used beyond an easy way to try out the Stellar network. If you're intending to build some kind of product on Stellar, it's expected that you run your own instance of Horizon. For toy projects or for initial validation of an idea, SDF's public Horizon is quite stable, but provides no uptime guarantees.
The main reason for this is to avoid centralization. If the ecosystem of projects built on Stellar all communicate with a single Horizon instance, that's a significant single point of failure.
It's pretty reliable, they seem to have a good high availability setup and a strong interest in providing a stable service. But I don't think you will get an uptime guarantee or SLA for any free service, so this is not not necessarily an option if you run a serious business. If reliability is critical for you, you'll more likely want to operate your own stellar cluster.
The main downside of the public SDF horizon is its rate limit that kicks in when you run over 100 (not sure, someone correct me if I'm wrong) requests per minute per IP.