IRATI / stack

RINA implementation for OS/Linux
http://irati.github.io/stack
73 stars 39 forks source link

Enhance app name matching for flow requests to allow wild card matching. #1355

Open TRIA opened 3 years ago

TRIA commented 3 years ago

In our usage of the stack, we have a distributed application DFD where each application instance registers, and a client application wants to reach DFD by connecting to the name of the application, not to a specific instance, since any instance is acceptable. The current implementation of registering names in the RIB allows only one application to register with a specific name, the last one to register claims the name. So an application attempting to connect to any available instance can only find one, and if that one has gone away, likely none of the instances.

In RINA theory, this issue could be resolved by associating the application name (sans instance names) with a routing address with a rule of "any", and registering an instance would also register it as a member of the "any" set for that app. Then any attempt to create a flow to the application name could result in the request being sent to any member of the set. (This would also work, though differently, with an "all" rule or one that picks the closest, least-loaded, or whatever rule makes sense.)

A simpler approach for IRATI is to simply have all instances register with their complete name, including instance, and for the flow request to allow a "wildcard" in the instance field to match any instance. The rule is implicitly "pick one random registered instance", which is a tiny subset of the capability of the full RINA model. But this is sufficient to handle failover, initial enrollment of an IPCP, and many other tasks without the difficulty of implementing the full RINA routing model. It's not clear whether it makes sense to extend this to include the application name and AE. You could consider this as already being implicitly done in the case of AE name and AE instance, or another way to look at it is that a null name or instance name is allowed, and that like any other name is unique among all instances in that scope.

There are two obvious possible syntaxes: One is to treat the omission of a field in a flow request as a wild card, so that a flow request to a name like APP::register: is an attempt to reach any instance of the "register" AE of any instance of the application APP. Another approach is to adopt a syntax to indicate the wild card, for example APP:*:register:* would mean that. Either syntax requires (for consistency with RINA naming convention) that whatever wild-card indicator is used, either the null string or a symbol like asterisk, can no longer be used as a name. Either would work, though the need for consistency to specify :* for AE instance on any flow request is clunky, so a null field is probably a more intuitive choice. Or you could allow either, for convenience and for making the wild-card in the request more obvious.