Message passing - too hard for application programmers?

Message passing is the way most internal (incestuous) distributed programs like distributed routing and clock synchronisation algorithms are built. Because the consequences of sending a message are many (it may get there or not, and out of order w.r.t any other messages from or to any other places etc. etr), the programmer is then completely responsible for any eventualities - is this too much to ask?