为什么要使用消息队列?

前言

1. 使用同步的通信方式来解决多个服务之间的通信

结论:同步的通信方式会存在性能和稳定性的问题

2. 使用异步的通信方式

  • 对于上游来说,只要成功发送消息,就意味着订单就创建成功了
  • 对于下游来说,已经是异步执行了,就无需实时,下游拿到消息,逐一去消费即可

结论:针对于同步的通信方式来说,异步的方式,可以让上游快速成功,极大提高了系统的吞吐量。而且在分布式系统中,通过下游多个服务的分布式事务的保障,也能保障业务执行之后的最终一致性。

消息队列的流派

消息队列解决的具体问题—通信问题

什么是MQ ?

Message Queue(MQ),消息队列中间件。很多人都说:MQ通过将消息的发送和接收分离来实现应用程序的异步和解耦,这个给人的直觉是——MQ是异步的,用来解耦的,但这只是MQ的效果而不是目的。

MQ真正的目的是为了通讯,屏蔽底层复杂的通讯协议定义一套应用层的、更简单的通讯协议。一个分布式系统中两个模块之间通讯要么是HTTP,要么是自己开发的(rpc)TCP,但这两种协议其实都是原始的协议。HTTP协议很难实现两端通讯——模块A可以调用B,B也可以主动调用A,如果要做到这两端都要背上WebServer,而且还不支持长连接(HTTP2.0的库根本找不到)。TCP就更加原始了,粘包、心跳、私有的协议。MQ所要做的就是在这些协议之上构建一个简单的“协议”——生产者/消费者模型。MQ带给我的“协议”不是具体的通讯协议,而是更高层次通讯模型。它定义了两个对象——发送数据的叫生产者;接收数据的叫消费者,提供一个SDK让我们可以定义自己的生产者和消费者实现消息通讯而无视底层通讯协议。

目前消息队列的中间件选型有很多种

  • rabbitMQ:内部的可玩性(功能性)是非常强的 。
  • rocketMQ:阿里内部一个大神,根据kafka的内部执行原理,手写的一个消息队列中间件,性能上与kafka相比肩,除此之外,在功能上封装了更多的功能 。
  • kafka:全球消息处理性能最快的一款MQ。
  • zeroMQ

这些消息队列中间件有什么区别?

一、有Broker的MQ

这个流派通常由一台服务器作为Broker,所有的消息都通过它中转。生产者把消息发送给它就结束自己的任务了,Broker则把消息主动推送给消费者(或者消费者主动轮询)

重Topic

整个broker,依据topic来进行消息的中转。在重topic的消息队列里必然需要topic的存在

——代表:Kafka、RocketMQ、ActiveMQ

kafka、JMS(ActiveMQ)就属于这个流派,生产者会发送key和数据到Broker,由Broker比较key之后决定给哪个消费者。这种模式是我们最常见的模式,是我们对MQ最多的印象。在这种模式下一个topic往往是一个比较大的概念,甚至一个系统中就可能只有一个topic,topic某种意义上就是queue,生产者发送key相当于说:“hi,把数据放到key的队列中”。

由上图所示,Broker定义了三个队列,key1,key2,key3,生产者发送数据的时候会发送key1和data,Broker在推送数据的时候则推送data(也可能把key带上)

虽架构一样,但kafka的性能要比jms的性能不知道高到多少倍,所以基本这种类型的MQ只有kafka一种备选方案。如果你需要一条暴力的数据流(在乎性能而非灵活性)那么kafka是最好的选择

轻Topic

topic只是一种中转模式。

——代表:RabbitMQ

这种的代表是RabbitMQ(或者说是AMQP)。生产者发送key和数据,消费者定义订阅的队列,Broker收到数据之后会通过一定的逻辑计算出key对应的队列,然后把数据交给队列。

这种模式下解耦了key和queue,在这种架构中queue是非常轻量级的(在RabbitMQ中它的上限取决于你的内存),消费者关心的只是自己的queue,生产者不必关系数据最终给谁,只要指定key就行了,中间的那层映射在AMQP中叫exchange(交换机)

AMQP 中有四种 Exchange(交换机)

  • Direct exchange:key就等于queue
  • Fanout exchange:无视key,给所有的queue都来一份
  • Topic exchange:key可以用“宽字符”模糊匹配queue
  • Headers exchange:无视key,通过查看消息的头部元数据来决定发给哪个queue(AMQP头部元数据非常丰富而且可以自定义)

这种结构的架构给通讯带来了很大的灵活性我们能想到的通讯方式都可以用这四种exchange表达出来。如果你需要一个企业数据总线(在乎灵活性)那么RabbitMQ绝对的值得一用

二、无Broker的MQ

在生产者和消费者之间没有使用broker,例如ZeroMQ,之间使用socket进行通信。

——代表:ZeroMQ

ZeroMQ的作者非常睿智,他敏锐的意识到——MQ是更高级的Socket,它是解决通讯问题的。故ZeroMQ被设计了一个“库”而不是一个中间件,这种实现也可以达到——没有Broker的目的。

节点之间通讯的消息都是发送到彼此的队列中,每个节点都既是生产者又是消费者。ZeroMQ做的事情就是封装出一套类似于Socket的API可以完成发送数据,读取数据

ZeroMQ其实就是一个跨语言的、重量级的Actor模型邮箱库。你可以把自己的程序想象成一个Actor,ZeroMQ就是提供邮箱功能的库;ZeroMQ可以实现同一台机器的RPC同学也可以实现不同机器的TCP、UDP同学,如果你需要一个强大的、灵魂、野蛮的通讯能力,别犹豫ZeroMQ

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值