I think my question boils down to: is there a
fundamental reason apps don't use p2p networking, or is it just that there aren't any good app P2P SDKs or programming techniques out there?
(Note: by P2P in this context I mean over the Internet, not the emerging wireless "Internet of things" P2P networking stuff. That's a bit different, and has a different use case.)
Take an example: SnapChat. (Just using them as a hypothetical here.) Why didn't they architect their app to send snaps directly when possible? It would have saved them a lot on bandwidth for starters. If they wanted to also store snaps on their servers they still could have done so, but they could have saved considerably on downstream bandwidth costs by sending snaps "horizontally" between users if these users happen to be online.
Is it just that it would have been too much work development-wise, or is there a more fundamental reason companies like this pass on P2P?
Spotify used a P2P protocol but last I heard they were moving away from it. Netflix -- about as bandwidth heavy as you can get -- doesn't do it. Skype has moved away.
Why?
The only reasons I can think of are:
(1) It's hard to program and there are few good SDKs to make it easier.
(2) Some users -- enough to be meaningful -- have bandwidth caps even on wired Internet connections.
(3) Cellular data connections almost always have bandwidth caps, and so users on these networks dislike p2p apps eating their bandwidth.
Which of these is most significant? Or are there other reasons?
Not all networks support the ability to P2P network, or, if they do, they require intervention by the user.
So you have two issues: some users will never get to use your application, and for those that could potentially, they will likely need customer support to help them configure their network correctly.
Corporate networks are the worst for this. They aren't going to change their rules for your application (yes, they might, but don't assume that starting out).
A much greater percentage of home networks can support P2P networking, but your application probably needs to support STUN as well as UPNP.
Some number of home routers won't work ever, or can if you configure them correctly. And that's where it gets messy. Is it enough to tell a customer to 'go figure it out', when it pertains to router configuration? You might get away it with PC gamers; but I'd argue any other segment of people will have no idea how to do it, and need some help. So now you have to try figure out the enduser's home router configuration as best you can remotely. Huge drain on customer support resources, which in a small startup, usually means the developers.
So why go P2P with all these headaches? Unless you have a really strong reason to do use P2P, like keeping latency down between peers, you don't bother.