Amazing blog post! Been reading the ActivityPub spec and found it rather lacking. It’s only when you add WebFinger and signed messages that things start to make sense.
And a followup question: wouldn’t it be more efficient for big instances to use WebSockets to federate? Making a HTTP request for every action your users take seems unnecessarily wasteful.
Yeah it’s definitely very busy in terms of the amount of requests that’s get made. I’m not handling a bunch of them that I don’t need but there’s shitloads all the time.
I think that would only work when the number of instances is small. Two solutions to this might be:
- have instances act like relays where the home instance of a community notifies 10 instances and then each of those instances notifies 10 instances, etc.
- batch updates on a timer such that once a minute all posts, comments, boosts, etc within a minutes are buffered and sent together.
I looked at how many WebSocket connections a single server could keep open, and it seems quite high: https://unetworkingab.medium.com/millions-of-active-websockets-with-node-js-7dc575746a01
That being said, I do agree with you that it’s inefficient to open a connection to every other instance.
About your proposals:
- I don’t think your first solution is feasible. How would an instance know which other 10 instances to notify?
- I do like your idea of batching operations together! Would definitely cut back on the amount of HTTP calls and signature validations. Perhaps this can even be extended further: right now every user interaction is signed before its been sent to other instances. Would be interesting if the instance itself also has a public/private key and that it can sign a whole batch at once (rather then signing every single user interaction).