消息队列
什么是消息队列
消息队列(Message Queue)是一种进程间通信或者同一进程的不同线程间的通信方式。
消息:就是要传输的数据。
队列:是一种先进先出的数据结构,用来存放消息。
消息队列的模型如下:
生产者:产生数据的单位
消费者:消费数据的单位
消息队列的两种模式
点对点队列模型
它允许多个生产者往同一队列发送消息,但是多个消费者是竞争关系,一条消息只能被其中一个消费者收到处理,而后删除。
发布订阅模型
队列模型无法给每个消费者一份消息,并且如果为每个消费者创建一个全量消息队列,会将每份数据都复制多份,将会浪费大量的空间。
此时存放消息的容器变成了主题,订阅者需要先订阅主题才能收到主题的全量消息。如果只有一个订阅者的话,也就是队列模型了
RPC通信模型和消息队列通信模型
RPC(远程过程调用):一种通过网络从远程计算机上请求服务,而不需要了解底层网络技术的协议。
引入MQ以后,由一次RPC变成了两次,生产者只和队列耦合,无需知道消费者的存在。
多了队列进行消息转储,相当于同步变异步。
什么时候需要消息队列
常见消息中间件
-
RocketMQ 使用Java编写,改造方便,是阿里的开源消息中间件,吞吐量高每秒十万+,保证高可用高性能,保证数据绝对不丢失,支持大规模的集群部署,线性扩展方便,支持各种高级功能,消息回溯、延迟消息等。 -
RabbitMQ 使用Erlang编写。RabbitMQ保证数据不丢失,保证了高可用,即使部分机器宕机了还可以继续使用,它是在高级消息队列协议基础上完成的,支持较多的高级功能,如消息重试,死信队列等。但是它的吞吐量较低,大概就是每秒几万的样子,这样对于大型电商秒杀是不能胜任的,集群线性扩展比较麻烦,而且使用Erlang开发,对其改造比较困难。 -
Kafka 使用Scala编写,主要应用在大数据领域,为大数据而生的消息中间件,主要是大数据的数据传输,日志和监控数据收集,最大的优势就是高吞吐量。性能较高,发送消息都是毫秒级。另外Kafka支持集群部署。但是它收到消息不是直接写到物理磁盘的而是先写入到磁盘缓冲区,可能会造成数据丢失。另外,功能比较单一,主要就是收发消息。
参考:Lowry的回答https://www.zhihu.com/question/54152397/answer/1802083263
|