The Gossip Model Doesn't Scale
Websocket connection overhead is an obvious problem with the gossip model that few are willing to acknowledge. The more decentralized relay selection becomes (the goal) the worse it scales. Even at the current scale of nostr if users chose more diverse relay sets the issue would be crippling.
Below are some very simple simulations to illustrate my point. I used 2 randomly selected relays per person to be extremely conservative and chose 3 different realistic follow counts. The NIP-65 spec suggests clients should guide users to keep the lists small (2-4 relays) though currently the average kind 10002 contains many more. I ran each simulation 10 times and then took the average result.
Available relays: 600 (~what nostr.watch currently shows for online relays)
Follows: 200
Relays per person: 2 (randomly selected)
Unique Connections Required: 291
Available Relays: 600
Follows: 500
Relays per person: 2
Unique Connections Required: 486
Available Relays: 600
Follows: 1000
Relays per person: 2
Unique Connections Required: 577
Even today if users randomly selected relays the total number of connections required would be staggering and this is with users only selecting 2 relays each. What happens if the available number of relays increases by 5x?
Available Relays: 3000
Follows: 200
Relays per person: 2
Unique Connections Required: 376
Available Relays: 3000
Follows: 500
Relays per person: 2
Unique Connections Required: 847
Available Relays: 3000
Follows: 1000
Relays per person: 2
Unique Connections Required: 1461
I’m not a client developer and I certainly don’t have all the solutions but I’ve spent enough time operating websockets at scale to know that these numbers aren’t going to work even with only 2 relays per person. Aside from the practical performance implications, browsers also enforce websocket limits that put most of these numbers out of reach (I believe Chrome is 255 and Firefox is 200).
What am I missing?
Published at
2024-03-20 19:16:37Event JSON
{
"id": "ecf058acf53987b986705e9a39d28b08b1e499d38ca5ff302c04b2261cacffb0",
"pubkey": "3d842afecd5e293f28b6627933704a3fb8ce153aa91d790ab11f6a752d44a42d",
"created_at": 1710962197,
"kind": 30023,
"tags": [
[
"client",
"31990:20986fb83e775d96d188ca5c9df10ce6d613e0eb7e5768a0f0b12b37cdac21b3:1700732875747"
],
[
"published_at",
"1710961577"
],
[
"d",
"1710959004510"
],
[
"image",
"/static/media/random_cover_1.dfa37f6a5d82c049464a.png"
],
[
"title",
"The Gossip Model Doesn't Scale"
],
[
"summary",
"Websocket connection overhead is an obvious problem with the gossip model that few are willing to acknowledge. The more decentralized relay selection becomes the worse it scales."
]
],
"content": "Websocket connection overhead is an obvious problem with the gossip model that few are willing to acknowledge. The more decentralized relay selection becomes (the goal) the worse it scales. Even at the current scale of nostr if users chose more diverse relay sets the issue would be crippling.\n\nBelow are some very simple simulations to illustrate my point. I used 2 randomly selected relays per person to be extremely conservative and chose 3 different realistic follow counts. The NIP-65 spec suggests clients should guide users to keep the lists small (2-4 relays) though currently the average kind 10002 contains many more. I ran each simulation 10 times and then took the average result. \n\nAvailable relays: 600 (~what nostr.watch currently shows for online relays)\nFollows: 200\nRelays per person: 2 (randomly selected)\nUnique Connections Required: 291\n\nAvailable Relays: 600\nFollows: 500\nRelays per person: 2\nUnique Connections Required: 486\n\nAvailable Relays: 600\nFollows: 1000\nRelays per person: 2\nUnique Connections Required: 577\n\nEven today if users randomly selected relays the total number of connections required would be staggering and this is with users only selecting 2 relays each. What happens if the available number of relays increases by 5x?\n\nAvailable Relays: 3000\nFollows: 200\nRelays per person: 2\nUnique Connections Required: 376\n\nAvailable Relays: 3000\nFollows: 500\nRelays per person: 2\nUnique Connections Required: 847\n\nAvailable Relays: 3000\nFollows: 1000\nRelays per person: 2\nUnique Connections Required: 1461\n\nI’m not a client developer and I certainly don’t have all the solutions but I’ve spent enough time operating websockets at scale to know that these numbers aren’t going to work even with only 2 relays per person. Aside from the practical performance implications, browsers also enforce websocket limits that put most of these numbers out of reach (I believe Chrome is 255 and Firefox is 200). \n\nWhat am I missing?",
"sig": "24eccd3abecabb4b9d379547698a65259a75cfcb59f13a302447e8f5199ab9c438cc1fb5da05fab44df37eb4ee61a8e08bbb645845ba8b1d11001dec9a01a129"
}