目录
一、MQ介绍
1、什么是MQ
MQ(Message Queue)消息队列,是基础数据结构中“先进先出”的一种数据结构。指把要传输的数据(消息)放在队列中,用队列机制来实现消息传递——生产者产生消息并把消息放入队列,然后由消费者去处理。消费者可以到指定队列拉取消息,或者订阅相应的队列,由MQ服务端给其推送消息。
2、为什么要用MQ
1)解耦:系统的耦合性越高,容错性就越低,以电商系统为例,用户创建订单后,如果耦合调用库存系统,物流系统,支付系统,任何一个子系统出现故障或者因为升级原因导致暂时不能使用,都会造成操作异常,影响用户使用体验。 使用消息队列解耦合,系统的耦合性就会降低了,如图所示,订单系统将消息发送到mq,支付、库存、物流系统到mq消费消息,这样比如当物流系统发生故障,需要几分钟才能修复的时候,在这段时间内,物流系统要处理的数据被缓存到消息队列中,用户的下单操作正常完成,当物流系统恢复后,补充处理存在消息队列中的订单消息即可,终端系统感知不到物流系统发生过几分钟故障。
2)异步 场景:A系统接受一个请求,需要在本地写库,还需要调用B,C,D三个系统写库,这样总调用时间就会很长,用户体验非常不好 如果使用MQ,那么A系统连续发送三条消息到MQ队列中,其他系统根据自身需要去MQ消费消息,A系统从接受一个请求到返回响应给用户总时长就会短很多,大大提高了用户体验
3)流量削峰 场景:应用系统如果遇到系统请求流量的瞬间猛增,有可能会将系统压垮 有了消息队列可以将大量请求缓存起来,分散到较长一段时间处理,这样可以大大提高系统稳定性和用户体验 一般情况,为了保证系统的稳定性,如果系统负载超过阈值,就会阻止用户请求,这会影响用户体验,而如果使用消息队列将用户请求缓存起来,等待系统处理完毕后通知用户,用户体验更好。
3、各种消息队列产品比较
ActiveMQ:早期是使用的比较多,没有经过高吞吐量场景验证,社区也不活跃 RabbitMQ:稳定性高,erlang语言开发,不考虑二次开发可以考虑 RocketMQ:java语言开发,经过高吞吐量验证,便于二次开发 kafka:大数据领域日志采集等业务推荐使用
二、RocketMQ概念和优势
1、先来了解几个概念
Topic:官方定义是生产者在发送消息和消费者在拉取消息的类别。 Topic在Google翻译中解释为话题。我们可以理解为第一级消息类型,类比于书的标题。在应用系统中,一个Topic标识为一类消息类型。Topic与生产者和消费者之间的关系非常松散。具体来说,一个Topic可能有0个,一个或多个生产者向它发送消息;相反,一个生产者可以发送不同类型Topic的消息。类似的,消费者组可以订阅一个或多个Topic,只要该组的实例保持其订阅一致即可。
Message queue:一个Topic有若干个Queue。若Topic同时创建在不同的Broker,则不同的broker上都有若干Queue,消息将物理地存储落在不同Broker结点上。
Tag:标签,为用户提供了额外的灵活性。来自同一业务模块的具有不同目的的消息可以具有相同的topic和不同的tag。标签有助于保持代码的清晰和连贯,同时标签也方便RocketMQ提供查询功能。
Producer Group: 一类Producer的集合名称,这类Producer通常发送一类消息,且发送逻辑一致。
Consumer Group:一类Consumer的集合名称,这类Consumer通常消费一类消息,且消费逻辑一致,可以实现消息消费的负载均衡