DDS appears to have support for asynchronous RPC which integrates with the modern C++ future and async infrastructure.
It could be a candidate for actions, but it would mean that the implementation would be tied to DDS.
@gbiggs: what is the intent here? Should actions be available to all RMWs, or would relying on DDS-specific infrastructure be acceptable?