Inter-Canister Message Reliability

How reliable are sending messages between canisters. If canister 1 (C1) sends a message to C2, is it guaranteed to make it to C2. Is there something in the protocol to retry/make sure that a message will EVENTUALLY get to C2?
Also if the C2 method that is called has no return value, will C1 do a fire and forget or internally is there a ‘message received by C2’ confirmation that gets returned to C1?

Inter-canister calls do not have a delivery guarantee, maybe C2 was removed or upgraded to remove the specific method before the invocation message arrived.
But inter-canister calls do have a response guarantee, so eventually a response to the inter-canister call will make it to C2. The response may be a reply/reject from the invoked canister, or it may be a system-generated rejection. And there is no fire-and-forget, all inter-canister calls expect an answer.

5 Likes

And there is no fire-and-forget, all inter-canister calls expect an answer.

I think if you use ignore Canister.someAsyncFunction() then that is a “fire-and-forget”. On the system level, I suppose the IC still provides a response to the call, but the caller canister doesn’t wait for it.

1 Like