Question One of the biggest issues I am currently seeing with Lemmy, is federation. Either... Federation between instances having issues. Federation is backed up. Federation / Syncing is not scalin...
I posted far more details on the issue then I am putting here-
But, just to bring some math in- with the current full-mesh federation model, assuming 10,000 instances-
That will require nearly 50 million connections.
Each comment. Each vote. Each post, will have to be sent 50 million seperate times.
In the purposed hub-spoke model, We can reduce that by over 99%, so that each post/vote/comment/etc, only has to be sent 10,000 times (plus n*(n-1)/2 times, where n = number of hub servers).
The current full mesh architecture will not scale. I predict, exponential growth will continue to occur.
Let's work on a solution to this problem together.
Assume that this user is the first lemmy.ml user to do so - basically what happens is the lemmy.world community sees that a member of a never before seen instance just subscribed. !funny@lemmy.world then adds lemmy.ml to its list of instances it needs to tell whenever something happens in the community.
No matter how many users of lemmy.ml subscribe, this only happens once.
Now when a user of sh.itjust.works upvotes a post on !funny@lemmy.world, the sh.itjust.works instance then tells !funny@lemmy.world of this change. It accepts the change, then tells everyone on its list of instances that have subscribers on them.
So essentially, sh.itjust.works talks to lemmy.world, lemmy.world tells everyone else. There is no "full mesh". The instance hosting the community is the "hub", everything else is a spoke.
So if there's 10,000 instances, and they all just so happen to have at least one subscriber to some community, each change will be sent out 9,999 times. Your "50 million" premise is just completely wrong and I'm not sure where it's coming from.
The 50 million, is based on the formula for a full-mesh network. Where all instances talk to each other. In the case of lemmy, this would be an absolute worst-case scenario, where every instance, is subscribed to a community on every other instance.
In your example of only 10,000 messages, you are assuming that of the 10,000 instances in existence, they are ONLY looking at a single community, on a single server.
Lets say, those 10,000 instances all decide to look at a community on another server. Now you have 20,000 connections.
Lets add another community, hosted on yet another instance. That is 30,000 connections.
TLDR;
My example, is based on worst-case scenario.
Your example, is based on best-case scenario.
Realistically, the actual outcome would be somewhere much closer to best-case scenario(As communities seem to lump up on the big servers). However, for planning architecture, you always assume worse-case scenario.
Each comment. Each vote. Each post, will have to be sent 50 million seperate times.
That won't ever happen. Unless there's 50 million instances. That's not worst case, it's just not a case.
There is no case in the current implementation where any one action is replicated more times than there are total instances.
And it doesn't matter what "model" you assume, each action will have to federate to each instance eventually. That count is minimally, the total number of instances.
Lets say, those 10,000 instances all decide to look at a community on another server. Now you have 20,000 connections.
Looking does nothing, each instance hosts essentially a copy of the "host instance" for each community. Only interactions (comments, likes, posts, etc) are federated.
for fucks sake, dude, be collaborative, and not defensive. This isn't reddit, I am not out to attack your karma.
If every instance, hosts a community, and Every other instance, subscribes to every one of those communities, that would lead to a full-mesh between all instances, resulting in worst-case scenario, ie, following the formula I provided for a full-mesh topology.
That is indeed, the worst case scenario, I have provided, explained, and documented in my examples.
If my example is too hard to understand, lets use an easier example
In no way is the person you're responding to speaking defensively. They've discussed the reason why your extrapolation to a full-mesh connective worst-case scenario isn't based in the reality of how ActivityPub functions. But you don't seem to be willing to entertain the notion that the federation of any given action never exceeds the number of instances subscribed to the community that generated it.
Even should every instance subscribe to every community on every other instance, the recipient of a federated action doesn't turn around and rebroadcast that action back on to the network because it is not the authoritative host of that community. Therefore what this discussion is lacking is proof of where this exponential broadcast storm of federated actions comes from in your assertion.
Yes, it is a "full mesh" diagram. But for each specific "federated" action, it is a simple hub and spoke distribution. The hosting server will send the federated action to each subscribed node. The nodes don't need to check in with each other for that specific action.
I too believe that Federation is going to have scaling issues. But not due to full mesh
Federation isn't working well, but it's not working well because the big instances aren't able to keep up with all of the inbound/outbound messages, and if a message fails, that's it. Right now there's no automated way to resync and catch up on missed activity.
How was syncing done in Usenet? It has a very similar decentralized model, and I don't recall there being problems of data loss due to desyncing between servers.
So- what if, we can delegate a proxy/hub server, for managing all of the inbound/outbound messages, to offload that from the main instance server.
ie, main instance sends/receives its messages through the proxy/hub server, the proxy/hub server then follows a pub/sub topology for sending and receiving.
(Don't imagine a centralized hub server, but, just imagine a localized proxy/hub server for your particular instance. Lets also assume, its designed where you can support multiple hub/proxy servers, in the event one gets overloaded)
That doesn't do anything to fix the problem. If a server can only handle 5k updates per minute (a completely made up number), it doesn't matter if those 5k updates come from one server or a thousand. In theory you could cut down on outbound messages a bit if you could tell a "hub server" that post #123456 got another upvote, so please tell instances A, B, C, D, and E. But the total number of messages would increase, so even if the hub instance can handle more updates, it may eventually hit capacity again.
The core of the problem is that if an instance doesn't process an update (inbound or outbound), it doesn't ever retry, the instances are just out of sync for that post forever.
I believe the current implementation wont scale because instances won't be able to handle every subscribed federated action. Having a hub server doesn't reduce the number of subscribed federated actions, only whom they come from.
But- if we take that action of handling the federations, and seperate it from the main application server(Allowing the main instance server to focus on handling its local user-base), and architect it in a way that allows scaling the number of proxy servers up and down-
Would that not sound like a big improvement to scalability?
The node still needs to receive every subscribed federated action and insert it into the local database. This has to be local to the "main application server". Your proxy servers don't reduce the number of federated actions. It only reduces the number of servers needed to communicate with.
I feel that the bottleneck will be the total number of federated actions, not which servers deliver them.
I mean I get what you're saying - I just don't see the practical use. The centralized hub replication servers would have to basically foot a huge bill for the fediverse, and do so silently and invisibly to the end user. As it is, most instances run on goodwill or donations. A silent, invisible server is hard to gather donations for. Who would run them?
Furthermore the topology you propose is essentially what we already have. A few large instances hold most of the largest communities. I don't see that changing. This brings a fairly good balance - smaller instances pretty much only have to listen for updates from a few other instances, only the big instances are doing the hard work of notifying hundreds of others. They are already our "hubs". Small instances really hardly do practically any hard work, the one I run for example just listens to maybe a dozen instances send updates, and occasionally sends out an update when one of my users interacts.
I suppose I just don't understand how this could be implemented in practice- or rather how it could be useful to do so. It would strictly enforce a sort of centralization that right now is only a natural consequence of user behavior, while seemingly only bringing theoretical benefits unlikely to be realized.
The centralized hub replication servers would have to basically foot a huge bill for the fediverse, and do so silently and invisibly to the end user.
One consideration, since they are only having to basically sub/pub - the load actually might be drastically lower than expected.
Furthermore the topology you propose is essentially what we already have. A few large instances hold most of the largest communities. I don’t see that changing.
Suppose- that is a valid point. The issue though- those large instances are unable to keep up with demand and load, causing lots of federation issues.
Perhaps, my idea actually wouldn't help that at all, but, using lemmy.ml as an example-
Instead of it having to send all of its updates out to every server subscribed- it can delegate that to a hub server to do it. The hub server can run a very minimal set of instructions, with enough intelligence to handle sub/pub.
Perhaps- one idea is, instead of thinking of it as a hub-server, think of it as a proxy server. Being able to delegate your instances actions to the proxy server to reduce that load from the main server.
And, instead of the hubs/proxies being more centralized, perhaps, its just an optional thing which you CAN do.
My line of thinking, is methods to reduce load from the main servers. This might be an idea that only benefits the handful of big servers.
I am not certain on scenarios you were mentioning above, but I do agree that separating software to instance plus hub/proxym/mssage queue could help with handling load.
How can we scale our big i instances? I don't know maybe it is easy to put instance on multiple servers, but sounds to me they are just buying bigger one, and that will fill up fast of growth continues to happen.
I would like to hear from developers what they think, but thank you for starting conversation about scaling.