In looking at what tech to use for a message bus, we looked a lot at what we were doing at Instructure and found that we had a variety of different messaging technologies with a variety of different messaging semantics.
Canvas has common use cases where SQS can be used to do a basic "work queue", and every message gets parsed by one consumer.
Sometimes we use SNS on top of that when events are still fairly ephemeral but are sent to multiple consumers. It is a really nice pattern for de-coupling applications.
However, we have other use cases where events may need to be "replayed" or retained for longer periods of time which get serviced by something like Kinesis or Kafka.
Apache Pulsar offers a way of handling all these use cases. It is a "unified" messaging platform, that builds a pub/sub system on top of a log data structure, and also is architected to make storing and retaining messages much easier than other systems (such as Kinesis/Kafka)
Although the docs aren't perfect, the [overview and concepts](https://pulsar.apache.org/docs/en/concepts-overview/) are
really good for building a mental model of how pulsar is intended to be used.
## How To Pulsar?
Canvas uses the [pulsar-client](https://github.com/instructure/pulsar-client-ruby) ruby gem, which is now
a dependency of this application, for interfacing with Pulsar.