Things that MT adds on top of just using RabbitMQ:
- Optimized, asynchronous multithreaded, concurrent consumers
- Message serialization, with support for interfaces, classes, and records, including guidance on versioning message contracts
- Automatic exchange bindings, publish conventions
- Saga state machines, including persistent state via Entity Framework Core, MongoDB, Redis, etc.
- Built-in metrics, Open Telemetry, Prometheus
- Message headers
- Fault handling, message retry, message redelivery
Those are just a few, some more significant than others. The fact that the bus hosts your consumers, handlers, sagas, and manages all of the threading is probably the biggest advantage, and the fact that you can host multiple buses in the same process.
Serialization is the next biggest benefit, since that can be painful to figure out, and getting an interface-based message contract with automatic deserialized into types (including dynamically-backed interface types) is huge. Publishing a single class that implements multiple interfaces, and seeing all interested consumers pick up their piece of the message asynchronously is just awesome in production as new interfaces can be added to producers and down-level consumers are unaffected.
Those are a few, you can check out the documentation for more information, or give the really old .NET Rocks! podcast a listen for some related content by yours truly.
UPDATE: There is an entire series on YouTube covering MassTransit now.