Sure, I will try my best to describe what is a problem I am trying to solve. I want to build a game in which a player does not get blocked every time when there is a client to server interaction. Say, I want to upgrade my sword and then equip it. I click a button that says “upgrade” and a moment later a nasty spinner appears on the screen effectively blocking an entire screen. So I wait until this spinner gets away and only after that will I be able to click “equip”.
I want to move away from this behavior, giving my players an ability to execute next command even if the previous one is still processed by the server. No spinners, no problems in this case. But this mechanics requires some mechanism that retains the order in which commands get executed, right?
Regarding your client.rpc vs socket.rpc question - it was posted as an answer here Socket.RpcAsync vs. Client.RpcAsync