这是我参与更文挑战的第27天,活动详情查看: 更文挑战
为什么要使用消息中间件?
MQ最大的优点就是解耦和削峰。
解耦:主要解决系统间的耦合问题,比如现在有系统ABC,A产生的userid需要传给B(短信系统),此时需要通过在B系统增加接口来解决,此时系统C也需要这个userid,又要增加接口,系统之间耦合度较高,不能各自分离,通过消息消费的机制,将userid放到消息信息中,其他系统作为消费方,这样就可以满足系统之间互不依赖了。
削峰:主要解决高并发百万级请求将服务器打崩
比如某热点请求时刻,请求数量达到高峰值,如果是通过接口直接请求都会落到服务器上,压力要爆增,扛不住就挂了。通过消息队列,会先将请求放到队列中,每次拿出2000来处理,这样服务器就不会被打崩。
异步:和解耦的结果很相似,异步就是各个上下游系统之间可以管自己的逻辑处理,不需要等待其他系统的结果返回。比如系统ABC,A需要将userid传给B,只要发送一个消息出去,就可以返回结果告诉用户成功了,系统B则消费消息获取userid处理自己的逻辑,A不需要等待B处理完了再反馈给用户,这样既能快速响应,也可以减少请求耗时。
但MQ也有缺点,比如一致性问题,刚才说了A将userid给了B以后,A返回用户成功,系统B却写入失败了,就和A的结果不一致怎么办。
rocketmq
RocketMQ出自阿里公司的开源产品。尤其适合在互联网电商行业使用,广泛应用于订单、交易、充值等业务,对高并发请求时的流量削峰有非常大的作用。
优点:
单机吞吐量:十万级
可用性:非常高,分布式架构
消息可靠性:经过参数优化配置,消息可以做到0丢失。
kafka
超高性能,拥有百万级TPS的吞吐量,是大数据领域的宠儿,在数据采集、传输、存储的过程中发挥着举足轻重的作用,并被广泛应用于大数据领域的消息传输。
时效性:ms级
可用性:非常高,kafka是分布式的,一个数据多个副本,少数机器宕机,不会丢失数据,不会导致不可用
消息有序消费,能保证所有消息一定被消费且只会消费一次。
rabbitmq
也是当前主流消息中间件之一,是实现了高级消息队列协议(AMQP)的开源框架。
支持多种API、多种语言,易用性强,并融合了多种集群构建模式,是很多中小企业的首选。
吞吐量到万级,MQ功能比较完备。
性能较好,高并发。
上面提到消息消费是有序的,如何保证消息的顺序性?
1、通过某种算法,将需要保持先后顺序的消息放到同⼀个消息队列中(kafka中就是partition,rabbitMq中就是queue)。然后只⽤⼀个消费者去消费该队列。
2、可以在消息体内添加全局有序标识来实现。
像消息中间件一般现在很多公司都会用到,如果有使用经验的话一定对进大厂更有帮助。
rocketMQ实践
rocket-mq-config.xml
<!--test-->
<bean id="testProcessor"
class="com.test.processor.testProcessor">
<property name="testmqConfig">
<list>
<bean class="com.test.dto.MqConfigDTO">
<property name="topic" value="testTopic"/>
<property name="tag" value="testTag"/>
<property name="className"
value="com.test.producer.TestDTO"/>
</bean>
</list>
</property>
</bean>
<!--注入RocketMQ生产者-->
<bean id="DemoProducer" class="com.test.producer.DemoProducer" init-method="tin"
<property name="groupId" value="testGroupID"/>
<property name="env" value="dev"/>
<property name="acsKey" value="xxxxx"/>
<property name="srtKey" value="xxxxx"/>
<property name="Addr" value="xxxx"/>
</bean>