this post was submitted on 21 Jun 2023
49 points (100.0% liked)

Technology

37551 readers
322 users here now

A nice place to discuss rumors, happenings, innovations, and challenges in the technology sphere. We also welcome discussions on the intersections of technology and society. If it’s technological news or discussion of technology, it probably belongs here.

Remember the overriding ethos on Beehaw: Be(e) Nice. Each user you encounter here is a person, and should be treated with kindness (even if they’re wrong, or use a Linux distro you don’t like). Personal attacks will not be tolerated.

Subcommunities on Beehaw:


This community's icon was made by Aaron Schneider, under the CC-BY-NC-SA 4.0 license.

founded 2 years ago
MODERATORS
 

https://github.com/LemmyNet/lemmy/issues/3245

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.

you are viewing a single comment's thread
view the rest of the comments
[–] xtremeownage@lemmyonline.com 4 points 1 year ago* (last edited 1 year ago) (23 children)

Its not wrong- we just have opposite ideas here-

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. (A pretty unachievable one at that!)

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.

[–] bdonvr@thelemmy.club 17 points 1 year ago (22 children)

No - you said:

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.

[–] xtremeownage@lemmyonline.com 6 points 1 year ago* (last edited 1 year ago) (21 children)

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

Count the number of instances on https://lemmy.ml/instances

Assume every one of those instances subscribes to !asklemmy.

Now, count the number of instances on https://lemmy.world/instances

Assume, every one of those instances subscribes to !lemmyworld.

Now, count the number of instances on https://beehaw.org/instances

Assume, every one of those instances subscribes to !technology.

It does. not. scale.

[–] King@vlemmy.net 9 points 1 year ago (1 children)

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

[–] xtremeownage@lemmyonline.com 2 points 1 year ago (1 children)

I am onboard with you there-

But, would not not agree- delegating and offloading those federation actions to a dedicated pool of servers, would not assist scalability?

That way- each instance doesn't need to maintain all of the connections?

[–] King@vlemmy.net 5 points 1 year ago (1 children)

There is no need to "maintain all of the connections". The server opens a connection, sends the data, then closes the connection.

[–] xtremeownage@lemmyonline.com 1 points 1 year ago (2 children)

I realize that....

Let's- set the record straight here.

Do you think the current implementation of federation works well?

[–] Fauxreigner@beehaw.org 6 points 1 year ago (2 children)

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.

[–] xtremeownage@lemmyonline.com 1 points 1 year ago* (last edited 1 year ago) (1 children)

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)

[–] Fauxreigner@beehaw.org 2 points 1 year ago (1 children)

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.

[–] xtremeownage@lemmyonline.com 1 points 1 year ago (1 children)

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.

With the pub/sub method- that should be able to be minimized.

At least, with my experience of messing with rabbitmq- A message stays in the queue, until I have told rabbitMQ, Hey, I have processed this message.

If I accept a message, an encounter an exception mid-way through, that message returns back to the queue, until It has been processed, or dead-letter logic handles it.

Granted, there is a hard-coded timeout somewhere in lemmy, where, older messages cannot be processed. That would need to be adjusted.

[–] Fauxreigner@beehaw.org 1 points 1 year ago (1 children)

If you ensure that all messages are queued until processed, with retries on failure, what's the point of the hub model? As pointed out elsewhere, the large instances would be acting as hubs already.

[–] xtremeownage@lemmyonline.com 1 points 1 year ago (1 children)

Just removing that load from the main instance server, allowing it to just handle serving its local user-base.

In short- splitting the load into multiple components, rather than everything being handled by just the single instance server.

[–] Fauxreigner@beehaw.org 0 points 1 year ago (1 children)

I'm just not seeing a benefit here, I think this is a solution to the wrong problem. Your proposal in theory cuts outbound updates from the big hubs, but in reality they're only updating a subset of other instances for any given update, and it doesn't do anything to help with inbound updates. And to do that, you have to solve a pretty tricky problem.

If my instance gets an update from Beehaw, I can validate that they're allowed to do so, because Beehaw has a TLS certificate that says "Yep, this is actually Beehaw." If you introduce a hub system, I need some way to determine that the hub system that's telling me "Beehaw has an update for you" is allowed to send updates on behalf of Beehaw.

[–] xtremeownage@lemmyonline.com 1 points 1 year ago

To clarify-

After feedback/comments, I have modified the idea- this would be a optional local proxy/hub/delegation server/service, hosted by the instance owners.

https://github.com/LemmyNet/lemmy/issues/3245#issuecomment-1601585922

Ie- you can optionally scale your federation updates, independent of your main application server.

[–] cyd@vlemmy.net 1 points 1 year ago

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.

[–] King@vlemmy.net 0 points 1 year ago (1 children)

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.

[–] xtremeownage@lemmyonline.com 0 points 1 year ago (1 children)

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?

[–] King@vlemmy.net 1 points 1 year ago

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.

load more comments (19 replies)
load more comments (19 replies)
load more comments (19 replies)