Open afrind opened 1 month ago
My thought was to resolve this with a new message, JOIN, which is decomposed into a FETCH+SUBSCRIBE at a publisher with sufficient local knowledge to do so.
I'll make slides for Dublin
I'm not arguing for a specific approach, but people did not like removing current group in the past, ie: https://github.com/moq-wg/moq-transport/pull/510#pullrequestreview-2260597641
A large number of datagrams is a congestion issue, but not a flow control one. For congestion, I'd expect the relay could lower the subscriber priority once it had too much data for a subscription?
If there's only one peep in a group, then starting at the current group doesn't create any problems. If the peeps were all going to be open at once anyway (ie: 3 or 4 enhancement layers), then the stream usage is no different than starting at the current object. As the number of peeps increases, it does start being problematic. If you're doing one Object per peep, for example.
I'd rather not add a 3rd way to retrieve Objects, but I can see an argument for merging the existing functionality of FETCH and SUBSCRIBE and saying:
If we want to use track alias, I think we still need to prohibit having two "JOINs" that end beyond the current object? Alternatively, we could just say that you'll only receive one copy of things after the current object, even if there are multiple matching JOINs/SUBSCRIBEs/etc?
The problem here is that since the groups are arbitrarily large, asking to subscribe starting with object 0 of the current group is not that different from starting at arbitrary group in the past.
To illustrate the problem as I see it, which is similar to Victor's statement above
I distinguish the present to the past and the future. The present is the current group, as seen by the Relay, i.e. the latest object it got from its parent. Let's call it current_ID (in Will's figure, current_ID = 2). Any object with a group ID lesser than current_ID is in the past. They should be obtained by FETCH. Any object with a group ID greater than current_ID is in the future. They typically trigger an error if referenced in a FETCH. The objects with a group ID equal current_ID are the present.
In the present, the Relay has a normative behavior: The Relay sends objects in the current group in the order of the subgroups to each subscriber. Those with a high network connection will be at the latest object, while some subscribers with a much lower connection will be late. In Will's schema, it means that some subscribers are still downloading 2-0 while some others are at 2-1. If we extend it, it means that the Relay must store the ID of the latest sent object within the group for all subscribers. When a new subscriber joins, it is at object 0 while all others will be somewhere between 0 and X (the latest object). It is not a problem, it is the normal behavior.
Yet, I'd see a problem with ascending order in SUBSCRIBE. The subscribers with a slow network will cumulate drift and will eventually be far in the past, at the point that the Relay serves some subscribers in the present (2-1 and 2-0 in Will's schema) and some late subscribers in the past (1-X).
The subscribers with a slow network will cumulate drift
One of the principles the group seemed to agree on is that FETCH is for the past and SUBSCRIBE is for the future. Draft-07 however left in SUBSCRIBE(current group) which spans both and seems to violate the principle. I understand that subscribing starting from the current group is likely to be a very common use case, as groups are MOQT join points.
My concern is that all the reasons we decided FETCH semantics were good for past data are being discarded here. If the current group consists of an large number of subgroups or datagrams, the sender can overwhelm the receiver. If the relay has a cache with gaps, we have not explained the interaction.
My strawman is to respond to SUBSCRIBE(current group) with both a FETCH OK and SUBSCRIBE OK, and objects from (current group, 0) to (current group, live edge) are returned in a FETCH stream using those semantics.